A 12-month, 546-symbol Bybit backtest of opening-range-break trades conditioned on value-area, volatility and CVD factors. The published headline finding: short-only + vol/CVD confluence trades at avg R +0.042 (95% CI [+0.002, +0.085], n=4,893) — confirmed by block-bootstrap, beats random-entry and buy-and-hold baselines.
On the audited 12-month / 546-symbol dataset, the raw opening-range-break event base is negative (unfiltered avg R ≈ −0.21 to −0.24). The published edge only appears after the short-only + vol/CVD confluence stack: +0.042 avg R (CI [+0.002, +0.085], n=4,893 events), which beats random-entry-same-exit by +0.148 and buy-and-hold-short by +0.015.
Block-bootstrap re-verification confirms four single factors — va_width_pct, vol_sma_ratio, cvd_delta_signed_with_direction, cvd_significant — while atr_pct_percentile, body_ratio and weekday are UNSTABLE and cvd_confirms shows NO_EFFECT. The screened base (A_current_fixed_screener) is where the positive confirmation-set numbers come from; the unfiltered universe has no edge.
Reproduction is env-var sensitive: the published numbers require ORB_SUFFIX=_12mo and ORB_DISCOVERY_DAYS=244. Running with the bare defaults produces a materially different split — a documented real incident in this project.
Opening-range-break trades across 546 Bybit perps over 12 months (169,512 events after filtering tick-size artifacts). Unfiltered base is negative — the ORB event alone has no edge.
The headline finding is the short_only leg plus vol/CVD confluence: value-area width, volume-vs-SMA ratio, CVD delta signed with direction, and CVD significance as entry conditions.
A block-bootstrap (session-date blocked, 1,000 draws) re-verification classified every single factor: CONFIRMED / UNSTABLE / NO_EFFECT, on discovery (n=8,713+) vs confirmation (n=4,893+) splits.
Funding-rate and mark-price rescoring scoped to the headline event set (W6/W7); market-impact/slippage assumptions reported alongside the avg R. The 12-month dataset is the canonical one — the original 90-day set is superseded.
| Component | Rule | Evidence |
|---|---|---|
| Direction | Short only | Long leg negative in the audited dataset |
| Value-area width | va_width_pct factor | CONFIRMED (disc +0.037/+0.273, conf +0.183/+0.458 CI) |
| Volatility vs SMA | vol_sma_ratio | CONFIRMED (stable CIs across splits) |
| CVD delta signed | cvd_delta_signed_with_direction | CONFIRMED |
| CVD significance | cvd_significant | CONFIRMED (weak but real) |
| Screener | A_current_fixed_screener base | Confirmation-set avg R +0.067, CI [−0.065, +0.198] |
| Repro env | ORB_SUFFIX=_12mo · ORB_DISCOVERY_DAYS=244 | Required for the published numbers |
| Measure | Avg R | 95% CI |
|---|---|---|
| Headline (short_only + vol/CVD confluence) | +0.0420 | [+0.0008, +0.0837] |
| Random-entry-same-exit (N=200/event) | −0.1062 | [−0.1220, −0.0898] |
| Buy-and-hold-short | +0.0269 | [−0.0180, +0.0716] |
| Headline − random entry | +0.1483 | [+0.1092, +0.1881] |
| Headline − buy & hold | +0.0151 | [+0.0046, +0.0250] |
ORB_SUFFIX=_12mo: 546 symbols, 365 session dates, 169,512 events after dropping 875 tick-size artifacts (risk < 0.02% of price).
ORB_DISCOVERY_DAYS=244 → cutoff 2026-04-27/28; discovery n=106,747 / confirmation n=62,765 rows (headline event set n=4,893).
Block bootstrap (session-date blocked, n_boot=1000) on every single-factor verdict; funding-rate and mark-price refetch + rescoring of the headline set; random-entry and B&H baseline simulations.
The unfiltered base is published alongside the headline (avg R −0.21 to −0.24) — the edge is conditional, not unconditional. Env-var pitfalls documented in RUN_CONFIG.md.
# canonical env for the published numbers
export ORB_SUFFIX=_12mo
export ORB_DISCOVERY_DAYS=244
cd backtest
python backtest_v3.py # ORB event backtest (12mo / 546 symbols)
python factor_analysis.py && python composite_filter.py
python block_bootstrap_reverify.py # single-factor verdicts
python baseline_comparison.py # random-entry + B&H baselines