DEV Community

Felixwang007
Felixwang007

Posted on

Everyone Says Volume Confirms a Gap-Up. 1.9 Million A-Share Stock-Days Say the Opposite.

A gap up on heavy volume is supposed to be confirmation. A gap up on thin volume is
supposed to be a trap.

I finally had the data to check it: 641 adjusted daily bars for 3,116 Shanghai/Shenzhen
main-board stocks — 1.91 million stock-days
, running through the 2026-10-22 close, pulled
from a free public quote endpoint. No vendor, no API key, no paid feed.

The folklore is backwards. Holding gap size fixed, the below-average-volume gap beat the
3x-volume gap in every bucket I measured, on both the next day and five days out. And the
bucket most retail traders chase — opening at the board limit — was the worst one of all.

What I measured

One row per stock-day t, using split/dividend-adjusted (qfq) prices:

field definition
gap open[t] / close[t-1] - 1
vr volume[t] / mean(volume[t-20 .. t-1])
next1 close[t+1] / close[t] - 1
fwd5 close[t+5] / close[t] - 1

ST and delisting names are dropped (they have corporate-action artifacts in adjusted prices
that show up as fake gaps — one sample in the raw file printed a +632% "next day"). Everything
else on the main board is included, ~1.9M samples after cleaning.

Baseline, for reference: all stock-days, next-day mean +0.07% / median 0.00% / win 48.0%;
five-day mean +0.36% / median -0.13% / win 48.2%. The split is the drift — keep it in view,
because every number below has to beat it to mean anything.

1. Gap size alone

gap bucket n next-day mean next-day median next-day win 5-day mean 5-day median 5-day win
+2~3% 29,691 +0.49% +0.19% 52.0% +0.36% -0.45% 46.6%
+3~5% 19,332 +0.81% +0.47% 54.1% +0.32% -0.92% 44.7%
+5~9% 9,480 +0.91% +0.47% 53.1% +0.91% -1.45% 43.6%
≥9% (opens at the limit) 9,310 -0.34% -1.76% 45.4% -0.90% -6.44% 32.8%

The middle buckets do carry a next-day edge above the +0.07% baseline — modest, but real and
monotone from +2% to +9%.

Then the limit-up gap flips: median -6.4% over the next five days, with only 32.8% of cases
positive.
The trade the crowd wants most is the one with the worst distribution. If you buy
a stock because it opened limit-up, two out of three lose over the week.

2. Gap × volume ratio — the sign flips

This is the part that broke my prior. Holding gap size fixed, split by volume ratio
(limit-up gaps excluded — see the data trap at the end):

cell n next-day mean next-day median next-day win 5-day mean 5-day median 5-day win
+5~9% gap, vr<1 1,431 +2.88% +3.22% 67.6% +8.09% +3.20% 62.0%
+5~9% gap, vr 1-2 2,637 +0.87% +0.39% 52.9% +1.31% -0.44% 47.6%
+5~9% gap, vr 2-3 1,898 +0.81% +0.34% 51.8% -0.20% -1.78% 41.5%
+5~9% gap, vr>3 3,514 +0.20% -0.25% 48.0% -1.71% -3.32% 34.2%
+3~5% gap, vr<1 3,812 +1.07% +0.80% 59.4% +2.39% +0.91% 54.9%
+3~5% gap, vr>3 4,575 +0.90% +0.75% 54.8% -1.52% -2.88% 34.3%
+2~3% gap, vr<1 10,046 +0.50% +0.29% 53.7% +0.76% +0.10% 50.4%
+2~3% gap, vr>3 3,213 +0.55% +0.09% 50.4% -1.00% -2.28% 37.1%

Read the first and fourth rows against each other. Same gap size. Same 5-day horizon.
Low volume: +3.2% median, 62% win rate. 3x volume: -3.3% median, 34% win rate.

That is not a small effect, and it is not a single-cell artifact — the ordering
(vr<1 > vr 1-2 > vr 2-3 > vr>3 on the 5-day median) holds in all three gap buckets.
"Volume confirms the gap" gets the sign exactly wrong.

3. Is the mean lying? (fat-tail audit)

The tightest cell has an +8.09% mean. Before anyone backtests that, here is its distribution:

cell n mean median p25 p75 p95 share of total P&L from the best 5%
+5~9% gap, vr<1 1,424 +8.09% +3.20% -4.79% +15.22% +27.84% 54.2%
+5~9% gap, vr>3 3,497 -1.71% -3.32% -8.42% +2.53% +21.01% -104.1%

Over half of that cell's entire P&L comes from its best 5% of cases, which are the 连板
(consecutive limit-up) runs. The median, +3.2%, is what a typical trade earns; the mean is
a lottery ticket you cannot size. This is exactly the shape that makes people think a rule
works: the aggregate looks great because of a handful of 10%-per-day sequences, while the
p25 says a quarter of the entries are down nearly 5% five days later.

4. Gap-downs: no knife-catching edge

gap n next-day mean next-day median next-day win
-3~-2% 34,113 +0.06% 0.00% 49.8%
-5~-3% 21,717 -0.20% -0.27% 46.6%
≤-5% 11,266 -1.82% -1.94% 36.0%

Small gap-downs are indistinguishable from noise. Big ones keep bleeding instead of bouncing —
there is no statistical case for "it already gapped down, so it's cheap."

One live session: 2026-10-22

57 of 3,116 stocks gapped ≥+2%. 70.2% closed below their open. 66.7% filled the gap the same
day.
Nine opened at or above +9.9%:

  • 新亚制程 (002388): open +10.00%, close -10.00% — an 18.2% round trip from the open
  • 天融信 (002212): open +9.99%, close -0.29%
  • 苏州龙杰 (603332): open +9.77%, close -3.47%
  • 九牧王 (601566): open +9.38%, close -6.35%

Seven others held the limit all day. Those seven are also the data trap: a 一字板 has almost
no volume, so vr collapses toward zero and every one of them lands in the "low volume" bucket.
If you run this study without excluding limit-up gaps, you get a spectacular fake edge that is
really just "consecutive limit-ups keep going." Excluding every gap ≥9%, the volume effect
survives: vr<1 next-day +1.04% / 5-day +2.10% vs vr>3 next-day +0.50% / 5-day -1.35%.

Why this probably isn't a bug

If a stock gaps up and volume triples, someone is unloading into the gap — the volume is the
supply. If it gaps up on below-average volume, there is no overhead supply; nobody wants to
hand over shares at that price, and the next day's buyers have to pay up.

That's a statement about participation, and in A-shares heavy participation at a price spike
is frequently distribution. A much smaller study I published earlier — 15,900 stock-days on
volume-confirmation breakouts — reached the same conclusion from a different angle: the
volume-breakout bucket was the only substantially negative one. Two independent cuts, same
sign.

What I am not claiming

  • Main-board only — no ChiNext (300), STAR (688) or BSE. Those have 20%/30% limits and different microstructure; these numbers do not transfer.
  • The window drifts positive. Baseline five-day is +0.36% mean. Every bucket above is measured against that, not against zero.
  • No costs, no T+1 fill modelling. A-share T+1 means you cannot exit the gap day; all forward returns here are close-to-close.
  • Overlapping windows. I quote no t-stats on purpose — 1.9M samples sound like a lot, but five-day windows over 641 bars are heavily overlapping and not independent.
  • Adjusted-price artifacts. Delisting names were dropped after a +632% sample exposed how bad qfq data gets on restructured tickers.
  • This is a measurement of what happened. Not advice, not a strategy, not a signal you should trade. The honest summary is "the volume direction on a gap inverts the forward return" — and the fat tail says do not size it like a sure thing.

Reproduce it

Script, results JSON and the earlier studies are all here — no keys needed, feed it your own
adjusted bars:

https://github.com/Felixwang007/a-share-signal-lab

python gap_study.py path/to/history_ext     # one JSON per stock: adjusted daily bars
Enter fullscreen mode Exit fullscreen mode

If you want the packaged version as an agent-callable tool (24-indicator technical scanner,
three-pillar screener), it's running as an Apify actor here:
https://apify.com/coiled_senna/a-share-stock-mcp

If you run the gap study on your own market, the two things worth copying are the
volume cross-tab and the fat-tail audit. Bucket averages hide the shape that actually decides
whether a rule is tradeable — and in this dataset the shape said the crowd was buying the
wrong side of the gap.

Top comments (0)