Algorithmise your trades with one click.
“Go long when the 50-day moving average crosses above the 200-day. Exit on a 5% trailing stop.”
compiled
entry ma(50) crosses_above ma(200)
exit trailing_stop 5%
sizing full_equity
universe provided_symbols
validated
- lookahead: clear
- survivorship bias: universe must be point-in-time
- parameter drift: clear
suggested fix: use a point-in-time universe
Formul8 proposes this change to the spec. Applying it rewrites the spec, resolves the check and re-runs the sample backtest.
strategy.spec
sizing full_equityuniverse provided_symbolsuniverse point_in_time(provided_symbols)
backtested · sample · 2015–2024, daily
return
+9.4%/yr
sharpe
0.71
max drawdown
−22.3%
win rate
41%
trades
186
time in market
63%
The next step in the product is to deploy the strategy. Not available in this preview.
Example 1 of 3: MA crossover. compiled, one survivorship warning; sample backtest +9.4% per year, Sharpe 0.71, max drawdown −22.3%. Fixing the universe lowers the return to +8.1%.
sample output: illustrative, not a real backtest.
What Formul8 checks and what it backtests against
what it checks
- lookahead
- only data available at the decision bar is used
- survivorship
- delisted, acquired and renamed tickers are included
- execution
- next-bar fills, with modelled slippage and commission (at launch)
- overfitting
- flags single fixed thresholds and dense parameter grids
- regime
- out-of-sample results, reported by volatility regime at launch
- exits
- a missing exit rule blocks the run; nothing else can close a position
- risk
- a missing stop is flagged; size-uncapped specs are refused
what it backtests against
- universe
- US equities and ETFs at launch
- history
- 2005–present, daily bars
- prices
- split- and dividend-adjusted
- membership
- point-in-time; includes dead names
- fundamentals
- point-in-time, as-reported (at launch)
seen enough? one email.