Skip to content

Quant Concepts · Vol 3 of 6

Walk-forward testing: judging a trading rule on data it never saw

The reality check: how testing rules on unseen data helps tell repeatable results from a lucky fit, and why one test is not proof.

The short answer

Walk-forward optimization, also called walk-forward testing or analysis, tunes a trading rule on one stretch of past data, judges it on the next stretch it never saw, then slides both stretches forward and repeats. The test pieces join into one longer record on unseen data. A pass makes a lucky fit less likely, but it is still one historical path.

Key ideas

  • Build on one stretch, judge on the next, and keep a last stretch locked.
  • Walk-forward catches most lucky fits, and it also fails real edges. In this article's simulation, a rule with a small real edge missed the common 50% "efficiency" rule of thumb (yearly test return divided by yearly build return) in 74.3% of simulated worlds, while at least one of nine rules with no edge passed it in 25.0%.
  • Every look at test data uses some of it up. When 100 rules were compared on the same test stretch, the winner's score there averaged a Sharpe ratio of 1.13, and on the next five years it averaged 0.05.
Build on one stretch, test on the next, leave the last one aloneDiagram of one stretch of price history split in time order into three blocks. Build (in-sample data): the rule is designed and tuned here. Test (out-of-sample data): the finished rule is judged here. Locked (final hold-out): not looked at until the rule is frozen, then checked once at the end.Build on one stretch, test on the next,leave the last one aloneDiagramnovalens.ioBlock lengths are for illustration only.Buildtune the rule herein-sample dataTestjudge it hereout-of-sample dataLockedcheck onceat the endfinal hold-outdo not touch untilthe rule is frozenOlder dataNewer dataBuild on one stretch, test on the next, leave the last one aloneDiagram of one stretch of price history split in time order into three blocks. Build (in-sample data): the rule is designed and tuned here. Test (out-of-sample data): the finished rule is judged here. Locked (final hold-out): not looked at until the rule is frozen, then checked once at the end.Build on one stretch,test on the next, leavethe last one aloneDiagramnovalens.ioBlock lengths are for illustration.Buildtune the rule herein-sample dataTestjudge it hereout-of-sample dataLockedcheck once at the endfinal hold-outdo not touch until the ruleis frozenOlder data at the top
Figure 1. Build on one stretch, test on the next, leave the last one alone. Diagram.
Show the numbers
BlockTextbook nameWhat happens thereTimes looked at
BuildIn-sample dataIdeas are tried and settings tunedAs often as needed
TestOut-of-sample dataThe finished rule is judgedOnce per finished rule; each extra look turns it into build data
LockedFinal hold-outNothing until every choice is madeOnce, at the end

What is out-of-sample testing?

Tuning, or optimization, means trying many settings of a trading rule, such as the length of a moving average, and keeping the best scorer in a backtest on past data. That score flatters the pick: Vol 2 showed how the best of many tries carries a luck bonus. Out-of-sample testing splits the history in time order, so the rule never learns from the future:

  • Build data (in-sample data) to design and tune the rule, as often as needed.
  • Test data (out-of-sample data), the next stretch, where the finished rule is scored once.
  • A locked final stretch (a hold-out) that stays unseen until every choice is made.

The score used throughout is the Sharpe ratio: yearly return above a risk-free rate, divided by yearly return swings. With the rate set to zero here, 0.5 means the average yearly gain is half a typical yearly swing.

Worked example: one split

The worked numbers come from a simulation on synthetic markets, where the answer is known in advance. Each simulated world has 20 years of daily returns and 10 rule families, each a rule with one setting that can take 20 values. One family has a small real edge: its true Sharpe ratio rises to 0.5 in the middle settings and fades toward zero at the ends. The other nine have none. There are no trading costs, and each experiment runs 1,000 worlds. Here the best setting of each family is picked on years 1-15 and tested once on years 16-20.

Simulated, 1,000 worlds, build years 1-15, test years 16-20Build Sharpe of the pick (mean)Test Sharpe of the pick (mean)Share of picks above 0 on test
Real-edge family (true Sharpe up to 0.5)0.680.4684%
No-edge families (9 per world, pooled)0.310.0050%

Illustrative, simulated; worked numbers.

Picking the best of 20 settings adds a luck bonus on the build years: the real-edge pick scores 0.68, above the family's highest true Sharpe of 0.5, and no-edge picks score 0.31. On the test years the bonus is gone. No-edge picks land above zero in 50% of cases, a coin flip; the real-edge pick in 84%. A single test separates the two on average, but any one test can mislead.

The reason is sample size, the topic of Vol 1. With no true edge and independent daily returns, luck alone moves a Sharpe ratio by about 1 divided by the square root of the years measured: about 1.0 over one year, 0.45 over five and 0.24 over 17. Those are typical spreads, not limits. So a five-year test's luck spread is almost as large as the real edge it is trying to find.

What is walk-forward optimization?

Walk-forward analysis repeats the out-of-sample test: tune on one window, test on the next, slide both forward.

Wikipedia's entry and several trading-platform guides credit the method to Robert E. Pardo's 1992 book Design, Testing and Optimization of Trading Systems (text not available to check). His 2008 book, The Evaluation and Optimization of Trading Strategies (Wiley, second edition), lists a chapter titled "Walk-Forward Analysis" in the publisher's contents. TradeStation's documentation describes two common versions:

  • Rolling (unanchored) windows: "the in-sample window (e.g. 2 years) is shifted forward to encapsulate the most recent out-of-sample period". The build window keeps its length and slides.
  • Anchored windows: "the beginning of the in-sample window is fixed at the initial/original starting point". The build window always starts on the first day and grows.

In the simulation, rolling windows use a 3-year build and a 1-year test, stepping a year at a time: 17 test years (years 4-20). The anchored version tests the same years.

Walk-forward repeats the test, one step at a timeTwo panels on the same scale, rolling windows first and anchored windows second. Each panel shows 5 of the 17 walk-forward steps over 20 simulated years: a green build window, then a blue one-year test window, stepping forward one year each time. The rolling build window is always 3 years; the anchored one starts at year 1 and grows. Under each, the test years are joined into one record for the rule family with a small real edge, in one typical simulated world (seed 20261049): rolling ends at 86% with a Sharpe ratio of 0.34, anchored ends at 143% with 0.56.Walk-forward repeats the test, one step at a timeIllustrative, simulatednovalens.ioGreen: build window. Blue: test year. Record: running sum of daily returns, no costs.Simulated: 20 years, 10 rule families of 20 settings, best one re-picked each step. Seed 20261049.Rolling: 3-year build slides12 more steps05101520yearsTest years joined, real-edge family-40%0%+40%+80%+120%Sharpe 0.34efficiency 34%Anchored: build starts at year 112 more steps05101520yearsTest years joined, real-edge familySharpe 0.56efficiency 66%Walk-forward repeats the test, one step at a timeTwo panels on the same scale, rolling windows first and anchored windows second. Each panel shows 5 of the 17 walk-forward steps over 20 simulated years: a green build window, then a blue one-year test window, stepping forward one year each time. The rolling build window is always 3 years; the anchored one starts at year 1 and grows. Under each, the test years are joined into one record for the rule family with a small real edge, in one typical simulated world (seed 20261049): rolling ends at 86% with a Sharpe ratio of 0.34, anchored ends at 143% with 0.56.Walk-forward repeats thetest, one step at a timeIllustrative, simulatednovalens.ioRecord: sum of daily returns, no costs.Green: build. Blue: test year.settings re-picked each step. Seed 20261049.Simulated: 20 years, best of 20Rolling: 3-year build slides12 more steps05101520yearsTest years joined, real-edge family-40%0%+40%+80%+120%Sharpe 0.34efficiency 34%Anchored: build starts at year 112 more steps05101520yearsTest years joined, real-edge family-40%0%+40%+80%+120%Sharpe 0.56efficiency 66%
Figure 2. Rolling windows (first panel, the green build block slides) and anchored windows (second panel, it grows), test in blue, 5 of the 17 steps drawn. Under each, the real-edge family's joined test record in one typical world: Sharpe ratio 0.34 rolling and 0.56 anchored. Illustrative, simulated; worked numbers.
Show the numbers
Real-edge family, worked numbersRolling (3-year build)Anchored (build from year 1)
This world: average build Sharpe of the picks1.000.86
This world: Sharpe of the 17 joined test years0.340.56
This world: efficiency (test return / build return)34%66%
This world: different settings picked in 17 steps62
1,000 worlds: joined test Sharpe, mean (10th to 90th percentile)0.38 (0.07 to 0.69)0.43 (0.11 to 0.74)
1,000 worlds: efficiency, median (10th to 90th percentile)37% (8% to 61%)59% (18% to 95%)
1,000 worlds: different settings picked, median83

What is walk-forward efficiency, and is 50% a pass mark?

TradeStation's walk-forward tool "calculates and compares annualized rates of return for the in-sample and out-of-sample results. This statistic is the Walk-Forward Efficiency". In plain terms: the yearly return on test data divided by the yearly return on build data, as a percentage. The same documentation gives the usual threshold: "As a rule of thumb, a Walk-Forward Efficiency of 50% or more is considered a measure of a successful walk-forward analysis."

A simulated family passes when its efficiency is at least 50% and its joined test record is profitable.

  • The real edge often fails. With rolling windows its efficiency fell below 50% in 74.3% of worlds, because on a 3-year build window the picked setting's luck bonus inflates the build return, the bottom of the ratio. With anchored windows the share was 38.1%.
  • No-edge rules sometimes pass, more often with anchored windows. Each no-edge family, on average, passed in 3.2% of rolling worlds and 16.7% of anchored ones; at least one of the nine passed in 25.0% and 79.5%. A long build window gives a no-edge rule a small build return, and half of a small number is a low bar.
On new data the no-edge families fall toward zero; the real edge keeps part of its scoreSlope chart of ten simulated rule families in one typical world (rolling walk-forward, 17 test years). First column: average Sharpe ratio of the picked setting on its build windows. Second column: Sharpe ratio of the joined test years. The real-edge family falls from 1.00 to 0.34 (efficiency 34%). The nine no-edge families start between 0.46 and 1.10 and end between −0.31 and 0.25.On new data the no-edge families fall toward zero;the real edge keeps part of its scoreIllustrative, simulatednovalens.ioRolling walk-forward, 3-year build, 17 test years. Seed 20261049. Efficiency = test return / build return.Simulated: 10 rule families of 20 settings; one has a small real edge (true Sharpe up to 0.5).−0.50.00.51.0Build score(Sharpe)Test score(walk-forward Sharpe)EfficiencyReal edge: 34%No edge: 31%No edge: 16%No edge: −16%No edge: 15%No edge: 10%No edge: 2%No edge: −69%No edge: −19%No edge: −45%On new data the no-edge families fall toward zero; the real edge keeps part of its scoreSlope chart of ten simulated rule families in one typical world (rolling walk-forward, 17 test years). First column: average Sharpe ratio of the picked setting on its build windows. Second column: Sharpe ratio of the joined test years. The real-edge family falls from 1.00 to 0.34 (efficiency 34%). The nine no-edge families start between 0.46 and 1.10 and end between −0.31 and 0.25.On new data the no-edgefamilies fall toward zero;the real edge keeps partof its scoreIllustrative, simulatednovalens.ioEfficiency = test return / build return.Rolling, 17 test years. Seed 20261049.small real edge (true Sharpe up to 0.5).Simulated: 10 families, one with a−0.50.00.51.0Build score(Sharpe)Test score(walk-forward Sharpe)EfficiencyReal edge: 34%No edge: 31%No edge: 16%No edge: −16%No edge: 15%No edge: 10%No edge: 2%No edge: −69%No edge: −19%No edge: −45%
Figure 3. Ten simulated rule families in one typical world, rolling walk-forward: Sharpe ratio on the build windows (first column) and on the 17 joined test years (second column), with each line's efficiency. Illustrative, simulated; worked numbers.
Show the numbers
FamilyBuild SharpeTest SharpeEfficiencyPasses 50% rule
Real edge1.000.3434%no
No edge 10.810.2531%no
No edge 20.820.1316%no
No edge 30.55−0.09−16%no
No edge 40.740.1115%no
No edge 51.100.1110%no
No edge 60.730.012%no
No edge 70.46−0.31−69%no
No edge 80.63−0.12−19%no
No edge 90.59−0.26−45%no
Across 1,000 simulated worlds:
Worked numbers, 1,000 worldsRollingAnchored
Real edge passes25.7%61.9%
Real edge efficiency below 50%74.3%38.1%
One no-edge family passes3.2%16.7%
At least one of nine no-edge families passes25.0%79.5%
At least one of nine passes the stricter four-part check24.8%65.9%
Real edge has the best joined test Sharpe of the 1051.8%60.9%
No-edge build Sharpe, mean0.680.40
No-edge joined test Sharpe, mean0.000.00

Stricter four-part check: the pass rule plus two of TradeStation's other default conditions, at least half of the 17 test years profitable and no single test year making half or more of the net profit. Drawdown is not checked.

What does walk-forward not fix?

Walk-forward works only while the test data stays unseen and the test design is fixed in advance.

Peeking turns test data into build data

Halbert White, in his 2000 paper "A Reality Check for Data Snooping", defines the problem: "Data snooping occurs when a given set of data is used more than once for purposes of inference or model selection." Each time a test result is used to pick or change a rule, the test data starts to become build data, and each walk-forward rerun is one more try in the count from Vol 2. Michael Harris (Price Action Lab blog) warns that "given enough permutations, one may find a spurious model that may pass cross-validation tests by chance alone." Walk-forward is one kind of cross-validation.

Bailey, Borwein, López de Prado and Zhu note that experienced researchers know how markets behaved over the test years, and "that information may well be used in the strategy design, consciously or not".

A second simulation mixes one rule with a small real edge into a pool of no-edge rules, up to 100 in all, and picks whichever scores best on the same 5-year test set.

Each extra look at the test set flatters the winner; on the next unseen stretch it fadesLine chart, number of rules compared on the same 5-year test set on a log scale from 1 to 100. The first rule has a small real edge (true Sharpe ratio 0.5); the rest have none. The pick's Sharpe ratio on the test set rises from 0.50 with 1 rule to 0.80 with 10 and 1.13 with 100. On the next 5 years, never used to choose, the same pick averages 0.50, 0.19 and 0.05. The pick is the real rule in 38.4% of worlds with 10 rules and 8.5% with 100.Each extra look at the test set flatters the winner;on the next unseen stretch it fadesIllustrative, simulatednovalens.ioN rules on one 5-year test set. 1,000 worlds; lines are averages, bands the middle 80%. No costs.Simulated: 100 rules, 15% yearly volatility, rule 1 has true Sharpe 0.5, the rest 0. Pick = best of the first−0.50.00.51.01.5Sharpe ratio of the picktrue Sharpe of the real rule, 0.5Test set usedto choose: 1.13Next 5 years,never used: 0.05125102050100Rules compared on the same test set (log scale)Pick is the real rule, share of worlds:1 rule: every world10 rules: 38.4%100 rules: 8.5%Each extra look at the test set flatters the winner; on the next unseen stretch it fadesLine chart, number of rules compared on the same 5-year test set on a log scale from 1 to 100. The first rule has a small real edge (true Sharpe ratio 0.5); the rest have none. The pick's Sharpe ratio on the test set rises from 0.50 with 1 rule to 0.80 with 10 and 1.13 with 100. On the next 5 years, never used to choose, the same pick averages 0.50, 0.19 and 0.05. The pick is the real rule in 38.4% of worlds with 10 rules and 8.5% with 100.Each extra look at thetest set flatters thewinner; on the next unseenstretch it fadesIllustrative, simulatednovalens.iobands: middle 80%. No costs.on one 5-year test set. 1,000 worlds;the rest 0. Pick = best of the first NSimulated: rule 1 has true Sharpe 0.5,−0.50.00.51.01.5Sharpe ratio of the picktrue Sharpe of the real rule, 0.5On the test set used to chooseOn the next 5 years, never used110100Rules compared on the same test set (log scale)Pick is the real rule, by rules compared:1: all10: 38.4%100: 8.5%
Figure 4. The pick's Sharpe ratio on the shared 5-year test set (amber) and on the next 5 years, never used to choose (blue), as more rules are compared (log scale). Bands show the middle 80% of worlds; dotted line at the true 0.5. Illustrative, simulated; worked numbers.
Show the numbers
Rules compared on one test setTest-set Sharpe of the pick, mean (10th to 90th)Next 5 years, never used, mean (10th to 90th)Pick is the real ruleSame pool without the real rule: test-set Sharpe of the pick
10.50 (−0.06 to 1.04)0.50 (−0.07 to 1.05)every world0.00
20.58 (0.08 to 1.06)0.40 (−0.22 to 1.00)78.2%0.26
50.70 (0.29 to 1.12)0.26 (−0.37 to 0.89)54.1%0.52
100.80 (0.44 to 1.15)0.19 (−0.44 to 0.83)38.4%0.68
200.90 (0.62 to 1.22)0.13 (−0.47 to 0.75)25.2%0.84
501.04 (0.78 to 1.33)0.07 (−0.50 to 0.69)12.8%1.01
1001.13 (0.90 to 1.38)0.05 (−0.49 to 0.67)8.5%1.12

With 10 rules, the pick scores 0.80 on the test set and 0.19 afterward, and it is the real rule in only 38.4% of worlds. Without the real rule in the pool, the test-set score climbs the same way: the luck curve from Vol 2, moved one step later.

One pass is not proof: Arnott, Harvey and Markowitz (2019) describe a strategy that sorts stocks by the letters of their ticker symbols, developed on data from 1963 to 1988 and "then validated out of sample with even stronger results over the years 1989 through 2015."

Window lengths can be overfitted too

Walk-forward has its own settings: how long the build window is, how long each test is, and how often the rule is re-tuned. Choosing them by their results is one more round of tuning. The simulation ran 18 window settings (build windows of 1 to 6 years, tests of 3, 6 or 12 months), judged them all on test years 7-15, then ran the best one unchanged on untouched years 16-20.

Worked numbersReal edgeNo edge
Best of 18 window settings, years 7-15 (mean Sharpe)0.640.28
Average of the 18 settings, years 7-150.380.00
Best minus worst setting in the same world, median0.550.56
Best setting run unchanged on untouched years 16-200.380.00
Average of the 18 settings on years 16-200.390.00

Illustrative, simulated; 1,000 worlds, rolling walk-forward. The no-edge column pools the nine no-edge families.

On the untouched years, the no-edge rule's best window setting fell from 0.28 to 0.00, and the real edge's from 0.64 to 0.38, no better than the average setting. Best and worst settings in one world differed by a median of 0.55 for the real edge and 0.56 for no edge, so window choice alone moves a result by about as much as the real edge is worth.

A preprint by Mroziewicz and Ślepaczuk (2026), not yet peer reviewed, tested an exponential moving average rule across 81 window combinations and found its performance "is highly dependent on the chosen window size."

It is still one historical path

A walk-forward record is still a backtest on the one sequence of prices that happened. Daniel Palomar's lecture notes on backtesting (HKUST) state that in walk-forward "A single scenario is tested (the historical path), which can easily lead to overfitting". López de Prado's 2018 book Advances in Financial Machine Learning lists "Walk-forward (historical) backtesting" among ten common pitfalls. His remedy, combinatorial purged cross-validation, tests many build and test splits instead of one. It also drops build data whose outcomes overlap a test stretch (purging) and data just after it (an embargo), closing specific leak paths.

Look-ahead leaks survive walk-forward

Walk-forward does not catch look-ahead bias, where a test uses information that was not yet available. Valeriy Zakamulin (2018) re-examined a published moving-average timing study and showed that its "extraordinarily good" results came from "simulating trading with look-ahead bias." Once that was fixed, "the performance of the moving average strategy is indistinguishable from the performance of the buy-and-hold strategy."

What does the research say about the drop on new data?

  • The best of thousands of rules did not repeat. Sullivan, Timmermann and White (1999) tested 7,846 technical trading rules on 100 years of the Dow Jones Industrial Average. The working-paper version reports that "the superior performance of the best technical trading rule is not repeated in the out-of-sample experiment covering the ten-year period 1987-1996".
  • Published strategies lose part of their score after the paper's data ends. Quantpedia re-ran published trading strategies on the years after each source paper's sample. The median Sharpe ratio was 1.180 in-sample and 0.662 afterward, a drop of 43.90%. That later period mixes overfitting with edges that fade as markets change, so it is not a pure measure of either.

How do systematic researchers go further?

  • Wait for data that does not exist yet. Bailey and co-authors cite Leinweber and Sisk, who proposed a strategy at a conference and announced they would publish its results six months later on data not yet observed, an approach they called "model sequestration". A live record kept after a rule is frozen works the same way.
  • Count every try and test the winner against luck. The deflated Sharpe ratio from Vol 2 raises the bar with the number of rules and settings tried, including every walk-forward rerun. White's Reality Check does this formally, testing "the null hypothesis that the best model encountered in a specification search has no predictive superiority over a given benchmark model."

Common mistakes

  • Treating 50% efficiency as a tested pass mark. It is a vendor's rule of thumb.
  • Re-running the walk-forward after every tweak, or picking the best of many rules on one test set. Each is another try on the same data.
  • Choosing window lengths by their results. The best of 18 did no better than average on untouched years.
  • Calling walk-forward a forward test. A forward test, or paper trading, follows the rule live without real money, on prices that did not exist when it was built. Walk-forward uses only past data.
  • Opening the locked stretch early. Once it has been looked at, no unseen data remains.

See it on a chart: the Strategy Passport

The Strategy Passport on the NovaLens homepage uses one build and test split with a dated boundary. Its period line reads: "Tuned on data to 2025-12-31; 2026 is unseen data."

The unseen stretch runs from 2026-01-01 to 2026-10-05, about nine months (0.76 years). Under the same no-edge assumptions, that gives a luck spread of about 1.15, a general figure rather than one fitted to this strategy, so those months are one short test. The Passport also shows 71 trades, labelled "Small sample". These are published backtest figures: past results, not a forecast. Whether a rule keeps working as markets change is a separate question, the subject of Vol 5.

Rule of thumb

A walk-forward pass counts only if the test data was used once and the window settings were fixed before the test. Every extra look is one more try, and the result is still one historical path.

Sources

All accessed 2026-10-12.

  1. Pardo, R. E. (1992). Design, Testing and Optimization of Trading Systems. Wiley, New York. Attribution as given in Wikipedia, "Walk forward optimization": https://en.wikipedia.org/wiki/Walk_forward_optimization (book text not read)
  2. Pardo, R. E. (2008). The Evaluation and Optimization of Trading Strategies, 2nd edition. Wiley. Publisher page with contents: https://www.wiley-vch.de/en/areas-interest/finance-economics-law/the-evaluation-and-optimization-of-trading-strategies-978-0-470-12801-5
  3. TradeStation Walk-Forward Optimizer help: "About the Walk-Forward Optimizer" https://help.tradestation.com/09_01/tswfo/topics/about_wfo.htm; "Walk-Forward Summary (Out-Of-Sample)" https://help.tradestation.com/09_01/tswfo/topics/walk-forward_summary_out-of-sample.htm; "Test Results - Criteria" https://help.tradestation.com/09_01/tswfo/topics/walkforward_test_results.htm; FAQ https://help.tradestation.com/09_01/tswfo/topics/frequently_asked_questions.htm
  4. White, H. (2000). "A Reality Check for Data Snooping." Econometrica 68(5), 1097-1126. https://doi.org/10.1111/1468-0262.00152
  5. Sullivan, R., Timmermann, A., and White, H. (1999). "Data-Snooping, Technical Trading Rule Performance, and the Bootstrap." Journal of Finance 54(5), 1647-1691. https://doi.org/10.1111/0022-1082.00163. Quotes from the working-paper version, LSE Financial Markets Group Discussion Paper 303 (1998).
  6. Bailey, D. H., Borwein, J. M., López de Prado, M., and Zhu, Q. J. (2017). "The Probability of Backtest Overfitting." Journal of Computational Finance 20(4). Open version: https://www.davidhbailey.com/dhbpapers/backtest-prob.pdf
  7. Bailey, D. H., Borwein, J. M., López de Prado, M., and Zhu, Q. J. (2014). "Pseudo-Mathematics and Financial Charlatanism." Notices of the American Mathematical Society 61(5). Open version: https://www.davidhbailey.com/dhbpapers/backtest-pseudo.pdf
  8. Arnott, R., Harvey, C. R., and Markowitz, H. (2019). "A Backtesting Protocol in the Era of Machine Learning." Journal of Financial Data Science 1(1), 64-74. Open version: https://people.duke.edu/~charvey/Research/Published_Papers/P138_A_backtesting_protocol.pdf
  9. López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Table 1.2 in the author's excerpt: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3104847
  10. Palomar, D. P. "Backtesting Portfolios." Lecture slides, MAFS5310, HKUST. https://palomar.home.ece.ust.hk/MAFS5310_lectures/slides_backtesting.pdf
  11. Zakamulin, V. (2018). "Revisiting the Profitability of Market Timing with Moving Averages." International Review of Finance 18(2), 317-327. https://doi.org/10.1111/irfi.12132
  12. Mroziewicz, Ślepaczuk (2026). arXiv preprint 2602.10785, not peer reviewed. https://arxiv.org/abs/2602.10785
  13. Harris, M. (2013). "Fooled By Out of Sample Testing." Price Action Lab blog. https://www.priceactionlab.com/Blog/2013/05/fooled-by-out-of-sample-testing/
  14. Dujava, C. "In-Sample vs. Out-Of-Sample Analysis of Trading Strategies." Quantpedia. https://quantpedia.com/in-sample-vs-out-of-sample-analysis-of-trading-strategies/
  15. NovaLens Strategy Passport (Kalman Velocity Strategy, BTC/USD daily). https://novalens.io/#approach

Simulations: computed for this article from synthetic data (no market data). Code, seeds and outputs are kept with the article's research pack.