Killed at G1 · Discovery

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.

Markets
US stocks (S&P 500)
Timeframe
Daily bars, held 1 to 40 sessions
Period
2005-01 to 2020-12
Tested
19 October 2026
Favourable fill bound
−0.054R / trade
t −2.44 on 7,461 trades
Pessimistic fill bound
−0.169R / trade
t −8.35 on 7,823 trades
Before costs, favourable bound
+0.035R / trade
t 1.59; costs take 0.089R a trade

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.

−400R−200R0R+200R2007200920112013201520172019−401.1R
Show the data as a table
YearTradesSum RMean R
2005184+11.6+0.063
2006342−22.2−0.065
2007446+147.7+0.331
2008101−55.7−0.552
2009455−38.8−0.085
2010464+116.8+0.252
2011347−127.1−0.366
2012491−67.9−0.138
2013799+37.2+0.047
2014457−29.6−0.065
2015355−46.3−0.130
2016558−164.6−0.295
2017724+31.3+0.043
2018543−47.0−0.087
2019610−73.5−0.120
2020585−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.

  • G7Engine parityNot reached

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.

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.

Lesson

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.

FileKindSizeStatussha256
_luk_momentum_pullback_20261019.py
experiments/_luk_momentum_pullback_20261019.py
Script5 KBComplete4ef9ec78acaf
_luk_momentum_pullback_20261019.out
experiments/_luk_momentum_pullback_20261019.out
Saved output801 BCompletec7633de3bc14
_luk_bounds_20261019.py
experiments/_luk_bounds_20261019.py
Script5 KBCompletee05ebb80dd32
_luk_bounds_20261019.out
experiments/_luk_bounds_20261019.out
Saved output374 BComplete80742301ef88
_luk_momentum_pullback_20261019_trades.csv
experiments/_luk_momentum_pullback_20261019_trades.csv
Trade list536 KBCompleteb097ec0663c7
_luk_bounds_20261019_optimistic.csv
experiments/_luk_bounds_20261019_optimistic.csv
Trade list462 KBCompleted2a4f572cf35
_luk_bounds_20261019_pessimistic.csv
experiments/_luk_bounds_20261019_pessimistic.csv
Trade list485 KBComplete43568e950550

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