VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
ACADEMY / Backtesting and validation

Robustness testing: try to break a strategy before you trust it

Robustness testing changes things a real strategy should not care about and keeps only what survives. Passing one test proves little: the same NQ breakout rule that was profitable in all nine parameter neighbours lost money on 12 of 17 markets, so the decision has to combine several tests with pass lines fixed in advance.

By · Published · updated · Editorial policy

Contents
  1. What is robustness testing in trading?
  2. How do you test whether a trading strategy is robust?
  3. What is a parameter plateau?
  4. How much extra slippage should a strategy survive?
  5. Should a strategy work on other markets?
  6. Which sessions, periods and data changes should a strategy survive?
  7. Which order should robustness tests run in?
  8. What does a failed robustness test tell you?
  9. Frequently asked questions
  10. References

What is robustness testing in trading?

Robustness testing is deliberately changing things a real strategy should not care about (nearby parameters, costs, the market, the session, the exact prices) and keeping only what survives. Passing one test proves little: the same NQ breakout rule that was profitable in all nine parameter neighbours lost money on 12 of 17 markets.

A bridge inspector does not drive one car across a bridge and call it safe. He loads it with more weight than normal traffic, from more than one direction, and watches what bends. A single backtest is the one car. Robustness testing is the extra load: you move the parameters, raise the costs, change the market, cut out sessions, swap the data, and you keep the strategy only if it still stands. The goal is not to find the strategy with the best backtest. The goal is to find the strategy you could not break.

This matters more today than it did twenty years ago because of the search. When software tries thousands of rule combinations for you, some combination will fit the quirks of one stretch of history by chance, and that combination will have the best backtest. Quirks are the default result of a large search, not the exception. The backtest overfitting research explains why the best of many backtests is usually inflated. Robustness testing is the practical response: it does not ask how good the best backtest was, it asks what happens when the conditions that produced it are disturbed.

One measured example runs through this whole article. The rule is a long-only breakout on NQ 60-minute bars: enter when the close crosses above the highest high of the previous N bars, exit when the close crosses below a simple moving average of M bars, with N = 20 and M = 50. The data runs from 2018-09 to 2026-10, one contract, with $14.75 commission per side including 2.5 extra ticks, plus 1 tick slippage. Both results come from the hosted backtest of AlphaPrime (Valynox), run 2026-10-31, and the full tables are in the sections below.

  • Parameter neighbours: all nine cells of a 3×3 grid around N = 20 / M = 50 finished with a positive net profit.
  • Other markets: the same rule, same period, finished above zero on 5 of 17 futures markets and below zero on the other 12.

Same rule, same dates, same cost model. One test says "solid"; the next says "fitted to one chart". A trader who stopped after the parameter grid would have trusted a rule that the next test took apart. That is the whole case for running a set of tests, writing the pass line for each one down beforehand, and reading them together.

The same NQ 60-minute breakout rule over the same period from 2018-09 to 2026-10 is profitable in all nine parameter neighbours but in only five of seventeen futures markets Same rule, two verdicts NQ breakout, 2018-09 to 2026-10 Parameter grid 9 of 9 profitable 17 markets 5 of 17 profitable profit loss One passed test proves little. So: run the set, read them together.
The same NQ rule, the same period: nine of nine parameter neighbours profitable, five of seventeen markets profitable. One passed test is not robustness.

How do you test whether a trading strategy is robust?

Each robustness test is aimed at one kind of fake signal, so you run a set of them, and no single test replaces another. A fake signal is a backtest result that comes from something other than a repeatable pattern in prices: a curve-fit parameter, an edge thinner than the cost of trading, one lucky chart, a calendar accident, five good days, one vendor's exact prices, a selection process that only worked backwards, or a lucky order of trades. The table lists the tests, what each one changes, and what a pass looks like.

TestWhat you changeWhich fake it catchesWhat a pass looks like
Nudge the parametersEvery numeric input moved up and down, all combinations rerunA curve-fit peak: one sweet spot with losing neighboursMost neighbours keep the sign; the chosen value sits inside a broad region
Raise the costsExtra commission or slippage per round trip, in stepsAn edge thinner than the spreadNet profit stays positive at a multiple of the realistic round-trip cost
Switch the marketSame rule on related instruments, each with its own costsA rule fitted to one chartThe sign holds on most related markets; the worst related market is not a disaster
Cut sessions and periodsTrades split by weekday, hour, year, day or night sessionA calendar accidentNo single slice carries the whole profit
Remove the biggest winnersThe five largest winning trades deletedFive good daysThe equity curve still rises
Add data noiseSame rule on a second vendor's barsDependence on exact pricesThe two trade lists mostly agree
Walk-forward analysisTune on one window, test unchanged on the next, repeatA selection process that does not hold forwardThe joined out-of-sample curve keeps a useful share of the in-sample result
Monte Carlo on tradesThe trade order reshuffled or resampled many timesA lucky trade orderThe drawdown at a chosen confidence level fits the account
Eight robustness tests and the fake signal each one catches: nudging parameters catches a curve-fit peak, raising costs an edge below cost, switching market a one-chart fit, cutting sessions a calendar accident, removing big winners five good days, adding data noise exact-price luck, walk-forward a hindsight pick, and Monte Carlo a lucky trade order Each test catches one fake Test Fake it catches Nudge parameters Raise costs Switch market Cut sessions Remove big winners Add data noise Walk-forward Monte Carlo Curve-fit peak Edge below cost One-chart fit Calendar accident Five good days Exact-price luck Hindsight pick Lucky trade order
Eight tests, eight kinds of fake. A strategy that passes one test has only ruled out one of them.

Two of the tests work on the process rather than on the rule. Walk-forward analysis is a test that tunes the parameters on one window of data, applies them unchanged to the window that follows, then moves forward and repeats, so it catches a way of choosing parameters that only worked when you could see the answer. A Monte Carlo backtest is a test that reshuffles or resamples the strategy's own trades many times to show the range of equity curves and drawdowns the same trades could have produced, so it catches a smooth curve that came from a lucky order. Neither of them changes the market, the costs or the data, which is why they come last in the list and not first.

Every test needs enough trades to mean something. There is no exact number, but below about 100 trades the tests start to measure noise instead of the strategy: with 40 trades, removing the five best removes an eighth of the sample, and a weekday cut leaves eight trades per weekday. A rule that produces 60 trades in ten years is not ready for robustness testing; it is ready for a longer history or a shorter bar size.

What is a parameter plateau?

A parameter plateau is a region of parameter values where the neighbours of the chosen value all keep most of the result, and a spike is one best cell surrounded by losers. The plateau is what a real pattern looks like, because a pattern in prices does not switch on at a 20-bar lookback and off at 18. The spike is what a curve fit looks like, because the search found the one value that lined up with the noise of one history.

Think of a hill and a flagpole. If you stand on a hill, a step in any direction changes your height a little. If you stand on top of a flagpole, any step is a fall. A parameter grid tells you which one you are standing on. The practical rule that follows is to pick the parameter from the middle of the hill, not from its highest point: the highest point of a hill is still partly luck, and the middle is where a small drift in the market costs the least.

Hypothetical example of net result against one lookback parameter: on the left a plateau where many values stay positive and the middle is the safe pick, on the right a spike where one lucky value has losing neighbours Hill or flagpole? Hypothetical: net result by lookback 0 Pick the middle One lucky cell Plateau Spike A real pattern is a hill, not a pole. So: pick from the middle, not the top.
Hypothetical example. Left: a plateau, where many nearby lookbacks stay positive and the middle is the safe choice. Right: a spike, where the best cell has losing neighbours.

The measured grid below is what a plateau looks like in a real run. The rule is the NQ 60-minute breakout from the first section. N, the number of bars in the breakout lookback, takes the values 10, 20 and 40; M, the length of the exit moving average, takes 20, 50 and 100. Every combination was run with the same commission plus 1 tick slippage, on the same bars, one contract, long only.

Source: AlphaPrime hosted backtest (ap_backtest connector), run 2026-10-31

Breakout bars N / exit SMA MNet profitProfit factorMax drawdownTrades
10 / 20$48,6701.032$87,8961,440
10 / 50$239,0101.197$87,157950
10 / 100$497,6781.606$68,590625
20 / 20$44,3001.042$91,663990
20 / 50$137,1451.135$82,636709
20 / 100$376,0321.517$56,452513
40 / 20$116,7121.171$63,560714
40 / 50$234,9811.345$54,995461
40 / 100$325,7201.555$51,062369
Nine neighbours of one NQ 60-min rule, 2018-09 to 2026-10, one contract.
Nine neighbours of one NQ 60-min rule, 2018-09 to 2026-10, one contract. NQ · 60-minute · 2018-09-02 to 2026-10-14 · AlphaPrime backtest

Three things to read in this grid, in the order you should read them:

  1. The share of cells with the right sign. All nine are positive. That is the pass criterion for this test, and it is the only number the test is really about. The chosen cell, 20 / 50, is not the best cell; it sits below the middle of the nine by net profit, and that is fine. The test asks whether the neighbourhood is sound, not whether you picked the peak.
  2. The shape. Within every row, a longer exit average earned more and traded less: 20 / 20 made $44,300 on 990 trades, 20 / 100 made $376,032 on 513 trades. That is a slope, not a spike. A slope tells you which direction the pattern lives in, and it also tempts you to chase it. Resist the temptation to move to 100 just because it is the top of this grid; a grid that stopped at 100 cannot tell you what happens at 150, and the right response to a slope is to widen the grid, not to jump to its edge.
  3. The weakest cells. 10 / 20 and 20 / 20 have profit factors of 1.032 and 1.042. Profit factor is gross profit divided by gross loss, so these cells kept barely more than they gave back. They pass the sign test, but they tell you the short exit is where the rule is thin.

One condition makes this plateau worth something: it already includes commission plus 1 tick slippage. A grid run at zero cost shows a wide, comfortable plateau for almost any rule that trades often, because every one of those small, frequent trades looks free, and the plateau shrinks or vanishes once real fills are charged. AlphaPrime's backtesting charges fees and slippage inside every evaluation, with next-bar execution, so a grid it produces is already net of costs; a grid from any tool that was run at zero cost needs the cost stress of the next section before you trust its plateau.

How much extra slippage should a strategy survive?

The extra cost a strategy can take before its profit is gone equals its average trade, so the cost stress test is a way of asking how many ticks of safety margin the rule has. Slippage is the difference between the price your backtest assumed and the price a real order would fill at, and it is the cost most backtests underestimate, because it depends on the order type, the time of day and the mood of the market on the day you trade. The question is not whether your slippage estimate is exactly right. It is how wrong it can be before the strategy stops working.

The arithmetic needs one formula. Break-even extra cost per round trip = net profit ÷ number of trades. The left side is the extra charge per trade that would bring the net profit to zero. Net profit is the backtest result after the costs already charged, and the number of trades is how many round trips paid for it. The result is simply the average trade: every trade pays the extra cost, so the extra cost that erases the profit is the profit per trade.

Source: AlphaPrime hosted backtest (ap_backtest connector), run 2026-10-31

Extra cost per round tripNet profit after it
$0$137,145
$50$101,695
$100$66,245
$150$30,795
$200−$4,656

The rule averages $193 a trade across 709 trades, so that is the extra cost it can take before the profit is gone.

Net profit of the NQ breakout rule falls in a straight line from about 137 thousand dollars at no extra cost to a small loss at 200 dollars extra per round trip, crossing zero at the average trade of 193 dollars; AlphaPrime hosted backtest run 2026-10-31 Break-even = average trade NQ rule, extra cost per round trip AlphaPrime run, 2026-10-31 $137k 0 Avg trade $193 $0 $50 $100 $150 $200 It can pay $193 more per trade. So: compare average trade to real cost.
Net profit of the N = 20 / M = 50 NQ rule against extra cost per round trip. The line is straight because every one of the 709 trades pays the same extra charge, and it crosses zero near the average trade of $193.

The table shows the straight line you should expect. Each $50 step removes the same amount of profit, because each of the 709 trades pays the extra $50, and the line crosses zero between $150 and $200, where the average trade of $193 says it should. The lesson is that you do not need to run the stress table at all to know where the break-even is; you need the average trade, and the trading costs in backtests article shows how to compare that average trade with the round-trip cost you really pay.

What makes this rule pass the cost stress is the size of the average trade in ticks. One NQ tick is $5.00 per CME's contract specifications, so $200 of extra cost per round trip is forty ticks, or twenty extra ticks of slippage on each side, which is far more than a liquid NQ market order normally sees. Compare that with an intraday rule on ES whose average trade is three or four ticks: going from one tick of slippage per side to two adds two ticks per round trip, and that step alone takes half or more of the average trade. Rules like that die here, and it is better that they die in the test than in the account. Exchanges can change tick sizes and contract terms, so check the exchange's contract page for the market you test.

Set the pass line before you look at the result, as a multiple of the realistic round-trip cost rather than as a fixed dollar figure, so that it scales with the market. A common form is "the rule must stay profitable at double the realistic round-trip cost" or "at one extra tick per side on top of a realistic estimate". For the NQ rule, the realistic cost in the run is $14.75 commission per side including 2.5 extra ticks, plus 1 tick slippage, and the rule survives far more than double that, so it passes. The test says nothing about whether the realistic estimate itself is right; it says how much room there is for it to be wrong.

Should a strategy work on other markets?

A rule should keep its sign on related markets, not on random ones, and the measured run shows why this is the hardest test: the same rule that passed every parameter neighbour was above zero on only 5 of 17 markets. The logic of the test is that a rule which captures something general about how prices move, such as the tendency of a breakout to follow through, should show the same sign on markets that move in a similar way, even if the profit is different because the tick values and the costs are different. A rule that only works on the chart it was found on was fitted to that chart.

Related means markets that share the behaviour the rule is built on. For an NQ breakout rule, ES, YM and RTY are the obvious relatives: all four are US stock index futures that trade the same hours and react to the same news. Gold and silver are a reasonable second circle for a trend rule. Grains, bonds and currencies are a fair test of whether the rule is a general trend rule, but failing there is a weaker signal than failing on ES. The run below applied the N = 20 / M = 50 rule, unchanged, to every one of the 17 markets of the hosted backtest, each with its own commission and slippage.

Source: AlphaPrime hosted backtest (ap_backtest connector), run 2026-10-31

MarketNet profitProfit factor
GC$230,1861.421
NQ$137,1451.135
SI$97,8641.115
YM$47,1081.118
ES$17,4011.030
ZS−$27,8150.845
CL−$28,3600.936
6J−$33,1600.758
6E−$36,9700.772
NG−$50,6920.870
6B−$51,9670.623
ZC−$52,1440.537
ZW−$56,4230.666
RTY−$59,7800.849
ZN−$80,2050.464
HG−$83,3960.802
ZB−$156,4900.508

5 of 17 markets finished above zero.

Net profit of the same NQ breakout rule on 17 futures markets, sorted from GC, the most profitable, to ZB, the biggest loser: five markets above zero and twelve below, with NQ, the market the rule was found on, marked; AlphaPrime hosted backtest run 2026-10-31 5 of 17 markets made money Same rule, AlphaPrime run 2026-10-31 NQ: origin 5 above zero 12 below zero It learned one chart, not a pattern. So: test related markets early.
The N = 20 / M = 50 rule on 17 futures markets, 2018-09 to 2026-10, one contract each, long only. Five markets above zero, twelve below; NQ is the market the rule was found on.

Read the result in circles, from the nearest relatives outwards. Among the stock index futures, ES and YM kept the sign and RTY did not, and the ES result of $17,401 with a profit factor of 1.030 is close enough to zero that a slightly different cost estimate could flip it. Gold was the strongest market in the run, well above NQ itself, and silver also finished above zero. Bonds, grains, currencies, energy and copper all lost, and the bond markets had the lowest profit factors: ZB at −$156,490 (0.508) and ZN at −$80,205 (0.464). The rule is long only, so it can only earn in a market that spent part of the period rising, and that is one reason a long-only breakout looks so different across this list.

What this run shows is that the rule is not a general trend rule and that even inside its own family it is not reliable: a rule you would trade on NQ, YM and ES is a different thing from a rule you would trade on any market. What it does not show is whether a short-side version, a different bar size or a different exit would change the picture, because none of those were run. It also says nothing about why GC and SI worked; a result on two metals markets is a hint for further research, not a finding.

The pass line for this test has two parts, and you write both down first: the share of related markets that must keep the sign, and the worst loss on a related market that you accept. A rule that loses a little on its weakest relative can still pass; a rule that loses on most of its family fails, however good the origin market looks. Failing here is the most common result for a rule that came from a large search, and that is the reason to run this test before the expensive ones.

Which sessions, periods and data changes should a strategy survive?

Cut the trades by weekday, hour, year and session, remove the five biggest winners, and rerun the rule on a second vendor's bars, because a result that depends on one weekday, five good days or one vendor's exact prices was never an edge. These tests change nothing about the rule. They change which trades you count, or which prices the rule sees, and a real pattern should not care about either.

The slicing tests work on the trade list you already have, so they need no new backtest. Run them in this order:

  1. By year. Split the net profit by calendar year. One or two losing years are normal for a trend rule; one winning year that carries the whole result is a period accident, usually a single strong trend.
  2. By weekday. Group the trades by the weekday of entry. If one weekday holds most of the profit and the others are flat or negative, the rule found a calendar quirk, and a quirk of that kind rarely repeats.
  3. By hour. Group intraday trades by the hour of entry. A rule that only earns in the first hour after the cash open is not wrong, but it is a different rule from the one you tested, and it should be written as an opening-hour rule and retested as one.
  4. By session. Separate trades taken in the day session from trades taken in the overnight session, where the market has one. A rule found on full-session bars that only earns overnight is depending on thin liquidity, where slippage is worst; the night sessions in futures backtests article covers what changes when the overnight bars are removed.
  5. Remove the five biggest winners. Delete the five largest winning trades and redraw the equity curve. This is the one check to keep if you could keep only one. When the curve goes flat, the strategy never had an edge; it had five good days.

Hypothetical example

Two strategies each show 400 trades and $80,000 of net profit over the same ten years. In the first, the five largest winners add up to $12,000; remove them and the net profit is $68,000, the curve still rises, and the average trade falls from $200 to $172. In the second, the five largest winners add up to $75,000; remove them and $5,000 is left across 395 trades, about $13 a trade, which a small change in slippage would erase. Same headline, two different strategies. The second one is five good days.

Hypothetical example of two strategies with the same headline net profit: the first equity curve still rises after its five best trades are removed, the second rose only through five jumps and goes flat without them Remove the five best trades Hypothetical, same headline profit Still rises Goes flat all trades minus best 5 Same headline, two strategies. So: always remove the five best.
Hypothetical example, the same two strategies as in the box. Left: the curve still rises without its five best trades. Right: the curve was the five best trades.

The data test is different in kind, because it changes the inputs instead of the outputs. Two vendors' bars for the same contract are rarely identical: one builds the bar from a different feed, one stamps the bar at a different time boundary, one handles the roll between contract months a day apart. The differences are usually one tick here and there, and a rule written on exact prices turns those ticks into different trades. "Close crosses above the 20-bar high" fires when the close is one tick above the line and stays silent when it is one tick below. With vendor A the trade exists; with vendor B it does not; from that bar on, the two equity curves are no longer the same strategy.

The same bars from two data vendors against the 20-bar high: vendor A closes one tick above the line and the rule buys, vendor B closes one tick below and there is no trade, so the two trade lists differ from that bar on One tick makes a trade Dashed line: the 20-bar high Vendor A Vendor B 1 tick above 1 tick below Signal: buy No trade Same bars after, different trades. So: rerun on a second vendor.
A one-tick difference between two data sources is enough to create or remove a breakout trade. The bars that follow are the same; the trade lists are not.

The way to run this test is simple and manual. Rerun the same rule, unchanged, on the second vendor's bars for the same period. Put the two trade lists side by side, sorted by entry time, and count the trades that appear in one list and not the other. A robust rule produces mostly the same trades with a handful of differences at the edges, and the net profit of the two runs lands in the same region. A fragile rule produces two lists that diverge after the first disagreement and two net profits that have little to do with each other. Apply the same pass line you set for the parameter neighbours: if you required most neighbours to keep the sign, require the second data source to keep the sign and to agree on most trades. If you have only one data source, the nearest substitute is the backtest data quality checks on the one you have, because bad ticks and shifted time stamps produce the same kind of fragile signal as a vendor difference.

Which order should robustness tests run in?

Run the parameter grid and the cost stress first, because they are cheap and remove the most candidates, then the multi-market run and the session cuts, then walk-forward analysis and Monte Carlo, and stop a candidate at the first pass line it misses. The order matters because the tests have very different prices. A parameter grid is a handful of extra backtests; a multi-market run is one backtest per market; the slicing tests need no new backtest at all; walk-forward analysis is a full optimization for every window, which can be hundreds of runs; a Monte Carlo on trades is cheap again, but it only means something for a strategy that has survived everything before it. Spending walk-forward time on a candidate that the parameter grid would have removed in seconds is the most common waste in strategy research.

  1. Parameter grid. Pass line: the share of neighbours that must stay profitable. Removes the curve-fit peaks, which are the largest group of fakes a search produces.
  2. Cost stress. Pass line: the extra cost per round trip the rule must survive, written as a multiple of the realistic round trip. Removes the thin edges, which are the second largest group.
  3. Multi-market. Pass line: the share of related markets that keep the sign and the worst loss on a related market. Removes the rules fitted to one chart.
  4. Session and period cuts, biggest-winner removal. Pass line: no single slice carries the result, and the curve still rises without the five best trades. Removes calendar accidents and five-good-days strategies.
  5. Walk-forward analysis. Pass line: the joined out-of-sample curve keeps a set share of the in-sample result, and most windows are positive. Removes selection processes that only worked backwards; the walk forward optimization explained article covers the window choices, and the in-sample vs out-of-sample article covers how much data to hold back.
  6. Monte Carlo on trades. Pass line: the drawdown at a chosen confidence level fits the account you will trade. Removes smooth curves that came from a lucky order; the free Monte Carlo simulator produces the drawdown range from a pasted list of trade results.
Robustness tests as a funnel in six steps, parameter grid, cost stress, other markets, session cuts, walk-forward and Monte Carlo, with fewer candidates at each step and a stop exit wherever a candidate misses a pass line written in advance Cheap tests first, stop early 1 Parameter grid 2 Cost stress 3 Other markets 4 Session cuts 5 Walk-forward 6 Monte Carlo stop stop stop stop stop stop Miss one pass line, and it stops. So: write every pass line first.
Robustness tests as a funnel: cheap tests first, a candidate stops at the first pass line it misses, and the expensive tests only run on the survivors.

The stop rule is what makes the order pay. A candidate that misses the parameter pass line is out, and nothing further is spent on it; a candidate that reaches walk-forward has already shown a plateau, a cost margin, a family of markets and a trade list that does not depend on five days. In AlphaPrime's strategy validation, the checks run in sequence against thresholds you set and a candidate that misses one threshold stops there, so walk-forward and the later checks only run on the survivors of the cheaper tests, which is the same funnel drawn above.

Two habits keep the funnel honest. First, the pass lines are written before the first candidate is run, and they do not move afterwards; a pass line that is adjusted after seeing the results is a result, not a test. Second, the count of candidates that entered and the count that left each stage is recorded, because that count is itself information: if nine out of ten candidates fall at the parameter grid, the generation settings are producing curve fits and the fix is upstream, in the search, not in the tests. The overfitting in strategy generation article covers what to change in the search when that happens.

What does a failed robustness test tell you?

A failure tells you which kind of fake you found and that the search should continue, while a pass only narrows the odds. A failed parameter grid says the search found a peak; a failed cost stress says the pattern is real but too small to pay for; a failed multi-market run says the rule learned one chart; a failed biggest-winner test says the history had five good days. Each failure points at a specific weakness, which is more useful than a vague "it did not work", and each one tells you what to change before the next search. A pass tells you less. It says that one kind of fake was not present, nothing more, and a candidate that passes every test can still be a fake that happened to survive.

The reason a pass proves little is the search behind it. Run enough strategies through enough tests and some junk passes all of them by chance, because ten checks on a thousand candidates is still a search, now a search for the candidate that passes checks. Sullivan, Timmermann and White reran thousands of technical trading rules on a century of Dow data and showed that the best rule has to be judged against the size of the search it came from, and that the best rule's edge did not hold in the ten years after their sample. White's Reality Check is the statistical form of that idea: it tests whether the best of many models beats a benchmark once the whole set of models that were tried is taken into account. Bailey and his co-authors go one step further and estimate the probability that the configuration which looked best in-sample does worse than the median configuration out-of-sample, and with enough trials that probability is high unless something limits the search. Robustness tests do not remove this problem; they reduce the number of candidates, so the search among survivors is smaller than the search among raw backtests.

The one measured example of what survivors look like afterwards is a run on ES and TAIEX futures. Held-out data is a stretch of bars at the end of the history that is kept outside the research entirely, so that nothing, neither the generation nor the walk-forward, can see it.

Run on 2026-10-15 with an RTX 3060 Ti, factory settings, conservative costs and 1 contract. ES 2014-01 to 2026-09 (held out from 2022-10); TAIEX futures 2015-10 to 2025-03 (held out from 2022-04). The held-out bars were not in the database during generation or walk-forward.

  • ES 60-min: about a thousand evaluated, 250 passed basic filters, 126 passed walk-forward. On held-out data 91% of those that passed walk-forward were profitable, versus 53% of those that failed.
  • TAIEX futures 60-min: about a thousand evaluated, 306 passed basic filters, 168 passed walk-forward. On held-out data 85% of those that passed walk-forward were profitable, versus 66% of those that failed.
Share profitable on held-out data. ES 60-min: 91% of strategies that passed walk-forward, 53% of those that failed. TAIEX futures 60-min: 85% passed, 66% failed.Share profitable on held-out dataES 60-min91%53%TAIEX futures 60-min85%66%Passed walk-forwardFailed walk-forward
Same 2026-10-15 run. Only walk-forward was used as the filter here.

Read this run for the gap, not for the pass share. Both held-out periods were rising markets, ES about +116% and TAIEX futures about +29%, and in a market that more than doubled, junk with a long bias makes money too. That is why over half of the ES strategies that failed walk-forward still finished profitable on held-out data: the market carried them. The 91% on its own is not evidence that walk-forward found real strategies; the difference between 91% and 53% is, because both groups were lifted by the same market and only the passed group was lifted that much further. The same reading applies to TAIEX futures: 85% against 66%, a smaller gap in a smaller rise.

Illustration without run numbers: strategies that passed and failed walk-forward both get the same lift from a rising market on held-out data, and only the extra height of the passed group, the gap, is evidence that the filter worked The gap is the evidence Illustration: held-out, by walk-forward Gap = evidence Passed Failed Market lift Market lift Gap Both groups get the lift A rising market lifts both groups. So: judge the gap, not the pass share.
Illustration without run numbers: a rising market lifts both groups, so only the extra height of the group that passed walk-forward is evidence that the filter did something.

This run shows that, on these two markets and these two held-out periods, strategies that passed one robustness test were profitable on unseen data more often than strategies that failed it. It does not show what any one strategy will do next, it does not show how large the profits were, and it used walk-forward as the only filter: whether the parameter grid and the multi-market check would widen the gap has not been measured. A share of profitable strategies on a past held-out period is a statement about a filter, not a forecast about an account.

The final decision, then, is never one test and never one number. It is the set of pass lines you wrote down before the first run, applied in order, with the candidate stopped at the first one it misses, and the survivors read against the size of the search they came from. A strategy that reaches the end of that funnel has earned a smaller claim than "it works": it has earned "nothing I tried could break it". That is the most a backtest can give you, and it is a great deal more than the best backtest in the grid.

Frequently asked questions

What is robustness testing of a trading strategy?

Robustness testing is rerunning a strategy after changing things that should not matter much: nearby parameter values, higher costs, a related market, a different session or period, and slightly different price data. Each change catches a different kind of fake signal. A strategy that keeps most of its edge through all of them is more likely to rest on a real pattern than on a quirk of one history.

Is walk-forward analysis a robustness test?

Yes. It checks whether the way you choose parameters still works on data after the optimization window, so it tests the selection process rather than the rule. It does not test other markets, higher costs or a second data source, so it belongs in the set next to those checks, and because it is the most expensive test it should run after the cheaper checks.

How many trades do you need before robustness testing makes sense?

There is no exact number, but below roughly 100 trades most results are noise. With 40 trades, removing the five best removes an eighth of the sample, and a weekday cut leaves eight trades per weekday. A rule with too few trades needs a longer history or a shorter bar size before the tests can say anything.

What is the difference between a parameter plateau and a spike?

A plateau is a region where the neighbouring parameter values all keep most of the result, which is what a real pattern looks like because a pattern in prices does not switch off when a lookback moves from 20 to 18. A spike is one best cell surrounded by losing cells, which is what a curve fit looks like. Pick parameters from the middle of a plateau, not from its highest point.

Does passing every robustness test mean the strategy is real?

No. Passing all tests means none of the specific fakes they look for was found, and when many candidates are tested some junk passes every test by chance. Read the survivors against the size of the search they came from, and treat a pass as a reason to trade small and keep measuring rather than as proof.

References

  • Sullivan, R., Timmermann, A., & White, H. (1999). Data-Snooping, Technical Trading Rule Performance, and the Bootstrap. The Journal of Finance, 54(5), 1647–1691.
  • White, H. (2000). A Reality Check for Data Snooping. Econometrica, 68(5), 1097–1126.
  • Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2017). The Probability of Backtest Overfitting. Journal of Computational Finance, 20(4), 39–69.
  • CME Group. E-mini Nasdaq-100 Futures contract specifications (contract size $20 × index, minimum tick 0.25 index points = $5.00). cmegroup.com/markets/equities/nasdaq/e-mini-nasdaq-100.contractSpecs.html