Bybit perpetuals · volume profiles · 230 symbols · 90,283 symbol-days

Does where the day opens relative to yesterday's volume profile predict where it goes?

Every day the market builds a volume profile — a picture of where trading actually happened over 24 hours — from which we get three reference prices: the POC (the price where the most trading happened), and the VAH / VAL (top and bottom of the 70% value area, "fair value"). We asked: when the new day opens above, below, or inside yesterday's value area, does that tell us where the day is going? Full answer, with statistical tests, out-of-sample checks, and per-symbol consistency, below.

230liquid symbols
90,283symbol-days
522UTC days
2025-03-30 → 2026-09-02coverage

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 UPAverage day returnVerdict
Above yesterday's VAH45.5%+8 bps (not significant)❌ no real edge
Inside value, above POC46.3%−4 bps
Inside value, below POC47.0%+4 bps
Below yesterday's VAL48.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

GroupNMean (bps)Median (bps)Win %tpOOS mean (bps)OOS pVerdict
above_VAH16,864+8-3545.5%1.360.173+100.227n.s.
VA_above_POC25,597-4-2846.3%-0.740.459+70.315n.s.
VA_below_POC27,581+4-2447.0%0.780.437-70.242n.s.
below_VAL20,011+19-948.9%4.13<0.001+53<0.001sig + 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)

GroupNOLS slope (bps/VA-width)Pearson rSpearman ρρ pVerdict
dist_above_VAH16,864-28.71-0.017-0.0090.247
dist_below_VAL20,0110.000.002-0.0170.018

H7–H9 · Prior-day POC position zone → next-day return

GroupNMean (bps)Median (bps)Win %tpOOS mean (bps)OOS pVerdict
poc_near_VAL23,104-13-3845.4%-2.610.009-190.006sig + OOS
poc_central45,177+12-2147.5%3.32<0.001+110.023sig + OOS
poc_near_VAH21,772+13-1947.6%2.560.010+31<0.001sig + 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

GroupNMean (bps)Median (bps)Win %tpNext-day range %Verdict
va_narrow45,017-2-2746.5%-0.410.68010.21%n.s.
va_wide45,036+13-2247.4%3.93<0.0019.73%sig

H11 · Prior-day profile shape → next-day return & range

GroupNMean (bps)Median (bps)Win %tpNext-day range %Verdict
shape_P19,973+14-2047.5%2.580.0109.82%sig
shape_b22,372-13-3845.2%-2.430.01511.04%sig
shape_D47,708+11-2047.5%3.42<0.0019.53%sig

H15 · Open-location effect by ATR regime (low/high tercile)

GroupNMean (bps)Median (bps)Win %tpVerdict
above_VAH_atr_low6,966+26-1048.3%4.02<0.001sig
above_VAH_atr_high4,547-16-9941.7%-1.120.263n.s.
below_VAL_atr_low8,273+5-1847.5%0.830.405n.s.
below_VAL_atr_high5,700+40+150.0%3.83<0.001sig

Opening below VAL in a high-volatility environment is where the bounce concentrates (+40 bps).

H16 · Open-location effect by trend regime (daily EMA20)

GroupNMean (bps)Median (bps)Win %tpVerdict
above_VAH_trend_up8,474+20-2247.4%2.230.026sig
above_VAH_trend_down8,390-5-4743.5%-0.670.505n.s.
below_VAL_trend_up5,342+17-649.3%1.640.101n.s.
below_VAL_trend_down14,669+20-1148.8%3.91<0.001sig

H5–H6 · First-hour drive & day leadership

GroupNOpen-drive rateDrive p1h mean (bps)Day follows 1hDay ret | 1h upDay ret | 1h dnVerdict
drive_above_VAH16,86443.4%<0.001-7
lead_above_VAH16,86460.3%+138-92
drive_below_VAL20,01146.1%<0.001-1
lead_below_VAL20,01158.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

GroupNFill rateVerdict
fill_above_VAH16,86479.5%
fill_below_VAL20,01177.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

ReferenceBucketNMean (bps)Win %tpVerdict
full_dayVA_above_POC25,597-446.3%-0.740.459n.s.
full_dayVA_below_POC27,581+447.0%0.780.437n.s.
full_dayabove_VAH16,864+845.5%1.360.173n.s.
full_daybelow_VAL20,011+1948.9%4.13<0.001sig
full_daySPREAD(abv-blw)36,875-12-1.620.106n.s.
tokyoVA_above_POC10,860+745.6%0.710.478n.s.
tokyoVA_below_POC10,824-1346.3%-1.870.061n.s.
tokyoabove_VAH31,175+845.3%1.790.073n.s.
tokyobelow_VAL36,999+949.0%2.500.012sig
tokyoSPREAD(abv-blw)68,174-1-0.150.881n.s.
londonVA_above_POC15,458-1744.9%-2.790.005sig
londonVA_below_POC16,030-946.6%-1.500.133n.s.
londonabove_VAH27,740+745.7%1.290.197n.s.
londonbelow_VAL30,825+2449.2%6.23<0.001sig
londonSPREAD(abv-blw)58,565-18-2.780.006sig
nyVA_above_POC22,454+847.3%1.420.157n.s.
nyVA_below_POC23,047+146.5%0.180.860n.s.
nyabove_VAH21,410+646.5%0.970.333n.s.
nybelow_VAL23,142+947.5%2.030.042sig
nySPREAD(abv-blw)44,552-4-0.480.630n.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

BucketGroupSessionNMean (bps)Median (bps)Win %tpVerdict
tokyo_shapeDtokyo46,609+5-2447.0%1.410.159n.s.
tokyo_shapePtokyo19,965+11-1048.5%2.040.041sig
tokyo_shapebtokyo23,284+2-3945.6%0.390.700n.s.
london_shapeDlondon48,929+4-2546.8%1.210.224n.s.
london_shapePlondon18,428+22-1548.2%3.91<0.001sig
london_shapeblondon22,696-4-3146.3%-0.730.467n.s.
ny_shapeDny47,654+7-2447.0%2.170.030sig
ny_shapePny19,853-5-3445.8%-0.820.414n.s.
ny_shapebny22,546+12-1648.0%2.280.022sig

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

SessionPrior moveNMean (bps)Win %tpVerdict
tokyoup43,601+846.8%2.280.022sig
tokyodown45,929+347.1%0.740.462n.s.
londonup42,432+245.2%0.410.681n.s.
londondown47,307+1048.6%2.800.005sig
nyup43,394+745.8%2.000.046sig
nydown46,309+448.1%1.290.198n.s.

S4 · Prior-day dominant session (by turnover share) → next-day

SessionNMean (bps)Win %tpVerdict
tokyo26,634+1347.9%2.410.016sig
london22,777-1146.5%-2.360.018sig
ny40,447+1046.7%2.870.004sig

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

SessionVA bandNNext-day range %Mean (bps)tpVerdict
tokyonarrow44,9299.72%+1110.42<0.001sig
tokyowide44,92910.18%+10111.83<0.001sig
londonnarrow45,0229.93%+14111.02<0.001sig
londonwide45,03110.01%-3111.32<0.001sig
nynarrow45,02310.16%-1197.36<0.001sig
nywide45,0309.78%+22135.72<0.001sig

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.

Counterfactual table — feature means for UP vs DOWN days within each open-location scenario (84 rows)
ScenarioFeatureN upN downMean upMean downDifftp|d|Up rateVerdict
above_VAHpoc_pos7,6669,1980.3810.3740.0072.700.0070.0445.5%sig
above_VAHva_width_ratio7,6669,1980.4840.4790.0052.980.0030.0545.5%sig
above_VAHupper_share7,6669,1980.4310.4200.0114.93<0.0010.0845.5%sig
above_VAHopen_dist_va7,6669,1980.3940.422-0.027-4.17<0.001-0.0645.5%sig
above_VAHtokyo_poc_pos7,6599,1920.4940.4800.0134.32<0.0010.0745.5%sig
above_VAHtokyo_va_width_ratio7,6599,1920.4770.478-0.001-0.570.569-0.0145.5%n.s.
above_VAHtokyo_upper_share7,6599,1920.4880.4800.0093.65<0.0010.0645.5%sig
above_VAHtokyo_turnover_share7,6599,1920.3310.335-0.004-1.900.058-0.0345.5%n.s.
above_VAHtokyo_ret7,6599,1920.0020.0020.0000.390.6990.0145.5%n.s.
above_VAHlondon_poc_pos7,6669,1980.4590.460-0.001-0.250.799-0.0045.5%n.s.
above_VAHlondon_va_width_ratio7,6669,1980.4900.4880.0010.920.3580.0145.5%n.s.
above_VAHlondon_upper_share7,6669,1980.4780.4720.0062.730.0060.0445.5%sig
above_VAHlondon_turnover_share7,6669,1980.3810.3750.0052.990.0030.0545.5%sig
above_VAHlondon_ret7,6669,1980.0150.016-0.001-1.790.074-0.0345.5%n.s.
above_VAHny_poc_pos7,6669,1980.5040.504-0.001-0.160.875-0.0045.5%n.s.
above_VAHny_va_width_ratio7,6669,1980.5010.502-0.001-0.480.632-0.0145.5%n.s.
above_VAHny_upper_share7,6669,1980.4900.491-0.001-0.300.764-0.0045.5%n.s.
above_VAHny_turnover_share7,6669,1980.4290.4220.0073.71<0.0010.0645.5%sig
above_VAHny_ret7,6669,1980.0300.033-0.003-3.40<0.001-0.0545.5%sig
above_VAHprev_atr14_pct7,6669,1980.6970.761-0.063-7.21<0.001-0.1145.5%sig
above_VAHgap_pct7,6669,1980.0000.0000.00045.5%n.s.
VA_above_POCpoc_pos11,85913,7380.4410.4320.0093.62<0.0010.0546.3%sig
VA_above_POCva_width_ratio11,85913,7380.4840.485-0.001-0.690.487-0.0146.3%n.s.
VA_above_POCupper_share11,85913,7380.4920.4850.0073.80<0.0010.0546.3%sig
VA_above_POCopen_dist_va11,85913,7380.2500.254-0.005-1.750.079-0.0246.3%n.s.
VA_above_POCtokyo_poc_pos11,83913,7010.4950.4840.0114.30<0.0010.0546.3%sig
VA_above_POCtokyo_va_width_ratio11,83913,7010.5010.5000.0000.230.8210.0046.3%n.s.
VA_above_POCtokyo_upper_share11,83913,7010.4970.4860.0115.93<0.0010.0746.3%sig
VA_above_POCtokyo_turnover_share11,83913,7010.3430.3420.0010.660.5110.0146.3%n.s.
VA_above_POCtokyo_ret11,83913,7010.001-0.0010.0023.240.0010.0446.3%sig
VA_above_POClondon_poc_pos11,85913,7380.4710.4660.0062.110.0350.0346.3%sig
VA_above_POClondon_va_width_ratio11,85913,7380.4970.502-0.005-3.69<0.001-0.0546.3%sig
VA_above_POClondon_upper_share11,85913,7380.4800.4790.0010.650.5190.0146.3%n.s.
VA_above_POClondon_turnover_share11,85913,7380.4050.4020.0032.010.0440.0346.3%sig
VA_above_POClondon_ret11,85913,7380.0040.005-0.000-0.910.365-0.0146.3%n.s.
VA_above_POCny_poc_pos11,85913,7380.4910.495-0.004-1.650.099-0.0246.3%n.s.
VA_above_POCny_va_width_ratio11,85913,7380.4770.4760.0010.500.6180.0146.3%n.s.
VA_above_POCny_upper_share11,85913,7380.4880.495-0.006-3.37<0.001-0.0446.3%sig
VA_above_POCny_turnover_share11,85913,7380.4320.436-0.004-2.340.020-0.0346.3%sig
VA_above_POCny_ret11,85913,7380.0080.009-0.001-1.790.074-0.0246.3%n.s.
VA_above_POCprev_atr14_pct11,85913,7380.7050.750-0.045-5.65<0.001-0.0746.3%sig
VA_above_POCgap_pct11,85913,7380.0000.0000.00046.3%n.s.
VA_below_POCpoc_pos12,97314,6080.5290.5270.0020.760.4460.0147.0%n.s.
VA_below_POCva_width_ratio12,97314,6080.4880.4880.0000.200.8390.0047.0%n.s.
VA_below_POCupper_share12,97314,6080.4960.4950.0010.800.4240.0147.0%n.s.
VA_below_POCopen_dist_va12,97314,608-0.271-0.254-0.017-6.57<0.001-0.0847.0%sig
VA_below_POCtokyo_poc_pos12,94414,5560.4960.4880.0093.39<0.0010.0447.0%sig
VA_below_POCtokyo_va_width_ratio12,94414,5560.4980.499-0.001-1.010.314-0.0147.0%n.s.
VA_below_POCtokyo_upper_share12,94414,5560.4970.4910.0063.130.0020.0447.0%sig
VA_below_POCtokyo_turnover_share12,94414,5560.3450.3410.0042.420.0160.0347.0%sig
VA_below_POCtokyo_ret12,94414,556-0.000-0.0010.0011.000.3170.0147.0%n.s.
VA_below_POClondon_poc_pos12,97314,6080.5080.5000.0093.44<0.0010.0447.0%sig
VA_below_POClondon_va_width_ratio12,97314,6080.5010.503-0.002-1.850.064-0.0247.0%n.s.
VA_below_POClondon_upper_share12,97314,6080.4970.4930.0042.440.0150.0347.0%sig
VA_below_POClondon_turnover_share12,97314,6080.4030.409-0.006-4.08<0.001-0.0547.0%sig
VA_below_POClondon_ret12,97314,608-0.004-0.003-0.001-2.270.023-0.0347.0%sig
VA_below_POCny_poc_pos12,97314,6080.4920.499-0.007-3.060.002-0.0447.0%sig
VA_below_POCny_va_width_ratio12,97314,6080.4790.4750.0043.240.0010.0447.0%sig
VA_below_POCny_upper_share12,97314,6080.4870.496-0.009-5.18<0.001-0.0647.0%sig
VA_below_POCny_turnover_share12,97314,6080.4300.436-0.006-3.230.001-0.0447.0%sig
VA_below_POCny_ret12,97314,608-0.008-0.005-0.003-6.74<0.001-0.0847.0%sig
VA_below_POCprev_atr14_pct12,97314,6080.7400.750-0.010-1.120.261-0.0147.0%n.s.
VA_below_POCgap_pct12,97314,6080.0000.0000.00047.0%n.s.
below_VALpoc_pos9,78810,2230.6040.608-0.003-1.450.148-0.0248.9%n.s.
below_VALva_width_ratio9,78810,2230.4840.4790.0042.770.0060.0448.9%sig
below_VALupper_share9,78810,2230.5590.565-0.006-2.860.004-0.0448.9%sig
below_VALopen_dist_va9,78810,223-202948.726-0.401-202948.324-1.000.317-0.0148.9%n.s.
below_VALtokyo_poc_pos9,77010,1970.4900.490-0.000-0.030.973-0.0048.9%n.s.
below_VALtokyo_va_width_ratio9,77010,1970.4730.4700.0032.260.0240.0348.9%sig
below_VALtokyo_upper_share9,77010,1970.4940.4930.0010.500.6140.0148.9%n.s.
below_VALtokyo_turnover_share9,77010,1970.3540.3480.0073.59<0.0010.0548.9%sig
below_VALtokyo_ret9,77010,197-0.0000.001-0.001-2.500.012-0.0448.9%sig
below_VALlondon_poc_pos9,78810,2230.5170.5150.0020.810.4180.0148.9%n.s.
below_VALlondon_va_width_ratio9,78810,2230.4930.4920.0010.900.3690.0148.9%n.s.
below_VALlondon_upper_share9,78810,2230.5010.5000.0010.280.7790.0048.9%n.s.
below_VALlondon_turnover_share9,78810,2230.3780.386-0.008-4.64<0.001-0.0748.9%sig
below_VALlondon_ret9,78810,223-0.015-0.014-0.001-3.220.001-0.0548.9%sig
below_VALny_poc_pos9,78810,2230.4860.4810.0051.840.0650.0348.9%n.s.
below_VALny_va_width_ratio9,78810,2230.5100.5010.0095.99<0.0010.0848.9%sig
below_VALny_upper_share9,78810,2230.4870.491-0.004-2.290.022-0.0348.9%sig
below_VALny_turnover_share9,78810,2230.4090.412-0.003-1.530.125-0.0248.9%n.s.
below_VALny_ret9,78810,223-0.028-0.026-0.002-4.37<0.001-0.0648.9%sig
below_VALprev_atr14_pct9,78810,2230.7760.7590.0161.540.1230.0248.9%n.s.
below_VALgap_pct9,78810,2230.0000.0000.00048.9%n.s.

Decision trees · Joint conditions separating UP from DOWN

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.

LocationN symbolsAgreeFrac agreeBinom pPooled mean (bps)Median sym mean (bps)Sym +Sym −Verdict
above_VAH22910746.7%0.355+0-5107122
VA_above_POC23013157.0%0.041-5-899131
VA_below_POC23010947.4%0.468+8-3109121
below_VAL23013759.6%0.004+30+1213793

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)

groupnOLS slope (bps per VA-width)Pearson rSpearman ρρ p
dist_above_VAH16864-28.7-0.017-0.0092.47e-01
dist_below_VAL20011+0.0+0.002-0.0171.83e-02

H1–H3 · Day return by open location vs prior-day profile

groupnmean(bps)net(bps)wintp (adj)OOS meanOOS psig
above_VAH16864+8-245.5%1.361.73e-01+102.27e-01
VA_above_POC25597-4-1446.3%-0.744.59e-01+73.15e-01
VA_below_POC27581+4-647.0%0.784.37e-01-72.42e-01
below_VAL20011+19+948.9%4.133.57e-05+53<1e-6

H7–H9 · Prior-day POC position zone → next-day return

groupnmean(bps)net(bps)wintp (adj)OOS meanOOS psig
poc_near_VAL23104-13-2345.4%-2.619.04e-03-195.60e-03
poc_central45177+12+247.5%3.328.97e-04+112.29e-02
poc_near_VAH21772+13+347.6%2.561.04e-02+311.83e-04

H10 · Prior VA width band → next-day return & range

groupnmean(bps)net(bps)wintp (adj)OOS meanOOS psig
va_narrow45017-2-1246.5%-0.416.80e-01
va_wide45036+13+347.4%3.938.36e-05

H11 · Prior-day profile shape → next-day return & range

groupnmean(bps)net(bps)wintp (adj)OOS meanOOS psig
shape_P19973+14+447.5%2.589.89e-03
shape_b22372-13-2345.2%-2.431.53e-02
shape_D47708+11+147.5%3.426.35e-04

H15 · Open-location effect by ATR regime (low/high tercile)

groupnmean(bps)net(bps)wintp (adj)OOS meanOOS psig
above_VAH_atr_low6966+26+1648.3%4.025.91e-05
above_VAH_atr_high4547-16-2641.7%-1.122.63e-01
below_VAL_atr_low8273+5-547.5%0.834.05e-01
below_VAL_atr_high5700+40+3050.0%3.831.28e-04

H16 · Open-location effect by trend regime (daily EMA20)

groupnmean(bps)net(bps)wintp (adj)OOS meanOOS psig
above_VAH_trend_up8474+20+1047.4%2.232.60e-02
above_VAH_trend_down8390-5-1543.5%-0.675.05e-01
below_VAL_trend_up5342+17+749.3%1.641.01e-01
below_VAL_trend_down14669+20+1048.8%3.919.40e-05

H5–H6 · First-hour drive & day leadership

groupnopen-drive rate1h mean(bps)day-follows-1hday ret \1h up(bps)day ret \1h dn(bps)
drive_above_VAH1686443.4%-7
lead_above_VAH1686460.3%+138-92
drive_below_VAL2001146.1%-1
lead_below_VAL2001158.0%+103-80

H12–H13 · Fill-back into prior VA

groupnfill rate
fill_above_VAH1686479.5%
fill_below_VAL2001177.7%

H17 · Per-symbol stability (robustness)

locn_symbolsfrac_agreebinom ppooled mean(bps)median sym mean(bps)sym+sym−
above_VAH22946.7%3.55e-01+0-5107122
VA_above_POC23057.0%4.07e-02-5-899131
VA_below_POC23047.4%4.68e-01+8-3109121
below_VAL23059.6%4.47e-03+30+1213793

_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

refbucketnmean(bps)wintp
full_dayVA_above_POC25597-446.3%-0.744.59e-01
full_dayVA_below_POC27581+447.0%0.784.37e-01
full_dayabove_VAH16864+845.5%1.361.73e-01
full_daybelow_VAL20011+1948.9%4.133.57e-05
full_daySPREAD(abv-blw)36875-12-1.621.06e-01
tokyoVA_above_POC10860+745.6%0.714.78e-01
tokyoVA_below_POC10824-1346.3%-1.876.09e-02
tokyoabove_VAH31175+845.3%1.797.31e-02
tokyobelow_VAL36999+949.0%2.501.23e-02
tokyoSPREAD(abv-blw)68174-1-0.158.81e-01
londonVA_above_POC15458-1744.9%-2.795.25e-03
londonVA_below_POC16030-946.6%-1.501.33e-01
londonabove_VAH27740+745.7%1.291.97e-01
londonbelow_VAL30825+2449.2%6.23<1e-6
londonSPREAD(abv-blw)58565-18-2.785.52e-03
nyVA_above_POC22454+847.3%1.421.57e-01
nyVA_below_POC23047+146.5%0.188.60e-01
nyabove_VAH21410+646.5%0.973.33e-01
nybelow_VAL23142+947.5%2.034.19e-02
nySPREAD(abv-blw)44552-4-0.486.30e-01

S2 · Prior-day session shape → next-day return

sessionshapenmean(bps)wintp
tokyoD46609+547.0%1.411.59e-01
tokyoP19965+1148.5%2.044.10e-02
tokyob23284+245.6%0.397.00e-01
londonD48929+446.8%1.212.24e-01
londonP18428+2248.2%3.919.10e-05
londonb22696-446.3%-0.734.67e-01
nyD47654+747.0%2.173.02e-02
nyP19853-545.8%-0.824.14e-01
nyb22546+1248.0%2.282.25e-02

S3 · Prior-day session return (momentum) → next-day return

sessionprior sessionnmean(bps)wintp
tokyoup43601+846.8%2.282.23e-02
tokyodown45929+347.1%0.744.62e-01
londonup42432+245.2%0.416.81e-01
londondown47307+1048.6%2.805.15e-03
nyup43394+745.8%2.004.57e-02
nydown46309+448.1%1.291.98e-01

S4 · Prior-day dominant session (by turnover share) → next-day

sessionnmean(bps)wintp
tokyo26634+1347.9%2.411.62e-02
london22777-1146.5%-2.361.83e-02
ny40447+1046.7%2.874.17e-03

S5 · Prior-day session VA width → next-day range

sessionVA bandnnext-day range %mean ret(bps)p
tokyonarrow449299.72%+1<1e-6
tokyowide4492910.18%+10<1e-6
londonnarrow450229.93%+14<1e-6
londonwide4503110.01%-3<1e-6
nynarrow4502310.16%-11<1e-6
nywide450309.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._

scenariofeaturen_upn_dnmean UPmean DNdifftpd
above_VAHpoc_pos766691980.38110.3740+0.00712.706.84e-03+0.04
above_VAHva_width_ratio766691980.48430.4790+0.00522.982.87e-03+0.05
above_VAHupper_share766691980.43060.4199+0.01074.93<1e-6+0.08
above_VAHopen_dist_va766691980.39440.4219-0.0275-4.173.13e-05-0.06
above_VAHtokyo_poc_pos765991920.49370.4803+0.01334.321.58e-05+0.07
above_VAHtokyo_va_width_ratio765991920.47740.4783-0.0009-0.575.69e-01-0.01
above_VAHtokyo_upper_share765991920.48840.4797+0.00873.652.64e-04+0.06
above_VAHtokyo_turnover_share765991920.33110.3347-0.0037-1.905.80e-02-0.03
above_VAHtokyo_ret765991920.00180.0016+0.00020.396.99e-01+0.01
above_VAHlondon_poc_pos766691980.45900.4598-0.0008-0.257.99e-01-0.00
above_VAHlondon_va_width_ratio766691980.48960.4881+0.00150.923.58e-01+0.01
above_VAHlondon_upper_share766691980.47830.4723+0.00602.736.38e-03+0.04
above_VAHlondon_turnover_share766691980.38050.3753+0.00522.992.75e-03+0.05
above_VAHlondon_ret766691980.01450.0155-0.0010-1.797.37e-02-0.03
above_VAHny_poc_pos766691980.50380.5043-0.0005-0.168.75e-01-0.00
above_VAHny_va_width_ratio766691980.50140.5022-0.0008-0.486.32e-01-0.01
above_VAHny_upper_share766691980.49020.4909-0.0007-0.307.64e-01-0.00
above_VAHny_turnover_share766691980.42950.4223+0.00723.712.06e-04+0.06
above_VAHny_ret766691980.03020.0335-0.0032-3.406.85e-04-0.05
above_VAHprev_atr14_pct766691980.69750.7608-0.0633-7.21<1e-6-0.11
above_VAHgap_pct766691980.00000.0000+0.0000nan+nan
VA_above_POCpoc_pos11859137380.44100.4318+0.00923.622.98e-04+0.05
VA_above_POCva_width_ratio11859137380.48440.4853-0.0010-0.694.87e-01-0.01
VA_above_POCupper_share11859137380.49230.4850+0.00733.801.46e-04+0.05
VA_above_POCopen_dist_va11859137380.24990.2545-0.0046-1.757.95e-02-0.02
VA_above_POCtokyo_poc_pos11839137010.49520.4838+0.01144.301.68e-05+0.05
VA_above_POCtokyo_va_width_ratio11839137010.50070.5004+0.00030.238.21e-01+0.00
VA_above_POCtokyo_upper_share11839137010.49680.4860+0.01095.93<1e-6+0.07
VA_above_POCtokyo_turnover_share11839137010.34310.3420+0.00110.665.11e-01+0.01
VA_above_POCtokyo_ret11839137010.0011-0.0008+0.00193.241.21e-03+0.04
VA_above_POClondon_poc_pos11859137380.47140.4659+0.00552.113.45e-02+0.03
VA_above_POClondon_va_width_ratio11859137380.49730.5022-0.0050-3.692.21e-04-0.05
VA_above_POClondon_upper_share11859137380.47980.4786+0.00110.655.19e-01+0.01
VA_above_POClondon_turnover_share11859137380.40500.4019+0.00312.014.44e-02+0.03
VA_above_POClondon_ret11859137380.00430.0048-0.0005-0.913.65e-01-0.01
VA_above_POCny_poc_pos11859137380.49060.4946-0.0041-1.659.93e-02-0.02
VA_above_POCny_va_width_ratio11859137380.47700.4764+0.00060.506.18e-01+0.01
VA_above_POCny_upper_share11859137380.48840.4948-0.0063-3.377.43e-04-0.04
VA_above_POCny_turnover_share11859137380.43210.4363-0.0042-2.341.95e-02-0.03
VA_above_POCny_ret11859137380.00810.0091-0.0010-1.797.41e-02-0.02
VA_above_POCprev_atr14_pct11859137380.70490.7499-0.0449-5.65<1e-6-0.07
VA_above_POCgap_pct11859137380.00000.0000+0.0000nan+nan
VA_below_POCpoc_pos12973146080.52930.5274+0.00190.764.46e-01+0.01
VA_below_POCva_width_ratio12973146080.48780.4875+0.00030.208.39e-01+0.00
VA_below_POCupper_share12973146080.49640.4949+0.00150.804.24e-01+0.01
VA_below_POCopen_dist_va1297314608-0.2712-0.2543-0.0168-6.57<1e-6-0.08
VA_below_POCtokyo_poc_pos12944145560.49650.4879+0.00863.396.98e-04+0.04
VA_below_POCtokyo_va_width_ratio12944145560.49780.4991-0.0013-1.013.14e-01-0.01
VA_below_POCtokyo_upper_share12944145560.49660.4910+0.00563.131.73e-03+0.04
VA_below_POCtokyo_turnover_share12944145560.34520.3412+0.00402.421.56e-02+0.03
VA_below_POCtokyo_ret1294414556-0.0005-0.0010+0.00061.003.17e-01+0.01
VA_below_POClondon_poc_pos12973146080.50830.4997+0.00873.445.79e-04+0.04
VA_below_POClondon_va_width_ratio12973146080.50090.5033-0.0024-1.856.37e-02-0.02
VA_below_POClondon_upper_share12973146080.49730.4932+0.00412.441.47e-02+0.03
VA_below_POClondon_turnover_share12973146080.40310.4091-0.0060-4.084.44e-05-0.05
VA_below_POClondon_ret1297314608-0.0044-0.0032-0.0012-2.272.30e-02-0.03
VA_below_POCny_poc_pos12973146080.49210.4994-0.0073-3.062.22e-03-0.04
VA_below_POCny_va_width_ratio12973146080.47930.4754+0.00383.241.20e-03+0.04
VA_below_POCny_upper_share12973146080.48690.4962-0.0093-5.18<1e-6-0.06
VA_below_POCny_turnover_share12973146080.43010.4356-0.0055-3.231.23e-03-0.04
VA_below_POCny_ret1297314608-0.0080-0.0045-0.0035-6.74<1e-6-0.08
VA_below_POCprev_atr14_pct12973146080.73970.7499-0.0102-1.122.61e-01-0.01
VA_below_POCgap_pct12973146080.00000.0000+0.0000nan+nan
below_VALpoc_pos9788102230.60420.6076-0.0034-1.451.48e-01-0.02
below_VALva_width_ratio9788102230.48370.4793+0.00442.775.60e-03+0.04
below_VALupper_share9788102230.55930.5649-0.0056-2.864.30e-03-0.04
below_VALopen_dist_va978810223-202948.7255-0.4010-202948.3245-1.003.17e-01-0.01
below_VALtokyo_poc_pos9770101970.49000.4900-0.0001-0.039.73e-01-0.00
below_VALtokyo_va_width_ratio9770101970.47280.4695+0.00332.262.37e-02+0.03
below_VALtokyo_upper_share9770101970.49410.4929+0.00110.506.14e-01+0.01
below_VALtokyo_turnover_share9770101970.35430.3476+0.00673.593.27e-04+0.05
below_VALtokyo_ret977010197-0.00020.0011-0.0013-2.501.23e-02-0.04
below_VALlondon_poc_pos9788102230.51740.5151+0.00230.814.18e-01+0.01
below_VALlondon_va_width_ratio9788102230.49300.4917+0.00130.903.69e-01+0.01
below_VALlondon_upper_share9788102230.50080.5002+0.00060.287.79e-01+0.00
below_VALlondon_turnover_share9788102230.37840.3860-0.0076-4.643.48e-06-0.07
below_VALlondon_ret978810223-0.0154-0.0139-0.0015-3.221.28e-03-0.05
below_VALny_poc_pos9788102230.48630.4809+0.00541.846.55e-02+0.03
below_VALny_va_width_ratio9788102230.50970.5007+0.00905.99<1e-6+0.08
below_VALny_upper_share9788102230.48660.4911-0.0045-2.292.21e-02-0.03
below_VALny_turnover_share9788102230.40920.4121-0.0029-1.531.25e-01-0.02
below_VALny_ret978810223-0.0285-0.0263-0.0022-4.371.26e-05-0.06
below_VALprev_atr14_pct9788102230.77590.7595+0.01641.541.23e-01+0.02
below_VALgap_pct9788102230.00000.0000+0.0000nan+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/