How it works.
One engine runs every strategy in the model portfolio by fixed rules, and nine tests stand between an idea and the portfolio. Here is each in full: one trade as the engine logged it, then the tests as formulas.
The engine, trade by trade
One engine runs every strategy in the model portfolio. Here is one backtest trade, as the engine logged it and as it looked on its chart.
- 14 Feb 00:00bar4-hour bar closed # the strategy reads its own chart
- 14 Feb 00:01signallong # model portfolio, dial 1.0×
- 14 Feb 00:01sizeon model equity, inside the risk budget
- 14 Feb 00:01orderentry MARKET filled # model account
- 14 Feb 00:01orderstop STOP working # placed on fill
- 14 Feb 00:01ordertarget LIMIT working # placed on fill
- 14 Feb 00:01ledgerposition open matches model account
- 17 Feb 02:36filltarget LIMIT filled # target reached
- 17 Feb 02:36orderstop cancelled # one-cancels-other
- 17 Feb 02:36ledgerflat matches model account
The path of every trade
Nine tests before a strategy joins
We publish how each strategy is tested, not just that it passed. A strategy is judged on years it never saw, and its result is marked down for every version tried before it.
[Salvatore to confirm: all nine in force for every strategy in the portfolio]
0Confidence grows with time
Signal over noise, measured over longer: the same edge over more time, or over more independent trades, is harder to explain by luck.
1The entry is tested alone
Before any exit exists: N bars after each signal, how far did price go our way against how far it went against us?
2Judged on years it never saw
Built on the first window, then judged on K later windows it never touched: return out of sample as a share of return in sample.
3It has to work on related markets
A rule with no edge seldom passes on several markets at once. Related markets move together, so the true chance of passing by luck is higher than the formula gives: the formula is a lower bound, and the test is read with that in mind.
4Small changes to its settings
a peaka plateauEvery setting nudged up and down. Nearby settings should score almost as well: a plateau, not a peak.
5Thousands of unlucky versions of its past
Trades reshuffled and a share removed at random, across thousands of runs (b). We plan around the bad tail of that spread, not the backtest.
6Thousands tried, luck priced in
N tried1001,0002,000DSR99.7%97.2%95.6%The result must beat the best that N tries with no edge would show, skew and fat tails included. Bailey and López de Prado (2014).
7The bad tail, measured directly
The average of the worst 5 of 101 months, not a single number at a cut-off. A positive skew: the largest months were gains.
8Not the same bet twice
It joins only if its Sharpe ratio beats its correlation with the portfolio times the portfolio’s own. It must add edge, not repeat a bet.
9Sized to its worst case, then sized together
Each strategy gets the largest size f whose 95th-percentile drawdown stays inside a fixed budget B. Then the whole portfolio is tested the same way, all strategies at once.
About 1 in 200 candidates passed every test
Each dot is one candidate. Sample pipeline run, not a count of anything live.The pass marks are fixed in writing before a strategy is tested. [Salvatore to confirm: publish the pass marks]
Questions about the engine
Anything else: ask on the introduction call.
Why these markets?
Forex, stock and futures markets are deep and trade most of the day, and going short is as easy as going long. Futures are cleared by an exchange: the same contract for everyone.
What if the engine fails mid-trade?
It saves its state, so a restart picks the model portfolio’s open positions back up. Anything it cannot reconcile stops new trades from being published and alerts our team.