Momentum pullback to the 9 and 21 EMA
Buy the strongest stocks when they dip to a moving average and turn up. Negative at both fill bounds over 16 years.
Why it failed: Negative at both fill bounds: −0.054R (t −2.44) to −0.169R (t −8.35) a trade, on a stock list that favours the strategy. See the scorecard
Cumulative result
R per trade (net of spread and financing). The bound most favourable to the strategy: a stop on the entry day counts only when it certainly came after the entry.
Show the data as a table
| Year | Trades | Sum R | Mean R |
|---|---|---|---|
| 2005 | 184 | +11.6 | +0.063 |
| 2006 | 342 | −22.2 | −0.065 |
| 2007 | 446 | +147.7 | +0.331 |
| 2008 | 101 | −55.7 | −0.552 |
| 2009 | 455 | −38.8 | −0.085 |
| 2010 | 464 | +116.8 | +0.252 |
| 2011 | 347 | −127.1 | −0.366 |
| 2012 | 491 | −67.9 | −0.138 |
| 2013 | 799 | +37.2 | +0.047 |
| 2014 | 457 | −29.6 | −0.065 |
| 2015 | 355 | −46.3 | −0.130 |
| 2016 | 558 | −164.6 | −0.295 |
| 2017 | 724 | +31.3 | +0.043 |
| 2018 | 543 | −47.0 | −0.087 |
| 2019 | 610 | −73.5 | −0.120 |
| 2020 | 585 | −73.1 | −0.125 |
The claim
Take the strongest stocks of the last six months. When one rests in a tight range and pulls back to its 9- or 21-day exponential moving average, buy the turn back up with the stop under the pullback low. Sell half at 3R and hold the rest while price stays above the 9-day average.
Source: A widely shared X thread (hb_stocks, October 2026) describing the swing setup of momentum trader Martin Luk. He trades small-cap leaders and times entries on 1- to 15-minute charts; we tested a daily approximation on large US stocks, so this is not a test of his own trading.
What we tested
- Universe: the 503 current S&P 500 members, 2005 to 2020 (Discovery years only).
- Strong stock: 126-day return of at least +30% and in the top 20% of the universe that day; 20-day median dollar volume of at least $20M.
- Resting: the low of the last 5 days above the low of days 6 to 15, the 10-day average range below the 30-day average, close above both the 9- and the 21-day EMA.
- Pullback: the day's low within 1.5% of the 9- or the 21-day EMA.
- Entry: a buy stop at that day's high on the next day (a gap above it fills at the open). Stop at the signal day's low; a stop wider than 3% of the price skips the trade.
- Exits: half at +3R; the rest on the first close below the 9-day EMA, at the next open; at most 40 sessions; one position per stock.
Costs and fills
- 0.10% of the price per round trip (a stock CFD spread) plus financing of 2.1% a year on the notional for each night held. At the median stop of 1.82% that comes to about 0.09R a trade.
Data
- Tiingo daily prices, split and dividend adjusted, for the 503 current S&P 500 members
Why we looked
Momentum pullbacks are the core setup of many swing traders: buy the market leaders, but only on a quiet dip to a moving average, with a tight stop and a large target. The thread spelled out most of the rules, so we fixed them before the run and tested on the Discovery years only.
Daily bars cannot say which came first
On the day of entry a stock often trades both above the trigger and below the stop. Daily data cannot tell whether the low came before the buy order filled or after it. Our first run assumed the worst every time: entry first, then the stop. That decided 1,748 of 7,823 trades.
So we ran both bounds. Favourable: an entry-day stop counts only when it must have come after the entry, because the stock opened above the trigger or closed below the stop. Pessimistic: every entry-day touch of the stop is a loss. The truth lies in between, and both ends lose money: −0.054R a trade (t −2.44) and −0.169R (t −8.35).
Where the money goes
At the favourable bound the setup makes +0.035R a trade before costs (t 1.59), and costs take 0.089R. The stop sits a median 1.82% below the entry, so even a small spread is a large share of the risk.
Only 5 of 16 years are positive even at the favourable bound. And the stock list helps the strategy: it holds today's S&P 500 members, the companies that survived and grew. Stocks that dropped out of the index, often after failed breakouts, are missing, so a fair test would look worse.
What this does and does not say
The test does not cover the original: small-cap leaders, entries timed on minute charts, and the judgement of an experienced trader. It does say that the mechanical daily version of these rules loses money on large US stocks, and those are the only stocks a prop-firm CFD account offers: FTMO lists about 40 US mega caps.
The 12-gate scorecard
0 passed · 4 failed · 8 not run or not reached. A gate is "not reached" when the strategy had already failed a veto: there is nothing left for it to test.
Is the backtest real?
Absolute veto. These gates look for bugs and physical limits, not for statistical evidence, so one failure ends the test.
Signals use closes through the signal day and trade the next day. The stock list is today's S&P 500 members, a survivorship bias in the strategy's favour.
Entry-day order is unknown on daily bars: 1,748 of 7,823 trades stopped on the entry day at the pessimistic bound, 707 at the favourable one. Both bounds are negative.
Is the edge more than luck?
G12, one pre-registered holdout, is the only statistical veto. G1 to G5 and the regime test G6 are always reported; G6 vetoes only a regime that is significantly negative. A strategy with no edge after costs never reaches G12, because there is nothing to confirm.
Favourable bound: t −2.44 on 7,461 trades, t −1.99 on the daily portfolio. There is no positive result to hold against a bar.
No random-entry benchmark: not needed for a result that is negative at both bounds.
Favourable bound: +0.035R before costs, −0.054R after a mean cost of 0.089R a trade.
5 of 16 years positive at the favourable bound, 2 of 16 at the pessimistic one.
Validation and holdout years (2021 onwards) were not opened.
Can it survive a prop-firm account?
Absolute veto, for strategies meant for funded accounts. The account rules are simulated event by event, not at the end of the day.
A tight stop turns small costs into large ones
Costs are paid in price, but results are counted in R. With a stop 1.8% away, a 0.1% spread and a few nights of financing cost 0.09R a trade, more than the setup earned before costs even at the most favourable reading. And on daily bars, check which came first on the entry day: here that one assumption moved the result threefold.
Receipts
Every number on this page comes from one of these files: the test script, its saved output, the trade list and, where the test was pre-registered, the registration and its hash lock. Download them and check our work. Numbers that also appear in the chart are recomputed from the trade list when this page is built, and the build fails if they disagree.
| File | Kind | Size | Status | sha256 |
|---|---|---|---|---|
| _luk_momentum_pullback_20261019.py experiments/_luk_momentum_pullback_20261019.py | Script | 5 KB | Complete | 4ef9ec78acaf |
| _luk_momentum_pullback_20261019.out experiments/_luk_momentum_pullback_20261019.out | Saved output | 801 B | Complete | c7633de3bc14 |
| _luk_bounds_20261019.py experiments/_luk_bounds_20261019.py | Script | 5 KB | Complete | e05ebb80dd32 |
| _luk_bounds_20261019.out experiments/_luk_bounds_20261019.out | Saved output | 374 B | Complete | 80742301ef88 |
| _luk_momentum_pullback_20261019_trades.csv experiments/_luk_momentum_pullback_20261019_trades.csv | Trade list | 536 KB | Complete | b097ec0663c7 |
| _luk_bounds_20261019_optimistic.csv experiments/_luk_bounds_20261019_optimistic.csv | Trade list | 462 KB | Complete | d2a4f572cf35 |
| _luk_bounds_20261019_pessimistic.csv experiments/_luk_bounds_20261019_pessimistic.csv | Trade list | 485 KB | Complete | 43568e950550 |
Price data is not included: the vendors' licences do not allow it, so the scripts run only with your own copy of the data, and the trade lists show dates, direction, R and costs, not prices. Lines that refer to the lab's private live strategy are replaced by a marker; the receipts page explains the rules and lists the sha256 of every original file.
Related tests
Weak-day reversal (lower high, lower low)
Buy the break of a weak day's high. Small, positive, and not distinguishable from noise.
Intraday momentum into the close
The effect from the papers is there before costs: about 1.4 basis points a day. The spread is 0.6.