Headline findings
The naive theory is dead; the structure survives. Opening above yesterday's high-value zone is worse than a coin flip (45.5% up-rate, +8 bps n.s.) — but opening below yesterday's value bottom bounces (+19 bps, +53 bps out-of-sample). More importantly, the shape of yesterday — where the POC sat, and especially the London session's value area — carries more next-day signal than where today opens.
The below-VAL bounce is real
+19 mean day ret
+53 out-of-sample
Opening below yesterday's value bottom bounces back up — significant (p < 0.001) and stronger out-of-sample. The one open-location effect that survives.
"Open above value = bullish" fails
45.5% up-rate, above VAH
+8 mean, not significant
The classic market-profile theory — worse than a coin flip. Open location alone is not a crystal ball.
Structure of yesterday matters more
+13 POC near VAH → next day
+31 out-of-sample
Where the volume sat (POC high vs low) predicts next-day direction and survives out-of-sample — the absorption reading, not the naive one.
The London session carries the signal
-18 London VA spread
p = 0.006 only significant reference
The full-day value area most traders reference is not significant; London's is. London P-shape → next day +22 bps.
Executive summary — what the data says, in plain English
Written 2026-09-02 · 230 liquid Bybit perps · 90,283 trading days · ~522 days each
(Mar 2025 → Sep 2026) · 70% value area · UTC day profiles
What we did
Every day, the market builds a "volume profile": a picture of where the trading
actually happened over the previous 24 hours. From that picture we get three
reference prices:
- POC — the price where the most trading happened (the market's "memory point")
- VAH / VAL — the top and bottom of the value area, the zone where 70% of the day's business took place ("fair value" for that day)
We then asked: when the new day opens above, below, or inside yesterday's value
area — does that tell us anything about where the day is going? And we went
deeper: does it matter where the volume sat (POC near the top vs bottom)? Do the
individual trading sessions (Tokyo, London, New York) carry their own signals?
And what separates the days that went up from the days that went down, within each
scenario?
All results below come from real Bybit kline data, with statistical tests,
out-of-sample checks, and per-symbol consistency — and every edge is shown both
gross and after a realistic ~10 basis point round-trip trading cost.
The big picture
1. Where the day opens is NOT a crystal ball by itself
The classic market-profile theories — "open above yesterday's value = bullish day",
"open below = bearish day" — do not hold up in crypto perps:
| You open... | Day went UP | Average day return | Verdict |
|---|---|---|---|
| Above yesterday's VAH | 45.5% | +8 bps (not significant) | ❌ no real edge |
| Inside value, above POC | 46.3% | −4 bps | ❌ |
| Inside value, below POC | 47.0% | +4 bps | ❌ |
| Below yesterday's VAL | 48.9% | +19 bps (significant) | ⚠️ small bounce |
Two surprises here:
- Opening above yesterday's high-value zone gave essentially nothing — worse than a coin flip. The popular "open drive" idea (excess begets more excess) doesn't survive contact with real data.
- The one statistically real effect is the opposite of the theory: opening below yesterday's value bottom produced a mild bounce back up (+19 bps, and it got stronger out-of-sample at +53 bps). It's a small mean-reversion effect, and after costs it's marginal (+9 bps). Not a money printer — but it's real.
2. The STRUCTURE of yesterday matters more than where today opens
The interesting signal lives in how the previous day's volume was distributed:
- POC near yesterday's high (VAH) → next day slightly up (+13 bps, significant, holds out-of-sample). This supports the absorption reading — when the most trading happened at the highs, buyers were defending those prices, and that strength carried into the next day. The opposite (distribution/bearish) reading is not supported.
- POC near yesterday's low (VAL) → next day slightly down (−13 bps).
- High volatility amplified things: opening below VAL in a high-volatility environment bounced +57 bps (vs +2 bps in calm conditions); opening above VAH only worked in calm conditions (+23 bps).
So: the shape of yesterday is a real (if small) directional hint. The open
location alone is not.
3. The London session is the one that matters
This is the most practically interesting finding. We split each day into its three
trading sessions and built a separate volume profile for each — and the London
session's value area was the only reference that significantly predicted next-day
direction (spread of −17.8 bps between "open above London VA" vs "open below
London VA", p = 0.0055). The full-day value area — the one most traders use — was
not significant.
A few more session-level signals:
- A London session that closed near its highs (P-shape) → next day +22 bps (p < 0.0001) — the strongest single session effect we found, and again the opposite of the naive "distribution = bearish" story.
- Which session dominated the previous day matters: Tokyo-heavy day → next day +13 bps; London-heavy day → next day −11 bps; NY-heavy → +10 bps.
- Session "momentum" (a strong Tokyo, London, or NY move carrying into the next day) exists but is thin (+8–10 bps).
4. The "first hour predicts the day" theory mostly fails too
- Only 43–46% of the time does the first hour even continue the direction of an outside-the-value open. The "opening drive" idea is falsified.
- The first hour's direction does line up with the day's direction about 60% of the time — but that's only knowable after the first hour, and the payoff difference is small. Not exploitable at the open.
5. Gaps tend to fill — but slowly
About 80% of days that open outside yesterday's value area return into it at
some point during the day. So fading an overextended open has eventual support —
but it's not a fast or clean edge.
What separates UP days from DOWN days? (factual vs counterfactual)
For each scenario we compared the days that went up vs the days that went down,
using only information known at the open:
- On days that opened above yesterday's value high, the UP days came from calmer, buyer-heavy prior days: lower prior volatility, more volume sitting in the upper half of the prior profile, and a Tokyo POC positioned higher. In other words, an above-value open after a quiet, accumulation-style day behaves differently from one after a wild, distribution-style day.
- On days that opened below yesterday's value low, the UP days had a wider prior New York value area and a thinner London presence — suggesting the bounce is more reliable after an NY session that ranged widely.
A simple decision tree using these prior-day/session features nudges accuracy from
~51–55% (base rate) to ~54–55% out-of-sample. Real but small — it's structure
discovery, not yet a tradeable signal.
The honest caveats
1. Effects are small. Most are 10–25 bps — the size of the bid-ask spread.
Only a few survive a 10 bps round-trip cost, and barely.
2. Per-symbol agreement is weak (46–60% of symbols agree with the pooled
direction). These are tendencies across the market, not laws that hold for
every coin. Some symbols will behave opposite.
3. This is 522 days of one regime. Crypto structure can change; treat these as
historical statistics, not guarantees.
4. The trees' out-of-sample improvement is ~0.5–2 points over guessing the
majority. Genuine but thin — any strategy built on this needs strict cost
awareness, per-symbol gates, and walk-forward validation (the lessons from our
earlier ORB and overnight-drift research apply here too).
What this means in practice
- Don't trade "open above/below value = direction". The naive version is dead. The below-VAL bounce is the only raw effect worth respecting, and only in high-volatility conditions.
- Watch the London session. Its value area and shape carry more next-day signal than the full-day profile most people reference. London P-shape → positive next day is the single most robust session finding.
- Use the structure, not the level. Yesterday's POC position (high vs low) and the prior volatility regime tell you more than where today's open falls.
- The framework is now the asset. The code, data, and site let us test any refinement — session-by-session leads, per-symbol filters, cost-aware backtests — without re-building anything.
Full numbers behind every claim: see the tables on this page, or the detailed
findings report below.
H1–H3 · Day return by open location vs prior-day profile
| Group | N | Mean (bps) | Median (bps) | Win % | t | p | OOS mean (bps) | OOS p | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| above_VAH | 16,864 | +8 | -35 | 45.5% | 1.36 | 0.173 | +10 | 0.227 | n.s. |
| VA_above_POC | 25,597 | -4 | -28 | 46.3% | -0.74 | 0.459 | +7 | 0.315 | n.s. |
| VA_below_POC | 27,581 | +4 | -24 | 47.0% | 0.78 | 0.437 | -7 | 0.242 | n.s. |
| below_VAL | 20,011 | +19 | -9 | 48.9% | 4.13 | <0.001 | +53 | <0.001 | sig + OOS |
Mean open→close return in bps by where the day opened relative to the prior day's 70% value area (VAH/VAL/POC). OOS = out-of-sample split. Only below_VAL is significant and holds out-of-sample.
H4 · Excess magnitude scaling (OLS slope per VA-width, corr)
| Group | N | OLS slope (bps/VA-width) | Pearson r | Spearman ρ | ρ p | Verdict |
|---|---|---|---|---|---|---|
| dist_above_VAH | 16,864 | -28.71 | -0.017 | -0.009 | 0.247 | — |
| dist_below_VAL | 20,011 | 0.00 | 0.002 | -0.017 | 0.018 | — |
H7–H9 · Prior-day POC position zone → next-day return
| Group | N | Mean (bps) | Median (bps) | Win % | t | p | OOS mean (bps) | OOS p | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| poc_near_VAL | 23,104 | -13 | -38 | 45.4% | -2.61 | 0.009 | -19 | 0.006 | sig + OOS |
| poc_central | 45,177 | +12 | -21 | 47.5% | 3.32 | <0.001 | +11 | 0.023 | sig + OOS |
| poc_near_VAH | 21,772 | +13 | -19 | 47.6% | 2.56 | 0.010 | +31 | <0.001 | sig + OOS |
Where the most trading happened (POC) in the prior day's range predicts next-day direction — all three zones are significant and hold out-of-sample.
H10 · Prior VA width band → next-day return & range
| Group | N | Mean (bps) | Median (bps) | Win % | t | p | Next-day range % | Verdict |
|---|---|---|---|---|---|---|---|---|
| va_narrow | 45,017 | -2 | -27 | 46.5% | -0.41 | 0.680 | 10.21% | n.s. |
| va_wide | 45,036 | +13 | -22 | 47.4% | 3.93 | <0.001 | 9.73% | sig |
H11 · Prior-day profile shape → next-day return & range
| Group | N | Mean (bps) | Median (bps) | Win % | t | p | Next-day range % | Verdict |
|---|---|---|---|---|---|---|---|---|
| shape_P | 19,973 | +14 | -20 | 47.5% | 2.58 | 0.010 | 9.82% | sig |
| shape_b | 22,372 | -13 | -38 | 45.2% | -2.43 | 0.015 | 11.04% | sig |
| shape_D | 47,708 | +11 | -20 | 47.5% | 3.42 | <0.001 | 9.53% | sig |
H15 · Open-location effect by ATR regime (low/high tercile)
| Group | N | Mean (bps) | Median (bps) | Win % | t | p | Verdict |
|---|---|---|---|---|---|---|---|
| above_VAH_atr_low | 6,966 | +26 | -10 | 48.3% | 4.02 | <0.001 | sig |
| above_VAH_atr_high | 4,547 | -16 | -99 | 41.7% | -1.12 | 0.263 | n.s. |
| below_VAL_atr_low | 8,273 | +5 | -18 | 47.5% | 0.83 | 0.405 | n.s. |
| below_VAL_atr_high | 5,700 | +40 | +1 | 50.0% | 3.83 | <0.001 | sig |
Opening below VAL in a high-volatility environment is where the bounce concentrates (+40 bps).
H16 · Open-location effect by trend regime (daily EMA20)
| Group | N | Mean (bps) | Median (bps) | Win % | t | p | Verdict |
|---|---|---|---|---|---|---|---|
| above_VAH_trend_up | 8,474 | +20 | -22 | 47.4% | 2.23 | 0.026 | sig |
| above_VAH_trend_down | 8,390 | -5 | -47 | 43.5% | -0.67 | 0.505 | n.s. |
| below_VAL_trend_up | 5,342 | +17 | -6 | 49.3% | 1.64 | 0.101 | n.s. |
| below_VAL_trend_down | 14,669 | +20 | -11 | 48.8% | 3.91 | <0.001 | sig |
H5–H6 · First-hour drive & day leadership
| Group | N | Open-drive rate | Drive p | 1h mean (bps) | Day follows 1h | Day ret | 1h up | Day ret | 1h dn | Verdict |
|---|---|---|---|---|---|---|---|---|
| drive_above_VAH | 16,864 | 43.4% | <0.001 | -7 | — | — | — | — |
| lead_above_VAH | 16,864 | — | — | — | 60.3% | +138 | -92 | — |
| drive_below_VAL | 20,011 | 46.1% | <0.001 | -1 | — | — | — | — |
| lead_below_VAL | 20,011 | — | — | — | 58.0% | +103 | -80 | — |
The "opening drive" theory mostly fails: only 43–46% of outside-value opens continue in the first hour (p ≪ 0.001, but in the wrong direction for the theory).
H12–H13 · Fill-back into prior VA
| Group | N | Fill rate | Verdict |
|---|---|---|---|
| fill_above_VAH | 16,864 | 79.5% | — |
| fill_below_VAL | 20,011 | 77.7% | — |
About 80% of days that open outside the prior value area return into it at some point — eventual support for fading overextended opens, but slow.
S1 · Open vs prior NY/London/Tokyo session VA vs full-day VA
| Reference | Bucket | N | Mean (bps) | Win % | t | p | Verdict |
|---|---|---|---|---|---|---|---|
| full_day | VA_above_POC | 25,597 | -4 | 46.3% | -0.74 | 0.459 | n.s. |
| full_day | VA_below_POC | 27,581 | +4 | 47.0% | 0.78 | 0.437 | n.s. |
| full_day | above_VAH | 16,864 | +8 | 45.5% | 1.36 | 0.173 | n.s. |
| full_day | below_VAL | 20,011 | +19 | 48.9% | 4.13 | <0.001 | sig |
| full_day | SPREAD(abv-blw) | 36,875 | -12 | — | -1.62 | 0.106 | n.s. |
| tokyo | VA_above_POC | 10,860 | +7 | 45.6% | 0.71 | 0.478 | n.s. |
| tokyo | VA_below_POC | 10,824 | -13 | 46.3% | -1.87 | 0.061 | n.s. |
| tokyo | above_VAH | 31,175 | +8 | 45.3% | 1.79 | 0.073 | n.s. |
| tokyo | below_VAL | 36,999 | +9 | 49.0% | 2.50 | 0.012 | sig |
| tokyo | SPREAD(abv-blw) | 68,174 | -1 | — | -0.15 | 0.881 | n.s. |
| london | VA_above_POC | 15,458 | -17 | 44.9% | -2.79 | 0.005 | sig |
| london | VA_below_POC | 16,030 | -9 | 46.6% | -1.50 | 0.133 | n.s. |
| london | above_VAH | 27,740 | +7 | 45.7% | 1.29 | 0.197 | n.s. |
| london | below_VAL | 30,825 | +24 | 49.2% | 6.23 | <0.001 | sig |
| london | SPREAD(abv-blw) | 58,565 | -18 | — | -2.78 | 0.006 | sig |
| ny | VA_above_POC | 22,454 | +8 | 47.3% | 1.42 | 0.157 | n.s. |
| ny | VA_below_POC | 23,047 | +1 | 46.5% | 0.18 | 0.860 | n.s. |
| ny | above_VAH | 21,410 | +6 | 46.5% | 0.97 | 0.333 | n.s. |
| ny | below_VAL | 23,142 | +9 | 47.5% | 2.03 | 0.042 | sig |
| ny | SPREAD(abv-blw) | 44,552 | -4 | — | -0.48 | 0.630 | n.s. |
London is the only session reference whose value area significantly predicts next-day direction (spread of open-above minus open-below). The full-day VA most traders use is not significant.
S2 · Prior-day session shape → next-day return
| Bucket | Group | Session | N | Mean (bps) | Median (bps) | Win % | t | p | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| tokyo_shape | D | tokyo | 46,609 | +5 | -24 | 47.0% | 1.41 | 0.159 | n.s. |
| tokyo_shape | P | tokyo | 19,965 | +11 | -10 | 48.5% | 2.04 | 0.041 | sig |
| tokyo_shape | b | tokyo | 23,284 | +2 | -39 | 45.6% | 0.39 | 0.700 | n.s. |
| london_shape | D | london | 48,929 | +4 | -25 | 46.8% | 1.21 | 0.224 | n.s. |
| london_shape | P | london | 18,428 | +22 | -15 | 48.2% | 3.91 | <0.001 | sig |
| london_shape | b | london | 22,696 | -4 | -31 | 46.3% | -0.73 | 0.467 | n.s. |
| ny_shape | D | ny | 47,654 | +7 | -24 | 47.0% | 2.17 | 0.030 | sig |
| ny_shape | P | ny | 19,853 | -5 | -34 | 45.8% | -0.82 | 0.414 | n.s. |
| ny_shape | b | ny | 22,546 | +12 | -16 | 48.0% | 2.28 | 0.022 | sig |
A London session that closed near its highs (P-shape) → next day +22 bps (p < 0.0001) — the strongest single session effect.
S3 · Prior-day session return (momentum) → next-day return
| Session | Prior move | N | Mean (bps) | Win % | t | p | Verdict |
|---|---|---|---|---|---|---|---|
| tokyo | up | 43,601 | +8 | 46.8% | 2.28 | 0.022 | sig |
| tokyo | down | 45,929 | +3 | 47.1% | 0.74 | 0.462 | n.s. |
| london | up | 42,432 | +2 | 45.2% | 0.41 | 0.681 | n.s. |
| london | down | 47,307 | +10 | 48.6% | 2.80 | 0.005 | sig |
| ny | up | 43,394 | +7 | 45.8% | 2.00 | 0.046 | sig |
| ny | down | 46,309 | +4 | 48.1% | 1.29 | 0.198 | n.s. |
S4 · Prior-day dominant session (by turnover share) → next-day
| Session | N | Mean (bps) | Win % | t | p | Verdict |
|---|---|---|---|---|---|---|
| tokyo | 26,634 | +13 | 47.9% | 2.41 | 0.016 | sig |
| london | 22,777 | -11 | 46.5% | -2.36 | 0.018 | sig |
| ny | 40,447 | +10 | 46.7% | 2.87 | 0.004 | sig |
Tokyo-heavy prior day → next day +13 bps; London-heavy → −11 bps; NY-heavy → +10 bps.
S5 · Prior-day session VA width → next-day range
| Session | VA band | N | Next-day range % | Mean (bps) | t | p | Verdict |
|---|---|---|---|---|---|---|---|
| tokyo | narrow | 44,929 | 9.72% | +1 | 110.42 | <0.001 | sig |
| tokyo | wide | 44,929 | 10.18% | +10 | 111.83 | <0.001 | sig |
| london | narrow | 45,022 | 9.93% | +14 | 111.02 | <0.001 | sig |
| london | wide | 45,031 | 10.01% | -3 | 111.32 | <0.001 | sig |
| ny | narrow | 45,023 | 10.16% | -11 | 97.36 | <0.001 | sig |
| ny | wide | 45,030 | 9.78% | +22 | 135.72 | <0.001 | sig |
CF · What separates UP days from DOWN days?
Within each open-location scenario, feature means for UP days vs DOWN days — all features known at the open. |d| = Cohen's d. Simple decision trees using these prior-day/session features nudge accuracy from ~51–55% to ~54–55% out-of-sample: real but small.
Decision trees · Joint conditions separating UP from DOWN
========================================================================
Scenario: above_VAH | n=16851 | base rate=0.545 | train acc=0.548 | OOS acc=0.552 | leaves=8
top features: {'prev_atr14_pct': np.float64(0.3617645818439843), 'tokyo_ret': np.float64(0.20610582300596106), 'tokyo_poc_pos': np.float64(0.19360515407199874), 'london_poc_pos': np.float64(0.12398143427810583), 'ny_ret': np.float64(0.11454300679995005), 'poc_pos': np.float64(0.0), 'va_width_ratio': np.float64(0.0), 'upper_share': np.float64(0.0)}
|--- prev_atr14_pct <= 0.63
| |--- tokyo_ret <= -0.03
| | |--- tokyo_poc_pos <= 0.26
| | | |--- class: 0
| | |--- tokyo_poc_pos > 0.26
| | | |--- class: 0
| |--- tokyo_ret > -0.03
| | |--- london_poc_pos <= 0.83
| | | |--- class: 0
| | |--- london_poc_pos > 0.83
| | | |--- class: 1
|--- prev_atr14_pct > 0.63
| |--- tokyo_poc_pos <= 0.28
| | |--- tokyo_ret <= -0.04
| | | |--- class: 0
| | |--- tokyo_ret > -0.04
| | | |--- class: 0
| |--- tokyo_poc_pos > 0.28
| | |--- ny_ret <= 0.12
| | | |--- class: 0
| | |--- ny_ret > 0.12
| | | |--- class: 0
========================================================================
Scenario: VA_above_POC | n=25540 | base rate=0.536 | train acc=0.542 | OOS acc=0.527 | leaves=8
top features: {'prev_atr14_pct': np.float64(0.2895973153322696), 'tokyo_turnover_share': np.float64(0.21846016572424576), 'tokyo_upper_share': np.float64(0.1682695309619286), 'tokyo_ret': np.float64(0.12602870354059006), 'tokyo_va_width_ratio': np.float64(0.10445084984162627), 'london_ret': np.float64(0.09319343459933974), 'poc_pos': np.float64(0.0), 'va_width_ratio': np.float64(0.0)}
|--- prev_atr14_pct <= 0.79
| |--- tokyo_upper_share <= 0.43
| | |--- tokyo_ret <= -0.06
| | | |--- class: 1
| | |--- tokyo_ret > -0.06
| | | |--- class: 0
| |--- tokyo_upper_share > 0.43
| | |--- tokyo_turnover_share <= 0.69
| | | |--- class: 1
| | |--- tokyo_turnover_share > 0.69
| | | |--- class: 0
|--- prev_atr14_pct > 0.79
| |--- tokyo_va_width_ratio <= 0.42
| | |--- tokyo_turnover_share <= 0.23
| | | |--- class: 0
| | |--- tokyo_turnover_share > 0.23
| | | |--- class: 0
| |--- tokyo_va_width_ratio > 0.42
| | |--- london_ret <= -0.00
| | | |--- class: 0
| | |--- london_ret > -0.00
| | | |--- class: 0
========================================================================
Scenario: VA_below_POC | n=27500 | base rate=0.529 | train acc=0.536 | OOS acc=0.540 | leaves=8
top features: {'london_ret': np.float64(0.4343162692928736), 'ny_ret': np.float64(0.16263721123582817), 'ny_turnover_share': np.float64(0.11169816381567564), 'tokyo_ret': np.float64(0.1090231717559656), 'ny_poc_pos': np.float64(0.0954869289535156), 'london_upper_share': np.float64(0.08683825494614136), 'poc_pos': np.float64(0.0), 'va_width_ratio': np.float64(0.0)}
|--- london_ret <= 0.00
| |--- london_ret <= -0.03
| | |--- ny_poc_pos <= 0.25
| | | |--- class: 1
| | |--- ny_poc_pos > 0.25
| | | |--- class: 0
| |--- london_ret > -0.03
| | |--- ny_ret <= -0.03
| | | |--- class: 1
| | |--- ny_ret > -0.03
| | | |--- class: 0
|--- london_ret > 0.00
| |--- tokyo_ret <= -0.02
| | |--- ny_turnover_share <= 0.52
| | | |--- class: 0
| | |--- ny_turnover_share > 0.52
| | | |--- class: 0
| |--- tokyo_ret > -0.02
| | |--- london_upper_share <= 0.40
| | | |--- class: 0
| | |--- london_upper_share > 0.40
| | | |--- class: 0
========================================================================
Scenario: below_VAL | n=19967 | base rate=0.511 | train acc=0.554 | OOS acc=0.536 | leaves=8
top features: {'tokyo_ret': np.float64(0.1908206397089765), 'london_ret': np.float64(0.1717652751368205), 'london_turnover_share': np.float64(0.16075405149767782), 'tokyo_turnover_share': np.float64(0.15763153578453465), 'ny_turnover_share': np.float64(0.13443368759667546), 'open_dist_va': np.float64(0.09884091288690967), 'ny_va_width_ratio': np.float64(0.08575389738840541), 'poc_pos': np.float64(0.0)}
|--- tokyo_ret <= -0.01
| |--- london_ret <= -0.00
| | |--- london_turnover_share <= 0.52
| | | |--- class: 1
| | |--- london_turnover_share > 0.52
| | | |--- class: 0
| |--- london_ret > -0.00
| | |--- ny_va_width_ratio <= 0.65
| | | |--- class: 0
| | |--- ny_va_width_ratio > 0.65
| | | |--- class: 1
|--- tokyo_ret > -0.01
| |--- tokyo_turnover_share <= 0.38
| | |--- open_dist_va <= -1.16
| | | |--- class: 0
| | |--- open_dist_va > -1.16
| | | |--- class: 0
| |--- tokyo_turnover_share > 0.38
| | |--- ny_turnover_share <= 0.23
| | | |--- class: 0
| | |--- ny_turnover_share > 0.23
| | | |--- class: 1
H17 · Per-symbol stability (robustness)
Per-symbol agreement with the pooled direction. These are market-wide tendencies, not laws that hold for every coin.
| Location | N symbols | Agree | Frac agree | Binom p | Pooled mean (bps) | Median sym mean (bps) | Sym + | Sym − | Verdict |
|---|---|---|---|---|---|---|---|---|---|
| above_VAH | 229 | 107 | 46.7% | 0.355 | +0 | -5 | 107 | 122 | — |
| VA_above_POC | 230 | 131 | 57.0% | 0.041 | -5 | -8 | 99 | 131 | — |
| VA_below_POC | 230 | 109 | 47.4% | 0.468 | +8 | -3 | 109 | 121 | — |
| below_VAL | 230 | 137 | 59.6% | 0.004 | +30 | +12 | 137 | 93 | — |
Findings report
Volume Profile Open-Location Findings — 2026-09-02
_Generated from real Bybit 15m klines. All returns are open→close in basis points unless stated. net = mean − 10bps round-trip cost. sig = OOS p < 0.05. See PLAN.md for hypothesis definitions._
Dataset: 230 symbols · 90283 symbol-days · 522 UTC days · 2025-03-30 → 2026-09-02
H4 · Excess magnitude scaling (OLS slope per VA-width, corr)
| group | n | OLS slope (bps per VA-width) | Pearson r | Spearman ρ | ρ p |
|---|---|---|---|---|---|
| dist_above_VAH | 16864 | -28.7 | -0.017 | -0.009 | 2.47e-01 |
| dist_below_VAL | 20011 | +0.0 | +0.002 | -0.017 | 1.83e-02 |
H1–H3 · Day return by open location vs prior-day profile
| group | n | mean(bps) | net(bps) | win | t | p (adj) | OOS mean | OOS p | sig |
|---|---|---|---|---|---|---|---|---|---|
| above_VAH | 16864 | +8 | -2 | 45.5% | 1.36 | 1.73e-01 | +10 | 2.27e-01 | ❌ |
| VA_above_POC | 25597 | -4 | -14 | 46.3% | -0.74 | 4.59e-01 | +7 | 3.15e-01 | ❌ |
| VA_below_POC | 27581 | +4 | -6 | 47.0% | 0.78 | 4.37e-01 | -7 | 2.42e-01 | ❌ |
| below_VAL | 20011 | +19 | +9 | 48.9% | 4.13 | 3.57e-05 | +53 | <1e-6 | ✅ |
H7–H9 · Prior-day POC position zone → next-day return
| group | n | mean(bps) | net(bps) | win | t | p (adj) | OOS mean | OOS p | sig |
|---|---|---|---|---|---|---|---|---|---|
| poc_near_VAL | 23104 | -13 | -23 | 45.4% | -2.61 | 9.04e-03 | -19 | 5.60e-03 | ✅ |
| poc_central | 45177 | +12 | +2 | 47.5% | 3.32 | 8.97e-04 | +11 | 2.29e-02 | ✅ |
| poc_near_VAH | 21772 | +13 | +3 | 47.6% | 2.56 | 1.04e-02 | +31 | 1.83e-04 | ✅ |
H10 · Prior VA width band → next-day return & range
| group | n | mean(bps) | net(bps) | win | t | p (adj) | OOS mean | OOS p | sig |
|---|---|---|---|---|---|---|---|---|---|
| va_narrow | 45017 | -2 | -12 | 46.5% | -0.41 | 6.80e-01 | — | — | ❌ |
| va_wide | 45036 | +13 | +3 | 47.4% | 3.93 | 8.36e-05 | — | — | ❌ |
H11 · Prior-day profile shape → next-day return & range
| group | n | mean(bps) | net(bps) | win | t | p (adj) | OOS mean | OOS p | sig |
|---|---|---|---|---|---|---|---|---|---|
| shape_P | 19973 | +14 | +4 | 47.5% | 2.58 | 9.89e-03 | — | — | ❌ |
| shape_b | 22372 | -13 | -23 | 45.2% | -2.43 | 1.53e-02 | — | — | ❌ |
| shape_D | 47708 | +11 | +1 | 47.5% | 3.42 | 6.35e-04 | — | — | ❌ |
H15 · Open-location effect by ATR regime (low/high tercile)
| group | n | mean(bps) | net(bps) | win | t | p (adj) | OOS mean | OOS p | sig |
|---|---|---|---|---|---|---|---|---|---|
| above_VAH_atr_low | 6966 | +26 | +16 | 48.3% | 4.02 | 5.91e-05 | — | — | ❌ |
| above_VAH_atr_high | 4547 | -16 | -26 | 41.7% | -1.12 | 2.63e-01 | — | — | ❌ |
| below_VAL_atr_low | 8273 | +5 | -5 | 47.5% | 0.83 | 4.05e-01 | — | — | ❌ |
| below_VAL_atr_high | 5700 | +40 | +30 | 50.0% | 3.83 | 1.28e-04 | — | — | ❌ |
H16 · Open-location effect by trend regime (daily EMA20)
| group | n | mean(bps) | net(bps) | win | t | p (adj) | OOS mean | OOS p | sig |
|---|---|---|---|---|---|---|---|---|---|
| above_VAH_trend_up | 8474 | +20 | +10 | 47.4% | 2.23 | 2.60e-02 | — | — | ❌ |
| above_VAH_trend_down | 8390 | -5 | -15 | 43.5% | -0.67 | 5.05e-01 | — | — | ❌ |
| below_VAL_trend_up | 5342 | +17 | +7 | 49.3% | 1.64 | 1.01e-01 | — | — | ❌ |
| below_VAL_trend_down | 14669 | +20 | +10 | 48.8% | 3.91 | 9.40e-05 | — | — | ❌ |
H5–H6 · First-hour drive & day leadership
| group | n | open-drive rate | 1h mean(bps) | day-follows-1h | day ret \ | 1h up(bps) | day ret \ | 1h dn(bps) |
|---|---|---|---|---|---|---|---|---|
| drive_above_VAH | 16864 | 43.4% | -7 | — | — | — | ||
| lead_above_VAH | 16864 | — | — | 60.3% | +138 | -92 | ||
| drive_below_VAL | 20011 | 46.1% | -1 | — | — | — | ||
| lead_below_VAL | 20011 | — | — | 58.0% | +103 | -80 |
H12–H13 · Fill-back into prior VA
| group | n | fill rate |
|---|---|---|
| fill_above_VAH | 16864 | 79.5% |
| fill_below_VAL | 20011 | 77.7% |
H17 · Per-symbol stability (robustness)
| loc | n_symbols | frac_agree | binom p | pooled mean(bps) | median sym mean(bps) | sym+ | sym− |
|---|---|---|---|---|---|---|---|
| above_VAH | 229 | 46.7% | 3.55e-01 | +0 | -5 | 107 | 122 |
| VA_above_POC | 230 | 57.0% | 4.07e-02 | -5 | -8 | 99 | 131 |
| VA_below_POC | 230 | 47.4% | 4.68e-01 | +8 | -3 | 109 | 121 |
| below_VAL | 230 | 59.6% | 4.47e-03 | +30 | +12 | 137 | 93 |
_Report auto-generated by src/report.py. Re-run src/analysis.py + src/report.py after a fetch to refresh._
S1 · Open vs prior NY/London/Tokyo session VA vs full-day VA
| ref | bucket | n | mean(bps) | win | t | p |
|---|---|---|---|---|---|---|
| full_day | VA_above_POC | 25597 | -4 | 46.3% | -0.74 | 4.59e-01 |
| full_day | VA_below_POC | 27581 | +4 | 47.0% | 0.78 | 4.37e-01 |
| full_day | above_VAH | 16864 | +8 | 45.5% | 1.36 | 1.73e-01 |
| full_day | below_VAL | 20011 | +19 | 48.9% | 4.13 | 3.57e-05 |
| full_day | SPREAD(abv-blw) | 36875 | -12 | — | -1.62 | 1.06e-01 |
| tokyo | VA_above_POC | 10860 | +7 | 45.6% | 0.71 | 4.78e-01 |
| tokyo | VA_below_POC | 10824 | -13 | 46.3% | -1.87 | 6.09e-02 |
| tokyo | above_VAH | 31175 | +8 | 45.3% | 1.79 | 7.31e-02 |
| tokyo | below_VAL | 36999 | +9 | 49.0% | 2.50 | 1.23e-02 |
| tokyo | SPREAD(abv-blw) | 68174 | -1 | — | -0.15 | 8.81e-01 |
| london | VA_above_POC | 15458 | -17 | 44.9% | -2.79 | 5.25e-03 |
| london | VA_below_POC | 16030 | -9 | 46.6% | -1.50 | 1.33e-01 |
| london | above_VAH | 27740 | +7 | 45.7% | 1.29 | 1.97e-01 |
| london | below_VAL | 30825 | +24 | 49.2% | 6.23 | <1e-6 |
| london | SPREAD(abv-blw) | 58565 | -18 | — | -2.78 | 5.52e-03 |
| ny | VA_above_POC | 22454 | +8 | 47.3% | 1.42 | 1.57e-01 |
| ny | VA_below_POC | 23047 | +1 | 46.5% | 0.18 | 8.60e-01 |
| ny | above_VAH | 21410 | +6 | 46.5% | 0.97 | 3.33e-01 |
| ny | below_VAL | 23142 | +9 | 47.5% | 2.03 | 4.19e-02 |
| ny | SPREAD(abv-blw) | 44552 | -4 | — | -0.48 | 6.30e-01 |
S2 · Prior-day session shape → next-day return
| session | shape | n | mean(bps) | win | t | p |
|---|---|---|---|---|---|---|
| tokyo | D | 46609 | +5 | 47.0% | 1.41 | 1.59e-01 |
| tokyo | P | 19965 | +11 | 48.5% | 2.04 | 4.10e-02 |
| tokyo | b | 23284 | +2 | 45.6% | 0.39 | 7.00e-01 |
| london | D | 48929 | +4 | 46.8% | 1.21 | 2.24e-01 |
| london | P | 18428 | +22 | 48.2% | 3.91 | 9.10e-05 |
| london | b | 22696 | -4 | 46.3% | -0.73 | 4.67e-01 |
| ny | D | 47654 | +7 | 47.0% | 2.17 | 3.02e-02 |
| ny | P | 19853 | -5 | 45.8% | -0.82 | 4.14e-01 |
| ny | b | 22546 | +12 | 48.0% | 2.28 | 2.25e-02 |
S3 · Prior-day session return (momentum) → next-day return
| session | prior session | n | mean(bps) | win | t | p |
|---|---|---|---|---|---|---|
| tokyo | up | 43601 | +8 | 46.8% | 2.28 | 2.23e-02 |
| tokyo | down | 45929 | +3 | 47.1% | 0.74 | 4.62e-01 |
| london | up | 42432 | +2 | 45.2% | 0.41 | 6.81e-01 |
| london | down | 47307 | +10 | 48.6% | 2.80 | 5.15e-03 |
| ny | up | 43394 | +7 | 45.8% | 2.00 | 4.57e-02 |
| ny | down | 46309 | +4 | 48.1% | 1.29 | 1.98e-01 |
S4 · Prior-day dominant session (by turnover share) → next-day
| session | n | mean(bps) | win | t | p |
|---|---|---|---|---|---|
| tokyo | 26634 | +13 | 47.9% | 2.41 | 1.62e-02 |
| london | 22777 | -11 | 46.5% | -2.36 | 1.83e-02 |
| ny | 40447 | +10 | 46.7% | 2.87 | 4.17e-03 |
S5 · Prior-day session VA width → next-day range
| session | VA band | n | next-day range % | mean ret(bps) | p |
|---|---|---|---|---|---|
| tokyo | narrow | 44929 | 9.72% | +1 | <1e-6 |
| tokyo | wide | 44929 | 10.18% | +10 | <1e-6 |
| london | narrow | 45022 | 9.93% | +14 | <1e-6 |
| london | wide | 45031 | 10.01% | -3 | <1e-6 |
| ny | narrow | 45023 | 10.16% | -11 | <1e-6 |
| ny | wide | 45030 | 9.78% | +22 | <1e-6 |
CF · Factual vs counterfactual: what separates UP from DOWN days?
_Within each open-location scenario, feature means for UP days vs DOWN days (all features known at the open). |d| = Cohen's d._
| scenario | feature | n_up | n_dn | mean UP | mean DN | diff | t | p | d |
|---|---|---|---|---|---|---|---|---|---|
| above_VAH | poc_pos | 7666 | 9198 | 0.3811 | 0.3740 | +0.0071 | 2.70 | 6.84e-03 | +0.04 |
| above_VAH | va_width_ratio | 7666 | 9198 | 0.4843 | 0.4790 | +0.0052 | 2.98 | 2.87e-03 | +0.05 |
| above_VAH | upper_share | 7666 | 9198 | 0.4306 | 0.4199 | +0.0107 | 4.93 | <1e-6 | +0.08 |
| above_VAH | open_dist_va | 7666 | 9198 | 0.3944 | 0.4219 | -0.0275 | -4.17 | 3.13e-05 | -0.06 |
| above_VAH | tokyo_poc_pos | 7659 | 9192 | 0.4937 | 0.4803 | +0.0133 | 4.32 | 1.58e-05 | +0.07 |
| above_VAH | tokyo_va_width_ratio | 7659 | 9192 | 0.4774 | 0.4783 | -0.0009 | -0.57 | 5.69e-01 | -0.01 |
| above_VAH | tokyo_upper_share | 7659 | 9192 | 0.4884 | 0.4797 | +0.0087 | 3.65 | 2.64e-04 | +0.06 |
| above_VAH | tokyo_turnover_share | 7659 | 9192 | 0.3311 | 0.3347 | -0.0037 | -1.90 | 5.80e-02 | -0.03 |
| above_VAH | tokyo_ret | 7659 | 9192 | 0.0018 | 0.0016 | +0.0002 | 0.39 | 6.99e-01 | +0.01 |
| above_VAH | london_poc_pos | 7666 | 9198 | 0.4590 | 0.4598 | -0.0008 | -0.25 | 7.99e-01 | -0.00 |
| above_VAH | london_va_width_ratio | 7666 | 9198 | 0.4896 | 0.4881 | +0.0015 | 0.92 | 3.58e-01 | +0.01 |
| above_VAH | london_upper_share | 7666 | 9198 | 0.4783 | 0.4723 | +0.0060 | 2.73 | 6.38e-03 | +0.04 |
| above_VAH | london_turnover_share | 7666 | 9198 | 0.3805 | 0.3753 | +0.0052 | 2.99 | 2.75e-03 | +0.05 |
| above_VAH | london_ret | 7666 | 9198 | 0.0145 | 0.0155 | -0.0010 | -1.79 | 7.37e-02 | -0.03 |
| above_VAH | ny_poc_pos | 7666 | 9198 | 0.5038 | 0.5043 | -0.0005 | -0.16 | 8.75e-01 | -0.00 |
| above_VAH | ny_va_width_ratio | 7666 | 9198 | 0.5014 | 0.5022 | -0.0008 | -0.48 | 6.32e-01 | -0.01 |
| above_VAH | ny_upper_share | 7666 | 9198 | 0.4902 | 0.4909 | -0.0007 | -0.30 | 7.64e-01 | -0.00 |
| above_VAH | ny_turnover_share | 7666 | 9198 | 0.4295 | 0.4223 | +0.0072 | 3.71 | 2.06e-04 | +0.06 |
| above_VAH | ny_ret | 7666 | 9198 | 0.0302 | 0.0335 | -0.0032 | -3.40 | 6.85e-04 | -0.05 |
| above_VAH | prev_atr14_pct | 7666 | 9198 | 0.6975 | 0.7608 | -0.0633 | -7.21 | <1e-6 | -0.11 |
| above_VAH | gap_pct | 7666 | 9198 | 0.0000 | 0.0000 | +0.0000 | nan | — | +nan |
| VA_above_POC | poc_pos | 11859 | 13738 | 0.4410 | 0.4318 | +0.0092 | 3.62 | 2.98e-04 | +0.05 |
| VA_above_POC | va_width_ratio | 11859 | 13738 | 0.4844 | 0.4853 | -0.0010 | -0.69 | 4.87e-01 | -0.01 |
| VA_above_POC | upper_share | 11859 | 13738 | 0.4923 | 0.4850 | +0.0073 | 3.80 | 1.46e-04 | +0.05 |
| VA_above_POC | open_dist_va | 11859 | 13738 | 0.2499 | 0.2545 | -0.0046 | -1.75 | 7.95e-02 | -0.02 |
| VA_above_POC | tokyo_poc_pos | 11839 | 13701 | 0.4952 | 0.4838 | +0.0114 | 4.30 | 1.68e-05 | +0.05 |
| VA_above_POC | tokyo_va_width_ratio | 11839 | 13701 | 0.5007 | 0.5004 | +0.0003 | 0.23 | 8.21e-01 | +0.00 |
| VA_above_POC | tokyo_upper_share | 11839 | 13701 | 0.4968 | 0.4860 | +0.0109 | 5.93 | <1e-6 | +0.07 |
| VA_above_POC | tokyo_turnover_share | 11839 | 13701 | 0.3431 | 0.3420 | +0.0011 | 0.66 | 5.11e-01 | +0.01 |
| VA_above_POC | tokyo_ret | 11839 | 13701 | 0.0011 | -0.0008 | +0.0019 | 3.24 | 1.21e-03 | +0.04 |
| VA_above_POC | london_poc_pos | 11859 | 13738 | 0.4714 | 0.4659 | +0.0055 | 2.11 | 3.45e-02 | +0.03 |
| VA_above_POC | london_va_width_ratio | 11859 | 13738 | 0.4973 | 0.5022 | -0.0050 | -3.69 | 2.21e-04 | -0.05 |
| VA_above_POC | london_upper_share | 11859 | 13738 | 0.4798 | 0.4786 | +0.0011 | 0.65 | 5.19e-01 | +0.01 |
| VA_above_POC | london_turnover_share | 11859 | 13738 | 0.4050 | 0.4019 | +0.0031 | 2.01 | 4.44e-02 | +0.03 |
| VA_above_POC | london_ret | 11859 | 13738 | 0.0043 | 0.0048 | -0.0005 | -0.91 | 3.65e-01 | -0.01 |
| VA_above_POC | ny_poc_pos | 11859 | 13738 | 0.4906 | 0.4946 | -0.0041 | -1.65 | 9.93e-02 | -0.02 |
| VA_above_POC | ny_va_width_ratio | 11859 | 13738 | 0.4770 | 0.4764 | +0.0006 | 0.50 | 6.18e-01 | +0.01 |
| VA_above_POC | ny_upper_share | 11859 | 13738 | 0.4884 | 0.4948 | -0.0063 | -3.37 | 7.43e-04 | -0.04 |
| VA_above_POC | ny_turnover_share | 11859 | 13738 | 0.4321 | 0.4363 | -0.0042 | -2.34 | 1.95e-02 | -0.03 |
| VA_above_POC | ny_ret | 11859 | 13738 | 0.0081 | 0.0091 | -0.0010 | -1.79 | 7.41e-02 | -0.02 |
| VA_above_POC | prev_atr14_pct | 11859 | 13738 | 0.7049 | 0.7499 | -0.0449 | -5.65 | <1e-6 | -0.07 |
| VA_above_POC | gap_pct | 11859 | 13738 | 0.0000 | 0.0000 | +0.0000 | nan | — | +nan |
| VA_below_POC | poc_pos | 12973 | 14608 | 0.5293 | 0.5274 | +0.0019 | 0.76 | 4.46e-01 | +0.01 |
| VA_below_POC | va_width_ratio | 12973 | 14608 | 0.4878 | 0.4875 | +0.0003 | 0.20 | 8.39e-01 | +0.00 |
| VA_below_POC | upper_share | 12973 | 14608 | 0.4964 | 0.4949 | +0.0015 | 0.80 | 4.24e-01 | +0.01 |
| VA_below_POC | open_dist_va | 12973 | 14608 | -0.2712 | -0.2543 | -0.0168 | -6.57 | <1e-6 | -0.08 |
| VA_below_POC | tokyo_poc_pos | 12944 | 14556 | 0.4965 | 0.4879 | +0.0086 | 3.39 | 6.98e-04 | +0.04 |
| VA_below_POC | tokyo_va_width_ratio | 12944 | 14556 | 0.4978 | 0.4991 | -0.0013 | -1.01 | 3.14e-01 | -0.01 |
| VA_below_POC | tokyo_upper_share | 12944 | 14556 | 0.4966 | 0.4910 | +0.0056 | 3.13 | 1.73e-03 | +0.04 |
| VA_below_POC | tokyo_turnover_share | 12944 | 14556 | 0.3452 | 0.3412 | +0.0040 | 2.42 | 1.56e-02 | +0.03 |
| VA_below_POC | tokyo_ret | 12944 | 14556 | -0.0005 | -0.0010 | +0.0006 | 1.00 | 3.17e-01 | +0.01 |
| VA_below_POC | london_poc_pos | 12973 | 14608 | 0.5083 | 0.4997 | +0.0087 | 3.44 | 5.79e-04 | +0.04 |
| VA_below_POC | london_va_width_ratio | 12973 | 14608 | 0.5009 | 0.5033 | -0.0024 | -1.85 | 6.37e-02 | -0.02 |
| VA_below_POC | london_upper_share | 12973 | 14608 | 0.4973 | 0.4932 | +0.0041 | 2.44 | 1.47e-02 | +0.03 |
| VA_below_POC | london_turnover_share | 12973 | 14608 | 0.4031 | 0.4091 | -0.0060 | -4.08 | 4.44e-05 | -0.05 |
| VA_below_POC | london_ret | 12973 | 14608 | -0.0044 | -0.0032 | -0.0012 | -2.27 | 2.30e-02 | -0.03 |
| VA_below_POC | ny_poc_pos | 12973 | 14608 | 0.4921 | 0.4994 | -0.0073 | -3.06 | 2.22e-03 | -0.04 |
| VA_below_POC | ny_va_width_ratio | 12973 | 14608 | 0.4793 | 0.4754 | +0.0038 | 3.24 | 1.20e-03 | +0.04 |
| VA_below_POC | ny_upper_share | 12973 | 14608 | 0.4869 | 0.4962 | -0.0093 | -5.18 | <1e-6 | -0.06 |
| VA_below_POC | ny_turnover_share | 12973 | 14608 | 0.4301 | 0.4356 | -0.0055 | -3.23 | 1.23e-03 | -0.04 |
| VA_below_POC | ny_ret | 12973 | 14608 | -0.0080 | -0.0045 | -0.0035 | -6.74 | <1e-6 | -0.08 |
| VA_below_POC | prev_atr14_pct | 12973 | 14608 | 0.7397 | 0.7499 | -0.0102 | -1.12 | 2.61e-01 | -0.01 |
| VA_below_POC | gap_pct | 12973 | 14608 | 0.0000 | 0.0000 | +0.0000 | nan | — | +nan |
| below_VAL | poc_pos | 9788 | 10223 | 0.6042 | 0.6076 | -0.0034 | -1.45 | 1.48e-01 | -0.02 |
| below_VAL | va_width_ratio | 9788 | 10223 | 0.4837 | 0.4793 | +0.0044 | 2.77 | 5.60e-03 | +0.04 |
| below_VAL | upper_share | 9788 | 10223 | 0.5593 | 0.5649 | -0.0056 | -2.86 | 4.30e-03 | -0.04 |
| below_VAL | open_dist_va | 9788 | 10223 | -202948.7255 | -0.4010 | -202948.3245 | -1.00 | 3.17e-01 | -0.01 |
| below_VAL | tokyo_poc_pos | 9770 | 10197 | 0.4900 | 0.4900 | -0.0001 | -0.03 | 9.73e-01 | -0.00 |
| below_VAL | tokyo_va_width_ratio | 9770 | 10197 | 0.4728 | 0.4695 | +0.0033 | 2.26 | 2.37e-02 | +0.03 |
| below_VAL | tokyo_upper_share | 9770 | 10197 | 0.4941 | 0.4929 | +0.0011 | 0.50 | 6.14e-01 | +0.01 |
| below_VAL | tokyo_turnover_share | 9770 | 10197 | 0.3543 | 0.3476 | +0.0067 | 3.59 | 3.27e-04 | +0.05 |
| below_VAL | tokyo_ret | 9770 | 10197 | -0.0002 | 0.0011 | -0.0013 | -2.50 | 1.23e-02 | -0.04 |
| below_VAL | london_poc_pos | 9788 | 10223 | 0.5174 | 0.5151 | +0.0023 | 0.81 | 4.18e-01 | +0.01 |
| below_VAL | london_va_width_ratio | 9788 | 10223 | 0.4930 | 0.4917 | +0.0013 | 0.90 | 3.69e-01 | +0.01 |
| below_VAL | london_upper_share | 9788 | 10223 | 0.5008 | 0.5002 | +0.0006 | 0.28 | 7.79e-01 | +0.00 |
| below_VAL | london_turnover_share | 9788 | 10223 | 0.3784 | 0.3860 | -0.0076 | -4.64 | 3.48e-06 | -0.07 |
| below_VAL | london_ret | 9788 | 10223 | -0.0154 | -0.0139 | -0.0015 | -3.22 | 1.28e-03 | -0.05 |
| below_VAL | ny_poc_pos | 9788 | 10223 | 0.4863 | 0.4809 | +0.0054 | 1.84 | 6.55e-02 | +0.03 |
| below_VAL | ny_va_width_ratio | 9788 | 10223 | 0.5097 | 0.5007 | +0.0090 | 5.99 | <1e-6 | +0.08 |
| below_VAL | ny_upper_share | 9788 | 10223 | 0.4866 | 0.4911 | -0.0045 | -2.29 | 2.21e-02 | -0.03 |
| below_VAL | ny_turnover_share | 9788 | 10223 | 0.4092 | 0.4121 | -0.0029 | -1.53 | 1.25e-01 | -0.02 |
| below_VAL | ny_ret | 9788 | 10223 | -0.0285 | -0.0263 | -0.0022 | -4.37 | 1.26e-05 | -0.06 |
| below_VAL | prev_atr14_pct | 9788 | 10223 | 0.7759 | 0.7595 | +0.0164 | 1.54 | 1.23e-01 | +0.02 |
| below_VAL | gap_pct | 9788 | 10223 | 0.0000 | 0.0000 | +0.0000 | nan | — | +nan |
CF-TREES · Joint conditions separating UP from DOWN
========================================================================
Scenario: above_VAH | n=16851 | base rate=0.545 | train acc=0.548 | OOS acc=0.552 | leaves=8
top features: {'prev_atr14_pct': np.float64(0.3617645818439843), 'tokyo_ret': np.float64(0.20610582300596106), 'tokyo_poc_pos': np.float64(0.19360515407199874), 'london_poc_pos': np.float64(0.12398143427810583), 'ny_ret': np.float64(0.11454300679995005), 'poc_pos': np.float64(0.0), 'va_width_ratio': np.float64(0.0), 'upper_share': np.float64(0.0)}
|--- prev_atr14_pct <= 0.63
| |--- tokyo_ret <= -0.03
| | |--- tokyo_poc_pos <= 0.26
| | | |--- class: 0
| | |--- tokyo_poc_pos > 0.26
| | | |--- class: 0
| |--- tokyo_ret > -0.03
| | |--- london_poc_pos <= 0.83
| | | |--- class: 0
| | |--- london_poc_pos > 0.83
| | | |--- class: 1
|--- prev_atr14_pct > 0.63
| |--- tokyo_poc_pos <= 0.28
| | |--- tokyo_ret <= -0.04
| | | |--- class: 0
| | |--- tokyo_ret > -0.04
| | | |--- class: 0
| |--- tokyo_poc_pos > 0.28
| | |--- ny_ret <= 0.12
| | | |--- class: 0
| | |--- ny_ret > 0.12
| | | |--- class: 0
========================================================================
Scenario: VA_above_POC | n=25540 | base rate=0.536 | train acc=0.542 | OOS acc=0.527 | leaves=8
top features: {'prev_atr14_pct': np.float64(0.2895973153322696), 'tokyo_turnover_share': np.float64(0.21846016572424576), 'tokyo_upper_share': np.float64(0.1682695309619286), 'tokyo_ret': np.float64(0.12602870354059006), 'tokyo_va_width_ratio': np.float64(0.10445084984162627), 'london_ret': np.float64(0.09319343459933974), 'poc_pos': np.float64(0.0), 'va_width_ratio': np.float64(0.0)}
|--- prev_atr14_pct <= 0.79
| |--- tokyo_upper_share <= 0.43
| | |--- tokyo_ret <= -0.06
| | | |--- class: 1
| | |--- tokyo_ret > -0.06
| | | |--- class: 0
| |--- tokyo_upper_share > 0.43
| | |--- tokyo_turnover_share <= 0.69
| | | |--- class: 1
| | |--- tokyo_turnover_share > 0.69
| | | |--- class: 0
|--- prev_atr14_pct > 0.79
| |--- tokyo_va_width_ratio <= 0.42
| | |--- tokyo_turnover_share <= 0.23
| | | |--- class: 0
| | |--- tokyo_turnover_share > 0.23
| | | |--- class: 0
| |--- tokyo_va_width_ratio > 0.42
| | |--- london_ret <= -0.00
| | | |--- class: 0
| | |--- london_ret > -0.00
| | | |--- class: 0
========================================================================
Scenario: VA_below_POC | n=27500 | base rate=0.529 | train acc=0.536 | OOS acc=0.540 | leaves=8
top features: {'london_ret': np.float64(0.4343162692928736), 'ny_ret': np.float64(0.16263721123582817), 'ny_turnover_share': np.float64(0.11169816381567564), 'tokyo_ret': np.float64(0.1090231717559656), 'ny_poc_pos': np.float64(0.0954869289535156), 'london_upper_share': np.float64(0.08683825494614136), 'poc_pos': np.float64(0.0), 'va_width_ratio': np.float64(0.0)}
|--- london_ret <= 0.00
| |--- london_ret <= -0.03
| | |--- ny_poc_pos <= 0.25
| | | |--- class: 1
| | |--- ny_poc_pos > 0.25
| | | |--- class: 0
| |--- london_ret > -0.03
| | |--- ny_ret <= -0.03
| | | |--- class: 1
| | |--- ny_ret > -0.03
| | | |--- class: 0
|--- london_ret > 0.00
| |--- tokyo_ret <= -0.02
| | |--- ny_turnover_share <= 0.52
| | | |--- class: 0
| | |--- ny_turnover_share > 0.52
| | | |--- class: 0
| |--- tokyo_ret > -0.02
| | |--- london_upper_share <= 0.40
| | | |--- class: 0
| | |--- london_upper_share > 0.40
| | | |--- class: 0
========================================================================
Scenario: below_VAL | n=19967 | base rate=0.511 | train acc=0.554 | OOS acc=0.536 | leaves=8
top features: {'tokyo_ret': np.float64(0.1908206397089765), 'london_ret': np.float64(0.1717652751368205), 'london_turnover_share': np.float64(0.16075405149767782), 'tokyo_turnover_share': np.float64(0.15763153578453465), 'ny_turnover_share': np.float64(0.13443368759667546), 'open_dist_va': np.float64(0.09884091288690967), 'ny_va_width_ratio': np.float64(0.08575389738840541), 'poc_pos': np.float64(0.0)}
|--- tokyo_ret <= -0.01
| |--- london_ret <= -0.00
| | |--- london_turnover_share <= 0.52
| | | |--- class: 1
| | |--- london_turnover_share > 0.52
| | | |--- class: 0
| |--- london_ret > -0.00
| | |--- ny_va_width_ratio <= 0.65
| | | |--- class: 0
| | |--- ny_va_width_ratio > 0.65
| | | |--- class: 1
|--- tokyo_ret > -0.01
| |--- tokyo_turnover_share <= 0.38
| | |--- open_dist_va <= -1.16
| | | |--- class: 0
| | |--- open_dist_va > -1.16
| | | |--- class: 0
| |--- tokyo_turnover_share > 0.38
| | |--- ny_turnover_share <= 0.23
| | | |--- class: 0
| | |--- ny_turnover_share > 0.23
| | | |--- class: 1
Method & caveats
Data
Bybit V5 public API, 15m OHLCV, all USDT-margined perpetuals (741 verified), tiered by 24h turnover & listing age. Headline tier: turnover ≥ $1M and listed ≥ 60 days (230 symbols). ~500 days of history per symbol, resumable caching.
Profiles
UTC 00:00–00:00 calendar days; notional-weighted binning (traded turnover, not contracts); 70% value area via classic POC-outward expansion. Session profiles for Tokyo / London / New York. All returns are open→close in basis points; net = mean − 10 bps round-trip cost.
Protocol
- Hypothesis tests with adjusted p-values, per-symbol consistency, and out-of-sample splits.
- Effects are small (10–25 bps — the size of the spread); few survive costs.
- 522 days = one regime. Structure can change; treat as historical statistics.
Reproduce
All code is in the repo. End-to-end (fetch → features → all analyses → report → site → commit → push):
./run_pipeline.sh # full pipeline
python3 src/make_site.py # regenerate site only
Full methodology: docs/methodology.md · Master plan: PLAN.md · Raw datasets: results/