Skip to content
Archive
← r/algotrading
1
100%
u/tanweer919 1 day ago Strategy

I backtested 100+ retail trading strategies (~700 versions) with real costs and dead companies included. Here is what survived

For the last few weeks I've been testing basically every strategy idea I came across with a custom backtesting engine built in Python with the help of Claude Opus 5.5. Chart patterns, SMC, insider buying, options flow, ML models, paper replications, AI reading news. Around 100+ ideas and ~700 versions in total. Long only, US stocks and ETFs, cash account. Most of it didn't survive. Writing this up because the reasons they died were more useful to me than the few that worked. **Setup (so you can tell me where im wrong)** - Signal on the close, fill at the next open. No same-bar fills - Costs 3-10 bp per side depending on the test, and every result rechecked at double costs - Every setup compared against random entries on the same stocks with the same holding period, stop and target - Split into a design period and an untouched period, plus walk-forward for anything with fitted parameters - Point-in-time universe, plus a separate check that includes delisted stocks **1. Dead companies change everything** My main portfolio is 50% SPY + 50% residual momentum stocks. Using only stocks listed today, it did 20.7%/yr vs SPY 15.3% (2015-2026). My main portfolio is 50% SPY + 50% residual momentum stocks. Using only stocks listed today, it did 20.7%/yr vs SPY 15.3% (2015-2026). With delisted stocks kept in, the same thing did 18.1% vs 13.8% from 2015 to mid 2026. And over 1999-2019 the edge shrank to 7.9% vs 6.3%, with a worse max drawdown (-59% vs -55%). So the edge is real-ish but a big chunk of the backtest was just the dead stocks missing. **2. Costs decide more than the signal** A ML ranking model (walk-forward, every year trained only on earlier years) had the top 20 beating the universe by 13.2%/yr before costs. At 2 bp per side 11.0%, at 5 bp 7.7%, at 10 bp 2.4%. Same predictions, the only thing that changed was the fee. Later a bigger version (129 features, gradient boosting) had a really strong out-of-sample IC (t 7.0) and still lost to plain momentum once turnover costs were in. **3. High win rate means almost nothing** Tested SMC (order block bounce, FVG, 50% mitigation) on the 4H chart, 477 stocks, 2023-2026. The win rate looked good. But random entries with the same stop and target got the same win rate. The setup was 3.8 to 16.5 bp per trade worse than random. The win rate comes from where you put the stop and target, not from the setup. Worst trade was -43%, the stock gapped down 22% overnight. Same story with the classic RSI(2) SPY rule: 69% winners over 10 years, +16.9% total vs +214.9% for just holding SPY. **4. Insider buying is too late for a normal person** Insider clusters (Form 4) look great in backtests that buy at the filing date. But 69% of filings are accepted after the close, and the stock has usually gapped up by the next open. Buying at the first price you can actually get: +21 bp vs the universe, t 0.7. Nothing. **5. AI reads the news right, still too slow** Gave an LLM 8-K filings published after its training cutoff so it couldnt cheat. It understood them fine. But by the first tradable price the move had already happened. Being correct about news is not the same as being early. **6. The open is expensive** exists at the opening auction. Limit orders to save the spread didn't help either. In one test ~20% of limit orders never filled, and the ones that didn't fill went on to make +1.95% on average. You save the spread on the losers and miss the winners. Net gain was about +1.4 bp, basically nothing. **7. A lot of the money is made overnight** 84% of my dip-buying edge over random entries happened between the close and the next open. And over 2023-2026 SPY from 10:30am to the close lost ~3.9% a year while SPY overall was up ~22% a year. Day-trading-only strategies are swimming against that. **8. Stop losses don't protect you from gaps** On small caps (4 strategy families), trades with stops still had worst trades of -59% to -91% because the stock gapped through the stop overnight. Stops on my momentum portfolio also lowered returns and didn't really reduce drawdowns. **9. Even the best thing I found isn't proven** Once you count how many things you tried, the bar goes way up. One of my best results, judged against ~320 tries, failed Bonferroni and had a deflated Sharpe probability of 0.086, so it could be luck. The main portfolio beats SPY with t 1.8, which is suggestive, not significant. So now it runs on a forward paper record and I don't trust any backtest number until that has months behind it. **What actually held up (small stuff)** - Buy-the-dip on SPY/QQQ in uptrends: SPY 1993-2026, 804 trades, ~70% winners, ~+0.25% a trade, worst -10.9%. Youre in cash most days so on its own its only 6-9% a year - A month-end SPY trade: 202 trades since 2002, 66% winners, ~+0.86% a trade, worst -8.1% - Residual momentum + SPY blend above, with all the caveats **Also dead:** chart pattern breakouts (231 instruments, none beat random), FVG / order blocks / S&R / candlesticks / MA crosses (1,441 stocks, ~2.4M signals, no |t| > 2.3), options flow as a stock signal (597 stocks), sector rotation, volume spikes (7 versions), earnings gap continuation, opening range breakouts, and 12 strategies from published papers. Most of the paper ones only worked with short selling, pre-2015 numbers or tiny stocks. Happy to share more detail on any of these. And if you think a test is wrong, tell me. I'd rather find the mistake now than with real money. What strategy do you trade that you think would survive this kind of testing?
16 comments held Reddit says 0 on reddit ↗
  1. u/A_random_otter 1 1 day ago
    I've been building a backtesting framework for almost a year, and getting plausible results is much easier than establishing that they're correct. A few weeks to build the engine and test everything from intraday setups to point-in-time insider filings is an enormous scope. How did you validate the engine itself? Any independently reproduced benchmarks or auditable examples? Also, you describe a point-in-time universe and then a separate check including delisted stocks. What exactly did the first universe contain?
  2. u/tanweer919 OP 1 1 day ago
    You're right that getting results is the easy part. And here is my validation strategy for the engine: every study got a second script that rebuilds it from scratch with separate code, and it had to match trade for trade. plus look-ahead tests where i cut the data at some date and check the signals before that date don't change, a planted fake signal to see if the engine finds it back at the right strength, and spot checks of fills against raw bars. the main portfolio i also rebuilt on QuantConnect with their delisted-stock data, that's the 18.1% vs 13.8% number. but to be clear, all of this was done by me (with AI). so treat it as "checked", not "proven". On the universe part, the first one is only point-in-time in the filters (liquidity and price use only data known at that date), but the stock list itself is stocks still listed today. so it has survivorship bias, and that's exactly why i ran the separate check with delisted stocks. the gap between the two is point 1 in the post. I keep everything on a paper forward record now instead of trusting the backtests.
  3. u/A_random_otter 2 1 day ago
    Fair answer, thanks. The separate implementations and QuantConnect replication address much of what I was concerned about, and thanks for clarifying the universe. I’m building a general-purpose framework, so I probably projected some of that scope onto your setup. I’ve also spent considerably more time building the thing than actually testing hypotheses with it 😂
  4. u/tanweer919 OP 1 1 day ago
    Fair enough.
  5. u/Cool_Big2955 1 1 day ago
    Honestly I barely backtest anymore. Maybe ran 2 or 3 serious tests in the last 10 months and just stuck with what worked. I see so many people here running hundreds of sims and tweaking parameters until it looks perfect on paper but I feel like thats just curve fitting. My approach was to build one solid logic (work zones + ATR trail) test it properly with delisted stocks and real costs and then just let it run. If it works live thats all that matters to me. Been running it for a bit now and the results are consistent enough that I dont feel the need to constantly chase new strategies. Sometimes less testing means you trust the system more instead of doubting every little dip. Curious if anyone else feels like they stopped backtesting once they found something that actually makes sense logically?
  6. u/tanweer919 OP 1 1 day ago
    I am doing backtesting of a wide range of strategies as quant research for the quant platform I am building.
  7. u/QuanTradin 1 1 day ago
    the drop from 20.7 to 18.1 just from keeping dead names in is the line everyone should read. and 7.9 vs 6.3 over 1999-2019 makes me think a good chunk of the rest was the 2015 tape, not the factor.
  8. u/tanweer919 OP 1 1 day ago
    yeah agree. SPY was also lower on the second data (15.3 vs 13.8), so the real drop vs SPY is more like 5.4 to 4.3. But you're probably right on the rest, 2015+ was just a great time for momentum. older years with 2000 and 2009 in them were much weaker. That's why I only paper trade it for now.
  9. u/[deleted] 1 1 day ago

    [removed] — already gone when the archive first saw it

  10. u/Sepp511 1 1 day ago
    Can you share the prameters of some of the strategies that performed the best?
  11. u/tanweer919 OP 1 1 day ago
    sure, these are mostly known rules. the 3 that held up: 1. SPY/QQQ dip buy \- only when close is above 200 day SMA \- buy next open if any of: RSI(2) under 10, 3 down closes in a row, or close in bottom 20% of the days range (IBS < 0.2) \- sell next open after first close above 5 day SMA, or after 10 days \- stop: close 8% below entry, sell next open SPY 1993-2026: 804 trades, \~70% winners, \~+0.25% a trade, worst -10.9% 2. month-end SPY vs TLT \- 4 trading days before month end, compare SPY and TLT return so far this month \- SPY behind by 2%+: buy SPY that close, sell last close of the month \- SPY ahead by 2%+: buy SPY last close of month, sell close of 3rd trading day next month \- else no trade (TLT is just the yardstick, never bought) 2002-2026: 202 trades, 66% winners, \~+0.86% a trade, worst -8.1% 3. 50% SPY + 50% residual momentum \- stocks with $100M+ avg daily volume and price $10+ \- score = last 12 months of daily returns not explained by SPY, skip latest month, divide by volatility \- top 30 equal weight, decide at month end close, rebalance next open with delisted stocks: 18.1%/yr vs SPY 13.8% (2015-mid 2026), but only 7.9% vs 6.3% in 1999-2019 the dip and month-end ones are small, you're in cash most days so they don't make much on their own
  12. u/bt8919 1 1 day ago
    One thing that stood out to me: If SPY would really always lose between 10:30am and to the close, then why aren't you just shorting the up moves? And in general I would recommend to focus on a few strategies, that look at least promising, and work on them instead of testing another 100 indicators. You won't find a magic indicator, which works easily with no further work to do. So take your most promising indicators and look how to combine them with other timeframes or indicators. There are no low hanging fruits in Trading unfortunately.
  13. u/tanweer919 OP 1 1 day ago
    It doesn't lose every day, its an average. \~3.9% a year is only \~1.5 bp a day, and the daily noise is way bigger than that. after spread and costs a daily short of that window doesn't really leave anything. also my account is long only cash, so shorting is out for me anyway. And agree on the second part. thats basically where i ended up, most of the 100 were to kill ideas fast. now i'm only working on the few that held up and running them on a paper record.
  14. u/Cool_Big2955 1 1 day ago
    Solid write-up. The transparency on survivorship bias and transaction costs is refreshing since too many people ignore the boring stuff that actually kills strategies. A few thoughts from my own experience building a Python swing-trading bot: Stops and Gaps: You are spot on. I used to rely on tight stops but realized they just guarantee execution at the worst possible price during overnight gaps. Now I use wide hard stops around -8% is enough only as a catastrophic backstop. The real protection comes from position sizing and avoiding low-liquidity names entirely. If you cannot trust the fill do not take the trade. win Rate vs Profit Factor.- I see so many traders chasing 90% win rates. My system sits around 77% but the edge is not in the percentage it is in the profit Factor. By using an ATR-based trail I let winners run significantly longer than losers stay open.-- A 40% win rate with a 3:1 reward-to-risk ratio will always beat a 70% win rate with capped gains. Are you tracking PF alongside your win rate? Breakouts vs Mean Reversion: It is no surprise chart pattern breakouts failed in your tests. In my backtesting Work Zone entries which means buying in the lower 30% of a recent range after a confirmed reversal signal have been far more robust. It seems like buying value within an uptrend is much safer than trying to catch the initial breakout which is often just noise. hehe Quick question on your Residual Momentum strategy.- Since it was one of the few things that held up how do you define residual? Are you stripping out just market beta or sector effects too? I am curious if this works better because it avoids the crowded trade problem of pure momentum factors Thanks for sharing the raw data. It is a good reminder that simple cost-aware logic often survives where complex models fail...
  15. u/tanweer919 OP 1 1 day ago
    yes, i track PF next to win rate, plus avg win/loss and worst trade. the SMC one for example had 60% winners but PF only 1.09, and random entries did about the same. residual: market beta only, no sector. each day stock return minus beta x SPY return, beta from a rolling 1 year regression vs SPY. then sum those residuals over the last 12 months skipping the latest month, divided by their volatility. top 30. on crowding, honestly i didn't test that directly. what i saw vs plain momentum: better sharpe in both halves and smaller worst drop (-43% vs -50%), but most of the extra return came from 2021-26, so i wouldn't claim much more than that.
  16. u/[deleted] 0 1 day ago

    [removed] — already gone when the archive first saw it