Date: 2026-09-04 Status: Both layers are now LIVE on the paper trading bots.
What was enabled
P2b: depth-filter on gate60
P_DEPTH_FILTER_GATE60=1in thegate60bot's env.- Binance bookDepth feed is READY (z24 distribution matches the backtest exactly: mean -0.015/std 1.08 for ETH).
- The OKX self-recorder is at 14.9 days, just below the 31-day warmup; until then the live gate fail-opens (no behavior change). Once OKX clears, the live z24>0 skip rule starts firing on real orders.
P2c: CARRY x BASIS sizing overlay
P_CARRY_BASIS_OVERLAY=1on:gate60(ETH, CONFIRMED), and all 6 alt sleeves (SOL, XRP, LINK, AVAX, DOGE, ADA — all PASS in OOS, 2 confirmed in forward).P_CARRY_BASIS_OVERLAY=0on:gate60btc(BTC, INERT in OOS; leaving OFF keeps the bot behavior unchanged and avoids a coin that the validation showed doesn't benefit).
Code changes
start_bots.py
gate60env: addedP_CARRY_BASIS_OVERLAY=1, keptP_DEPTH_FILTER_GATE60=1. Comment updated to reference the multi-coin study.gate60btcenv: addedP_CARRY_BASIS_OVERLAY=0(explicit default; was implicit before). Comment notes that BTC is INERT per the validation.- All 6 alt sleeves: added
P_CARRY_BASIS_OVERLAY=1to their env. Comment notes that 2 of 6 are confirmed in forward (SOL, LINK) and 4 are uninformative (INERT, n too small). - The
P_DEPTH_FILTER_GATE60env was NOT added to the alt sleeves' env because the depth filter was only validated for ETH; the alts inherit the shared.envwhich doesn't set the flag, so the filter stays disabled on the alts (correct).
production/carry_basis_overlay.py
- Docstring updated to reflect the multi-coin validation result (7 of 8 PASS, BTC INERT) and the forward-OOS confirmation (ETH/SOL/LINK confirmed).
- No code logic change — the existing
resolve_instrument()already correctly dispatches by runner SYMBOL.
Live verification
gate60 one-shot smoke test
[2026-09-04] signal=LONG prev=0 target=1 eth_close=2456.376
sma200=2033.755 eth_roc60=0.365869 btc_roc60=0.244624
OBSERVE_ONLY
depth={'enabled': True, 'effective_target': 1, 'source': 'okx',
'status': 'warming', 'reason': 'okx history 14.9 days < 31 days'}
cb={'enabled': True, 'multiplier': 1.0,
'carry_z': -0.0, 'basis_z': 1.18,
'feature_ts': '2026-09-05 01:00:00', 'status': 'active',
'reason': 'mixed or sub-threshold ...; mult=1.0',
'bucket': '1.0x (pass)'}
Both layers are consulted on every cycle. The depth-filter is
in warming (OKX cache not yet 31 days, fail-open) and the
carry/basis overlay is active with sub-threshold passthrough
(most days). The bot's state and ledger both record the verdicts.
Ledger audit
The most recent gate60 ledger entry shows cb_verdict.enabled=true
with real z-scores from the Hyperliquid cache (carry_z=0.0,
basis_z=1.18). The previous entries (from the older bot instance
without the env update) showed enabled=false — confirming the
restart picked up the new env correctly.
Live bot status
17/20 bots up: gate60 (pid 10032), gate60btc (pid 12864),
altsol (pid 6776), altxrp (pid 10372),
altlink (pid 2940), altavax (pid 15484),
altdoge (pid 8596), altada (pid 17532),
depthov, depthrec, flagship, etftrend, tsy,
eqmom, bookalloc, pead, corrtrack
All 17 live bots [OK ]. Three intentional XX: pooled, panel,
pead_v2 (missing .env.* files for separate paper accounts).
What to monitor
- OKX depth recorder (
depthrec): currently at 14.9 days. Will clear the 31-day warmup around 2026-09-20. The live z24>0 skip rule starts firing after that. - gate60 decision ledger (
production/state/ledger.jsonl): watch for the firstcb_verdict.bucket in {0.5x (both_hi), 1.25x (both_lo)}entries — these are the active sizing events. The 1.25x entries are the alpha play (longs collect funding when shorts are crowded); the 0.5x entries are the safety play (half size when longs are crowded). - Hyperliquid funding cache freshness:
data/parquet/hyperliquid/{COIN}_funding.parquetshould be refreshed daily viadata.hyperliquid.update_funding_cache(). If the cache goes stale (>48h), the overlay returns status="stale" with mult=1.0 (fail-open, no behavior change). - Per-coin carry/basis bucket distribution: the OOS study predicted ~1.8% of ETH long days at 0.5x, ~4.2% at 1.25x, ~81.9% at 1.0x (no signal), ~12.0% at 1.0x (mixed). Live distribution should roughly match; if the live fire rate drifts substantially (e.g. 0% active), the funding market regime has changed and a re-validation is warranted.
Operator next steps
-
No action required for ~2 weeks until the OKX cache clears. The current live state is "both layers wired, both benign (always fail-open to mult=1.0 / no skip)" — the order math is exactly the pre-overlay, pre-depth-filter behavior.
-
After ~2 weeks when the OKX cache clears, the live skip pattern will start. Compare the live skip-rate to the backtest's 49% (172 of 352 long days skipped). If the live rate is in [40%, 60%], the depth-filter is performing as validated.
-
Monthly forward-OOS check:
python validation/carry_basis_overlay_forward_oos.py --coin ETH(and the other coins once 5Min data accumulates beyond 2026-08-31). Re-confirm the verdicts in fresh forward windows. The proposal is to keep the overlay on indefinitely as long as the monthly CONFIRMED verdict holds. -
Do NOT change the equity fractions. The alt sleeves deploy 10% each (60% combined) and the gate60 sleeve deploys 100% on its own paper account. The carry/basis overlay's 1.25x boost applies multiplicatively on top of these base fractions. In the worst case (all 6 alts at 1.25x), the combined deploy is 75% of account equity, still under 100% and only triggered when ALL six alt funding/basis signals are simultaneously stretched SHORT (rare).
Tests
- 64/64 tests pass (depth_filter: 23, carry_basis_overlay: 41).
- 17/20 bots up.
- All 8 funding caches and 8 5Min daily caches refreshed.