Release note
Backtests run on daily prices again, and timing strategies now move to cash
If you ran a moving-average crossover, RSI or breakout backtest before 26 September, please run it again: the old result was wrong. Two separate problems made these strategies look almost exactly like buying and holding. Old cached results are not reused, so a new run gives you a fresh result.
Daily prices. When we rebuilt the server, our price loader asked the data provider for full daily history, and the provider quietly sent monthly or quarterly bars instead. A "50-day moving average" was really being worked out on months. The loader now asks for daily bars explicitly, refuses to store anything that isn't daily, and flags any symbol whose stored prices aren't daily. Backtests now run on daily bars, and prices are topped up automatically every weekday evening.
Timing strategies can sell. The engine had a rule meant for ranking strategies: if no stock scored positively, it spread the money equally across all of them rather than holding cash. Applied to a single-stock timing strategy, that meant a sell signal put all the money straight back in, so the strategy could never exit. On top of that, a decision to hold nothing didn't actually sell the position you already had. Moving-average crossover, RSI and breakout strategies now go to cash on an exit signal and buy back in on the next entry signal. While you're in cash, the backtest earns the risk-free rate.
Indicators get their warm-up history. A 200-day moving average needs 200 days of prices before it means anything, but the engine started counting on the first day of your test, so long indicators were undefined for the first months. It now loads extra history before your start date to warm indicators up. Every number you see (returns, drawdown, trades and the equity curve) still covers only the dates you asked for. If there isn't enough earlier history, the result card says how many days were missing and from which date the signal was valid, instead of quietly filling the gap.
A real buy-and-hold benchmark. The benchmark was meant to be an equal-weight buy-and-hold of your universe, but underneath it was running a momentum rule that held only the stronger names and left the rest in cash. It now buys every symbol in equal weight on the first day and holds. For quants: this changes alpha, beta and information ratio for multi-stock strategies.
Momentum lookback. When you ask for, say, the stocks with the best 6-month return, the ranking now uses 6 months. Before, it always ranked on 12 months. Lookbacks from 1 to 24 months are supported.
What the fix looks like. We checked the engine against an independent reference calculation on real SPY daily prices: a 50/200-day golden cross from October 2021 to September 2026. The old engine never sold. It returned a CAGR of 12.07% with a 25.4% maximum drawdown, next to 12.11% and the same 25.4% drawdown for simply holding SPY. The fixed engine exits in March 2022, buys back in February 2023, exits again in April 2025 and re-enters in July 2025, for a CAGR of 10.12% and a maximum drawdown of 19.0%. That matches the reference calculation run with the same trading costs and cash rate. The parameter sensitivity check, which used to report the identical Sharpe ratio for every fast moving average from 40 to 60 days, now shows them differing, as they should.
Update, 29 September 2026: the benchmark paragraph above described what the benchmark was meant to do, not what ran. Until 28 September the default equal-weight benchmark was rebalanced back to equal weights every month. It is now bought once and held (see Our buy-and-hold benchmark was rebalanced every month. It is now bought once and held).