run: test_7sym · 2016-04-21 → 2026-04-19 · 7 symbols

Gaps get filled. Grandpa was right.
So why can't you trade it?

Across 7 symbols and 882 strict gaps over ten years, roughly four in five gaps eventually fill. The data vindicates the folk wisdom. But a naive strategy that trades the signal loses money — Sharpe of -0.61. This page walks through why.

§1 The claim, stated precisely

A strict gap up on day t is when the day's low is higher than the previous day's high — price opened above yesterday's entire range and never came back down during the session. A strict gap down is the mirror image.

The gap is filled the first time price subsequently trades back through the prior bar's extreme (prior high for a gap up, prior low for a gap down). We measure days to fill for every gap in the universe and ask: what fraction fill within 1, 5, 20, 60 trading days?

Universe: 7 symbols over 2016–2026 (10 years). 882 strict gaps total, filtered to ≥ 0.5% of prior close.

§2 Does the data actually agree?
Yes — overwhelmingly. Nearly two-thirds of strict gaps fill within a month, and more than three-quarters within a quarter. The folk wisdom survives contact with ten years of market data.

The bar on the left (1 day) is the informative one. Roughly one-in-six gaps fill the very next session. By five days the number rises to one-in-two. By three months, four-in-five. Given enough patience, the gap usually closes.

§3 Direction and size: who fills faster?

The thesis is mostly symmetric, with one interesting asymmetry: gap-downs fill faster than gap-ups. Fear closes quicker than greed. And unsurprisingly, small gaps fill fastest — a 0.5–1% gap usually closes within a week.

Read the heatmap as: "of every gap in this size bucket, what fraction closed within this horizon?" Notice the top row — large gaps (≥5%, often news- or earnings-driven) only reach a 36% fill rate even at 60 days. That's a first hint that the gaps that are easy to trade aren't the same gaps that fill.

§4 OK — so can you make money on it?

The naive translation of the thesis: fade every qualifying gap at the next open. Short the gap-ups, long the gap-downs, target the prior extreme (the gap-fill level), 2% stop-loss, 20-day time stop. Each trade a fixed $10K notional. No portfolio constraints, just stack every independent trade in parallel.

The claim is true. The strategy loses money. Win rate under 40%. Annualized Sharpe around -0.61. That's the gap between a validated observation and a tradeable edge — and it's exactly where most "obvious" trading folklore dies.
§5 Why doesn't a true claim pay?

Three structural reasons, each visible in the numbers below.

1. The setup is asymmetric ex-ante

The target is the gap fill — for the median gap, that's about 1.08% from the gap-day close. The stop-loss is fixed at 2.00%. So before you even place the trade, the nominal reward:risk is 0.54:1 — you're risking roughly twice what you stand to make. A setup like that demands a high hit rate just to break even. The signal only delivers 37.0%.

2. The path gets you stopped before the fill arrives

Per trade, your winners are actually bigger than your losers. Targets, when they hit, pay +2.50% on average. Stops, when they hit, cost -1.84%. If you hit each equally often, you'd print money.

But stops hit 60.6% of the time and targets only 39.2%. Why? Because the thesis promises that eventually price trades back to the prior extreme — it says nothing about how violently the path gets there. A 2% stop is narrower than the typical run-up that precedes a gap-fill. The gap will close — you'll just have been stopped out three days ago.

This is the most tractable of the three problems. Widening the stop (or scaling it to realized volatility) lets the thesis actually play out. The tradeoff is larger tail losses on the gaps that don't fill — which puts the spotlight on problem #3.

3. When a stop fails, it fails big

A "2% stop" only holds if the market gives you the chance to exit at your stop price. When a gap-up is followed by another overnight gap-up on fresh earnings news, the next session opens past your stop and you exit at the open — which might be 5%, 8%, or more against you. The five worst trades below all blew through the nominal stop. Each one of them takes four or five clean target-hits to offset.

This is the tail that a mean-return summary hides: the distribution is close to symmetric around the middle but the left wing is fatter than the right, and you're living there a few times a year.

Exhibit: the five worst trades

SymbolSideEntryExit ReasonReturn
§6 The equity curve

Cumulative net PnL across every trade, stamped at its exit date. Each trade is independent fixed notional, so this is additive PnL rather than a compounding portfolio curve. The 2020 drawdown is the COVID earnings-gap cluster — many large gaps that didn't revert quickly.

§7 Where to go from here

The thesis is real; the execution is leaky. Each leak is a tunable parameter in this repo — no new code required, just a new YAML:

  • Size-dependent stops. A 2% stop on a 0.5% gap is nonsensical. Scale the stop to the gap size (e.g. stop = 1.5× gap).
  • Skip the momentum gaps. Filter out gaps above 3% or flag earnings days — those are the ones that don't fill and produce the fat-left-tail losers.
  • Require a close-near-open confirmation. If the gap day closed toward the fill (reversal bar), the setup is stronger than a gap day that closed at the extreme.
  • Scale in instead of punching in. Enter a partial at the next open and add on pullbacks toward the gap during the next few sessions — this spreads path risk across multiple entries and lets winners average in.
  • Sector / regime filter. Split by sector, or by VIX regime — fill dynamics differ wildly between calm and volatile markets.

Adding a new strategy is a ten-line subclass of Strategy — the backtester and this dashboard pick it up automatically.

§8 Gap explorer
SymbolDateDir Gap %Gap $ Prev CloseTarget Days to fill
§9 Trade log
SymbolSideEntryEntry $ ExitExit $Reason BarsReturn
§10 Config & raw summary
Config

    
Summary JSON