Files
DOLPHIN/nautilus_dolphin/SYSTEM_GOLD_SPEC_GUIDE.md
hjnormey 01c19662cb initial: import DOLPHIN baseline 2026-04-21 from dolphinng5_predict working tree
Includes core prod + GREEN/BLUE subsystems:
- prod/ (BLUE harness, configs, scripts, docs)
- nautilus_dolphin/ (GREEN Nautilus-native impl + dvae/ preserved)
- adaptive_exit/ (AEM engine + models/bucket_assignments.pkl)
- Observability/ (EsoF advisor, TUI, dashboards)
- external_factors/ (EsoF producer)
- mc_forewarning_qlabs_fork/ (MC regime/envelope)

Excludes runtime caches, logs, backups, and reproducible artifacts per .gitignore.
2026-04-21 16:58:38 +02:00

908 lines
38 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SYSTEM GOLD SPEC GUIDE
## DOLPHIN NG — D_LIQ_GOLD Production Reference
**Canonical document. Last updated: 2026-03-22.**
**Purpose:** Exhaustive reference for reproducing D_LIQ_GOLD (ROI=181.81%) from scratch.
Covers every layer of the engine stack, every configuration constant, every file path,
every known gotcha, and the complete research history that led to the gold standard.
---
## TABLE OF CONTENTS
1. [Gold Standard Definition](#1-gold-standard-definition)
2. [How to Reproduce Gold — Step by Step](#2-how-to-reproduce-gold)
3. [System Architecture Overview](#3-system-architecture-overview)
4. [Engine Class Hierarchy (MRO)](#4-engine-class-hierarchy)
5. [Layer-by-Layer Deep Dive](#5-layer-by-layer-deep-dive)
6. [Critical Configuration Constants](#6-critical-configuration-constants)
7. [Data Pipeline — Input Files](#7-data-pipeline)
8. [Test Harness Anatomy](#8-test-harness-anatomy)
9. [Known Bugs and Fixes](#9-known-bugs-and-fixes)
10. [Research History (Exp1Exp15)](#10-research-history)
11. [File Map — All Critical Paths](#11-file-map)
12. [Failure Mode Reference](#12-failure-mode-reference)
---
## 1. GOLD STANDARD DEFINITION
### D_LIQ_GOLD (production default since 2026-03-15)
```
ROI = +181.81%
DD = 17.65% (max drawdown over 56-day window)
Calmar = 10.30 (ROI / max_DD)
PF = ~1.55 (profit factor)
WR = ~52% (win rate)
T = 2155 (EXACT — deterministic, any deviation is a regression)
liq_stops = 1 (0.05% rate — 1 liquidation floor stop out of 2155)
avg_leverage = 4.09x
MC = 0 RED / 0 ORANGE across all 56 days
Meta Monitoring = Gold Certified (MHD v1.0 operational)
```
**Engine class:**
`LiquidationGuardEngine(soft=8x, hard=9x, mc_ref=5x, margin_buffer=0.95, adaptive_beta=True)`
**Factory function:**
```python
from nautilus_dolphin.nautilus.proxy_boost_engine import create_d_liq_engine
engine = create_d_liq_engine(**ENGINE_KWARGS)
```
**Data window:** 56 days, 2025-12-31 to 2026-02-26 (5-second scan data)
**Baseline comparison (BRONZE regression floor):**
NDAlphaEngine, no boost: ROI=+88.55%, PF=1.215, DD=15.05%, Sharpe=4.38, T=2155
---
## 2. HOW TO REPRODUCE GOLD
### Prerequisites
- Python 3.11
- SILOQY env or system Python with: numpy, pandas, numba, scipy, sklearn, pyarrow
- VBT parquet cache at `C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\vbt_cache\`
(56 daily parquet files, 2025-12-31 to 2026-02-26)
### Step 1 — Verify the fix is applied
In `esf_alpha_orchestrator.py` at line ~714, confirm:
```python
def set_esoteric_hazard_multiplier(self, hazard_score: float):
floor_lev = 3.0
ceiling_lev = getattr(self, '_extended_soft_cap', 6.0) # ← MUST use getattr, not 6.0
...
```
If it says `ceiling_lev = 6.0` (hardcoded), the fix has NOT been applied.
Apply the fix FIRST or all D_LIQ results will be ~145.84% instead of 181.81%.
See §9 for full explanation.
### Step 2 — Verify leverage state after engine creation
```python
import os; os.environ['NUMBA_DISABLE_JIT'] = '1' # optional for faster check
from nautilus_dolphin.nautilus.proxy_boost_engine import create_d_liq_engine
from dvae.exp_shared import ENGINE_KWARGS # load without dvae/__init__ (see §9)
eng = create_d_liq_engine(**ENGINE_KWARGS)
assert eng.base_max_leverage == 8.0
assert eng.abs_max_leverage == 9.0
assert eng.bet_sizer.max_leverage == 8.0
eng.set_esoteric_hazard_multiplier(0.0)
assert eng.base_max_leverage == 8.0, "FIX NOT APPLIED — stomp is still active"
assert eng.bet_sizer.max_leverage == 8.0, "FIX NOT APPLIED — sizer stomped"
print("Leverage state OK")
```
### Step 3 — Run the e2e test suite
```bash
cd "C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\nautilus_dolphin"
pytest -m slow tests/test_proxy_boost_production.py -v
```
Expected: **9/9 PASSED** (runtime ~52 minutes)
- `test_e2e_baseline_reproduces_gold` → ROI=88.55% T=2155
- `test_e2e_d_liq_gold_reproduces_exp9b` → ROI=181.81% T=2155 DD≤18.15%
- `test_e2e_mc_silent_all_days` → 0 RED/ORANGE at d_liq leverage
- Plus 6 other mode tests
### Step 4 — Run the painstaking trace backtest (for detailed analysis)
```bash
cd "C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\nautilus_dolphin"
python dvae/run_trace_backtest.py
```
Outputs to `dvae/trace/`:
- `tick_trace.csv` — one row per bar (~346k rows) — full system state
- `trade_trace.csv` — one row per trade (~2155 rows)
- `daily_trace.csv` — one row per day (56 rows)
- `summary.json` — final ROI/DD/T/Calmar
### Quick Gold Reproduction (single-run, no full e2e suite)
```bash
cd "C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\nautilus_dolphin"
python dvae/test_dliq_fix_verify.py
```
Expected output (final 3 lines):
```
ROI match: ✓ PASS (diff=~0pp)
DD match: ✓ PASS (diff=~0pp)
T match: ✓ PASS (got 2155)
```
---
## 3. SYSTEM ARCHITECTURE OVERVIEW
```
┌──────────────────────────────────────────────────────────────┐
│ DOLPHIN NG Production │
│ │
│ VBT Parquet Cache (5s scans, 56 days) │
│ ↓ │
│ Data Loader → float64 df + dvol per bar + vol_p60 │
│ ↓ │
│ AdaptiveCircuitBreaker (ACBv6) → day_base_boost + day_beta │
│ ↓ │
│ OBFeatureEngine (MockOBProvider, 48 assets) │
│ ↓ │
│ MC-Forewarner → day_mc_status (OK/ORANGE/RED) │
│ ↓ │
│ [process_day LOOP per day] │
│ ├── begin_day() → ACB boost + MC gate │
│ ├── FOR EACH BAR: │
│ │ _update_proxy(inst50, v750) → proxy_B │
│ │ step_bar(vel_div, prices, vol_ok) → │
│ │ process_bar() → │
│ │ ENTRY PATH: _try_entry() → size + leverage │
│ │ EXIT PATH: exit_manager.evaluate() → reason │
│ │ _execute_exit() → pnl + trade record │
│ └── end_day() → daily summary │
│ ↓ │
│ trade_history: List[NDTradeRecord] — 2155 records │
└──────────────────────────────────────────────────────────────┘
```
### Signal Pathway
```
vel_div (eigenvalue velocity divergence):
→ vel_div < -0.020 (threshold) → ENTRY signal (LONG, mean reversion)
→ vel_div < -0.050 (extreme) → max leverage region
→ vel_div ≥ -0.020 → NO ENTRY (flat or rising eigenspace)
proxy_B = instability_50 - v750_lambda_max_velocity:
→ high proxy_B = eigenspace stress (high MAE risk at entry)
→ percentile rank vs 500-bar history → day_beta
→ day_beta modulates adaptive_beta boost
→ low proxy_B → higher leverage allowed (less stress, better setup)
vol_regime_ok (dvol > vol_p60):
→ bars where BTC realized vol > 60th percentile of dataset
→ filters out ultra-low-vol bars where signal is noisy
```
---
## 4. ENGINE CLASS HIERARCHY
```
NDAlphaEngine ← base backtest engine
└── ProxyBaseEngine ← adds proxy_B tracking per bar
└── AdaptiveBoostEngine ← scale-boost using proxy_B rank
└── ExtendedLeverageEngine ← 8x/9x leverage + MC decoupling
└── LiquidationGuardEngine ← per-trade liq floor stop
= D_LIQ_GOLD ★
```
**MRO (Python method resolution order):**
`LiquidationGuardEngine → ExtendedLeverageEngine → AdaptiveBoostEngine
→ ProxyBaseEngine → NDAlphaEngine → object`
### Which class owns which method
| Method | Owner class | Notes |
|--------|-------------|-------|
| `process_day()` | `ProxyBaseEngine` | Main backtest loop (begin_day + bar loop + end_day) |
| `step_bar()` | `NDAlphaEngine` (streaming API) | Per-bar state update, calls process_bar() |
| `process_bar()` | `NDAlphaEngine` | Core per-bar logic: entry/exit decision |
| `_try_entry()` | `LiquidationGuardEngine` | Sets `_pending_stop_override` before calling super |
| `_execute_exit()` | `LiquidationGuardEngine` | Counts liquidation stops, calls super |
| `begin_day()` | `ExtendedLeverageEngine` | MC lever-swap: saves true caps, sets mc_ref, restores after super |
| `begin_day()` | `NDAlphaEngine` (via super chain) | ACB boost, MC-Forewarner assessment |
| `end_day()` | `NDAlphaEngine` | Returns daily summary dict |
| `_update_proxy()` | `ProxyBaseEngine` | Updates `_current_proxy_b` per bar |
| `set_esoteric_hazard_multiplier()` | `NDAlphaEngine` | **BUG FIXED 2026-03-22** — now respects `_extended_soft_cap` |
| `set_acb()` | `NDAlphaEngine` | Wires AdaptiveCircuitBreaker |
| `set_ob_engine()` | `NDAlphaEngine` | Wires OBFeatureEngine |
| `set_mc_forewarner()` | `NDAlphaEngine` | Wires DolphinForewarner |
---
## 5. LAYER-BY-LAYER DEEP DIVE
### Layer 1: NDAlphaEngine (base)
**File:** `nautilus_dolphin/nautilus_dolphin/nautilus/esf_alpha_orchestrator.py`
Core engine. All signal generation, position management, exit logic, fee/slippage.
**Key parameters (from ENGINE_KWARGS in exp_shared.py):**
```python
initial_capital = 25000.0
vel_div_threshold = -0.020 # entry trigger: vel_div < this
vel_div_extreme = -0.050 # extreme signal → max bet size
min_leverage = 0.5 # minimum bet size multiplier
max_leverage = 5.0 # base soft cap (overridden by ExtendedLeverageEngine)
leverage_convexity = 3.0 # power in sizing curve
fraction = 0.20 # Kelly-style fraction of capital per trade
fixed_tp_pct = 0.0095 # take profit = 95 basis points
stop_pct = 1.0 # stop loss at 100% of capital = effectively OFF
max_hold_bars = 120 # max bars before forced exit (~10 minutes at 5s)
use_direction_confirm = True # direction confirmation gate
dc_lookback_bars = 7 # bars for DC calculation
dc_min_magnitude_bps = 0.75 # min move magnitude for DC confirmation
dc_skip_contradicts = True # skip entries with contradicting DC
dc_leverage_boost = 1.0 # DC confirms → leverage multiplier
dc_leverage_reduce = 0.5 # DC contradicts → reduce leverage
use_asset_selection = True # IRP-based asset selection (48 assets)
min_irp_alignment = 0.45 # min fraction of assets aligned for entry
use_sp_fees = True # spread + maker fee model
use_sp_slippage = True # slippage model
sp_maker_entry_rate = 0.62 # entry maker rate (bps)
sp_maker_exit_rate = 0.50 # exit maker rate (bps)
use_ob_edge = True # order book edge gate
ob_edge_bps = 5.0 # min OB edge required (bps)
ob_confirm_rate = 0.40 # min OB confirm rate
lookback = 100 # lookback for various rolling windows
use_alpha_layers = True # enable all alpha layers
use_dynamic_leverage = True # dynamic leverage calculation
seed = 42 # RNG seed for determinism
```
**Leverage formula in `_try_entry()`:**
```python
clamped_max_leverage = min(
base_max_leverage * regime_size_mult * market_ob_mult,
abs_max_leverage
)
raw_leverage = size_result["leverage"] * dc_lev_mult * regime_size_mult * market_ob_mult
leverage = min(raw_leverage, clamped_max_leverage)
```
Where:
- `base_max_leverage`: set by engine (5.0 base, 8.0 for D_LIQ)
- `regime_size_mult`: ACBv6-driven, typically 1.01.6
- `market_ob_mult`: OB-driven multiplier
- `abs_max_leverage`: hard cap (6.0 base, 9.0 for D_LIQ)
**Exit reasons (exit_manager):**
- `FIXED_TP` — take profit at 95bps
- `MAX_HOLD` — held 120+ bars
- `STOP_LOSS` — stop triggered (only liquidation guard stop in D_LIQ)
- `HIBERNATE_HALT` — MC-RED day halt
- `OB_TAIL_AVOIDANCE` — OB cascade/withdrawal signal (never fires with MockOBProvider)
### Layer 2: ProxyBaseEngine
**File:** `nautilus_dolphin/nautilus_dolphin/nautilus/proxy_boost_engine.py`
Adds per-bar `proxy_B = instability_50 - v750_lambda_max_velocity` tracking.
**Key attribute:** `self._current_proxy_b` — updated by `_update_proxy(inst, v750)` before each `step_bar()` call.
**Key method — `process_day()` loop:**
```python
def process_day(self, date_str, df, asset_columns, vol_regime_ok=None, ...):
self.begin_day(date_str, ...)
for ri in range(len(df)):
row = df.iloc[ri]
vd = row.get('vel_div')
if vd is None or not np.isfinite(float(vd)): continue
v50 = gf('v50_lambda_max_velocity')
v750 = gf('v750_lambda_max_velocity')
inst = gf('instability_50')
self._update_proxy(inst, v750) # ← proxy_B updated HERE
prices = {ac: float(row[ac]) for ac in asset_columns if ...}
vrok = bool(vol_regime_ok[ri]) if vol_regime_ok is not None else (bid >= 100)
self.step_bar(bar_idx=ri, vel_div=float(vd), prices=prices, ...) # ← bar processed
return self.end_day()
```
### Layer 3: AdaptiveBoostEngine
**File:** `nautilus_dolphin/nautilus_dolphin/nautilus/proxy_boost_engine.py`
Scale-boost mechanism. After `super()._try_entry()` succeeds, multiplies notional/leverage
by a factor determined by proxy_B percentile rank vs 500-bar history.
With `adaptive_beta=True` (D_LIQ default):
```python
alpha_eff = alpha * (1 + day_beta) # day_beta from ACBv6 daily amplitude regime
# Lower proxy_B at entry → lower prank → more aggressive boost
# Higher proxy_B → prank near 1.0 → minimal/no boost
scale = max(1.0, 1.0 + alpha_eff * max(0, threshold - prank))
```
`day_beta`: ACBv6 outputs a beta value proportional to amplitude regime. High beta →
more aggressive days get extra boost. Low beta → conservative days, less amplification.
### Layer 4: ExtendedLeverageEngine
**File:** `nautilus_dolphin/nautilus_dolphin/nautilus/proxy_boost_engine.py`
Extends the leverage ceiling from 5x/6x to 8x/9x (D_LIQ config).
**Critical mechanism — MC decoupling in `begin_day()`:**
```python
def begin_day(self, date_str, posture='APEX', direction=None):
# Save true extended caps
_true_base = self.base_max_leverage # 8.0 for D_LIQ
_true_abs = self.abs_max_leverage # 9.0 for D_LIQ
_true_sizer = self.bet_sizer.max_leverage # 8.0 for D_LIQ
# Temporarily show MC a reference leverage (5.0)
self.base_max_leverage = self._mc_leverage_ref # 5.0
self.bet_sizer.max_leverage = self._mc_leverage_ref # 5.0
self.abs_max_leverage = self._mc_leverage_ref # 5.0
super().begin_day(...) # MC-Forewarner assesses at 5.0x reference
# Restore true caps for actual trading
self.base_max_leverage = _true_base # 8.0
self.bet_sizer.max_leverage = _true_sizer # 8.0
self.abs_max_leverage = _true_abs # 9.0
```
**Why this matters:** Without MC decoupling, at 8x/9x leverage the MC-Forewarner
would assess catastrophic risk at 8x and potentially return RED/ORANGE, halting trading.
By showing it mc_ref=5.0 (within its trained range), MC stays GREEN every day.
Empirically confirmed: 0 RED / 0 ORANGE across all 56 days at any leverage up to 10x.
### Layer 5: LiquidationGuardEngine (D_LIQ_GOLD)
**File:** `nautilus_dolphin/nautilus_dolphin/nautilus/proxy_boost_engine.py`
Adds a per-trade liquidation floor stop. Before every entry:
```python
def _try_entry(self, bar_idx, vel_div, prices, price_histories, v50_vel=0.0, v750_vel=0.0):
self._pending_stop_override = self._liq_stop_pct # = (1/9) * 0.95 = 10.56%
return super()._try_entry(...)
```
If price moves >10.56% against the position, stop fires before exchange liquidates.
- With 9x leverage: exchange liquidates at ~11.1% adverse move
- Our stop at 10.56% → exits ~0.56% before exchange force-liquidation
- `margin_buffer = 0.95` provides this safety margin
**Result:** 1 stop triggered across 2155 trades = 0.05% rate (negligible). The guard
provides safety without materially impacting returns.
---
## 6. CRITICAL CONFIGURATION CONSTANTS
### ENGINE_KWARGS (test harness gold standard)
**File:** `nautilus_dolphin/dvae/exp_shared.py` line 5667
```python
ENGINE_KWARGS = dict(
initial_capital=25000.0, vel_div_threshold=-0.02, vel_div_extreme=-0.05,
min_leverage=0.5, max_leverage=5.0, leverage_convexity=3.0,
fraction=0.20, fixed_tp_pct=0.0095, stop_pct=1.0, max_hold_bars=120,
use_direction_confirm=True, dc_lookback_bars=7, dc_min_magnitude_bps=0.75,
dc_skip_contradicts=True, dc_leverage_boost=1.0, dc_leverage_reduce=0.5,
use_asset_selection=True, min_irp_alignment=0.45,
use_sp_fees=True, use_sp_slippage=True,
sp_maker_entry_rate=0.62, sp_maker_exit_rate=0.50,
use_ob_edge=True, ob_edge_bps=5.0, ob_confirm_rate=0.40,
lookback=100, use_alpha_layers=True, use_dynamic_leverage=True, seed=42,
)
```
Note: `max_leverage=5.0` is passed but IGNORED for D_LIQ — `ExtendedLeverageEngine.__init__`
overrides it to `D_LIQ_SOFT_CAP=8.0` unconditionally.
### MC_BASE_CFG (MC-Forewarner config)
**File:** `nautilus_dolphin/dvae/exp_shared.py` line 6981
Key param: `'max_leverage': 5.00` — matches `D_LIQ_MC_REF=5.0` for consistency.
### D_LIQ Constants
**File:** `nautilus_dolphin/nautilus_dolphin/nautilus/proxy_boost_engine.py` line 437440
```python
D_LIQ_SOFT_CAP = 8.0 # base_max_leverage: soft ceiling, ACBv6 can push toward hard cap
D_LIQ_ABS_CAP = 9.0 # abs_max_leverage: hard ceiling, never exceeded
D_LIQ_MC_REF = 5.0 # MC-Forewarner reference: within GOLD trained range
D_LIQ_MARGIN_BUF = 0.95 # liquidation floor = (1/9) * 0.95 = 10.56% adverse move
```
### Vol P60 (gold calibration method)
**File:** `nautilus_dolphin/dvae/exp_shared.py` `load_data()` function
```
vol_p60 ≈ 0.00009868 (from 2 parquet files, range(60), seg-based stddev, v>0 filter)
```
Method:
```python
for pf in parquet_files[:2]: # ONLY FIRST 2 FILES
df = pd.read_parquet(pf)
pr = df['BTCUSDT'].values
for i in range(60, len(pr)): # range(60), NOT range(50)
seg = pr[max(0, i-50):i]
if len(seg) < 10: continue
v = float(np.std(np.diff(seg) / seg[:-1]))
if v > 0: all_vols.append(v) # v>0 filter
vol_p60 = float(np.percentile(all_vols, 60))
```
**CRITICAL:** Any deviation from this exact method will change vol_p60 and alter trade
timing, potentially changing T away from 2155. The `run_backtest()` function in
`exp_shared.py` uses a slightly different (rolling) method that may give slightly
different results — the `load_data()` gold method is canonical for gold reproduction.
### MockOBProvider config
**File:** `nautilus_dolphin/dvae/exp_shared.py` `load_data()` function
```python
MockOBProvider(
imbalance_bias=-0.09, depth_scale=1.0, assets=OB_ASSETS,
imbalance_biases={
"BTCUSDT": -0.086, "ETHUSDT": -0.092,
"BNBUSDT": +0.05, "SOLUSDT": +0.05,
},
)
```
OB_ASSETS = all 48 assets from parquet file columns (sorted alphabetically).
`ob_confirm_rate=0.40`: with these biases, most entries pass the OB gate.
`OB_TAIL_AVOIDANCE` (cascade/withdrawal exits) NEVER fire with MockOBProvider
(mock provider generates synthetic data that never crosses the cascade threshold).
---
## 7. DATA PIPELINE
### Primary Data Source (backtest)
**Path:** `C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\vbt_cache\`
**Format:** Daily Parquet files, named `YYYY-MM-DD.parquet`
**Window:** 56 files, 2025-12-31 to 2026-02-26
**Columns per file:**
- 48 asset price columns (BTCUSDT, ETHUSDT, BNBUSDT, etc.) — float64
- `vel_div` — eigenvalue velocity divergence — core signal
- `v50_lambda_max_velocity`, `v150_lambda_max_velocity`, `v300_lambda_max_velocity`, `v750_lambda_max_velocity`
- `instability_50`, `instability_150`
- `timestamp`, `scan_number` (metadata, excluded from asset columns)
**META_COLS** (excluded from asset price list):
```python
META_COLS = {
'timestamp', 'scan_number', 'v50_lambda_max_velocity', 'v150_lambda_max_velocity',
'v300_lambda_max_velocity', 'v750_lambda_max_velocity', 'vel_div',
'instability_50', 'instability_150'
}
```
**Bar frequency:** 5 seconds (scan_number advances every 5s from NG5 scanner)
**Bars per day:** ~6,192 (5s × 86400s / 5 ≈ 17,280, but market hours vary → ~6k active bars)
**Total bars:** ~346,740 over 56 days
### Eigenvalue Source
**Path:** `C:\Users\Lenovo\Documents\- Dolphin NG HD (NG3)\correlation_arb512\eigenvalues\`
Used by NG5 scanner to produce eigenvalue features for each 5s scan.
### ExF NPZ (External Factors)
**Path:** `C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\external_factors\eso_cache\`
**Latest:** `latest_esoteric_factors.json` — lunar phase, regional session, Fibonacci time
**NPZ backfill:** All 1710 historical dates in `vbt_cache_klines/` have `scan_000001__Indicators.npz`
### MC-Forewarner Models
**Path:** `C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\nautilus_dolphin\mc_results\models\`
**Format:** Pickle files (sklearn 1.7.1 — note: loading with 1.8.0 raises InconsistentVersionWarning but works)
**Models:** OneClassSVM, DummyRegressor, DecisionTreeRegressor, GradientBoostingRegressor, StandardScaler
Result: All 56 days return OK (0 RED/ORANGE) when assessed at mc_ref=5.0.
### 5-Year Klines Dataset (for regime research)
**Path:** `C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\vbt_cache_klines\`
**Format:** 1710 parquet files, 2021-06-15 to 2026-03-05
**Frequency:** 1-minute OHLCV + vel_div + eigenvalue features
---
## 8. TEST HARNESS ANATOMY
### Primary e2e test
**File:** `nautilus_dolphin/tests/test_proxy_boost_production.py` (UNTRACKED)
Contains 9 e2e tests including `test_e2e_d_liq_gold_reproduces_exp9b`.
Run: `pytest -m slow tests/test_proxy_boost_production.py`
**`_run_engine()` function (critical path):**
```python
def _run_engine(eng, d, fw, MC_BASE_CFG):
acb = AdaptiveCircuitBreaker()
acb.preload_w750(d['date_strings'])
eng.set_ob_engine(d['ob_eng'])
eng.set_acb(acb)
if fw is not None:
eng.set_mc_forewarner(fw, MC_BASE_CFG)
eng.set_esoteric_hazard_multiplier(0.0) # ← CRITICAL: now correct (calls fixed function)
for pf_file in d['parquet_files']:
ds = pf_file.stem
df, acols, dvol = d['pq_data'][ds] # ← float64 pq_data from load_data()
cap_before = eng.capital
vol_ok = np.where(np.isfinite(dvol), dvol > d['vol_p60'], False)
eng.process_day(ds, df, acols, vol_regime_ok=vol_ok)
```
### exp_shared.py functions
**File:** `nautilus_dolphin/dvae/exp_shared.py`
- `load_data()` → gold-standard data loading (float64, seg-based vol_p60, 48 OB assets)
- `run_backtest(engine_factory, name, ...)` → lazy-loading backtest (float32, rolling vol_p60)
Note: `run_backtest()` internally calls `eng.set_esoteric_hazard_multiplier(0.0)` — now
correct after the fix. Uses slightly different vol_p60 method (rolling, not gold).
- `ensure_jit()` → triggers numba JIT warmup (calls all numba functions once)
### Import Warning: dvae/__init__.py loads PyTorch
**File:** `nautilus_dolphin/dvae/__init__.py`
```python
from .hierarchical_dvae import HierarchicalDVAE # ← loads PyTorch!
from .corpus_builder import DolphinCorpus
```
**CONSEQUENCE:** Any `from dvae.exp_shared import ...` statement will import PyTorch
via `dvae/__init__.py`, consuming ~700MB+ RAM and potentially causing OOM.
**CORRECT PATTERN:**
```python
_HERE = Path(__file__).resolve().parent # dvae/ directory
sys.path.insert(0, str(_HERE)) # add dvae/ to path
from exp_shared import run_backtest, GOLD # direct import, no __init__.py
```
### Trace Backtest (painstaking per-tick logger)
**File:** `nautilus_dolphin/dvae/run_trace_backtest.py` (created 2026-03-22)
Produces per-tick, per-trade, and per-day CSV trace files.
See §2 Step 4 for usage and output format.
---
## 9. KNOWN BUGS AND FIXES
### BUG 1 (CRITICAL — FIXED 2026-03-22): set_esoteric_hazard_multiplier stomps D_LIQ leverage
**File:** `nautilus_dolphin/nautilus_dolphin/nautilus/esf_alpha_orchestrator.py` line 707720
**Symptom:** D_LIQ backtests give ROI=145.84% instead of gold 181.81%.
**Root cause:** `ceiling_lev = 6.0` was hardcoded. When called with `hazard_score=0.0`,
the function set `base_max_leverage = 6.0` and `bet_sizer.max_leverage = 6.0`,
overwriting D_LIQ's `_extended_soft_cap = 8.0`. On all non-ACB-boosted days
(~40 of 56 days), this reduced available leverage from 8.0x to 6.0x = **33% less**.
The resulting ROI gap: 181.81% - 145.84% = **35.97pp**.
**Fix:**
```python
# BEFORE (wrong):
ceiling_lev = 6.0
# AFTER (correct):
ceiling_lev = getattr(self, '_extended_soft_cap', 6.0)
```
**Verified:** After fix, `eng.set_esoteric_hazard_multiplier(0.0)` on a D_LIQ engine
gives `base_max_leverage = 8.0` (was 6.0). NDAlphaEngine (no `_extended_soft_cap`)
still gets 6.0 — backwards compatible.
**Callers affected:**
- `exp_shared.py:176``run_backtest()` → now correct
- `tests/test_proxy_boost_production.py``_run_engine()` → now correct
- `titan_stage1_run.py:130` → now correct
- `dvae/exp9b_liquidation_guard.py`, all exp*.py → now correct
- `run_esoteric_throttled_backtest.py:142` → now correct (correctly scales from 8.0 ceiling)
**Paradox resolved:** `titan_stage1_run.log` shows ROI=181.81% WITH the stomp call.
This was because when titan_stage1 ran (2026-03-15), the function either (a) didn't
exist yet and was added to titan_stage1_run.py after the run, or (b) the function had
a different implementation. Since titan_stage1_run.py is untracked, git history is
unavailable. The 181.81% result is authentic (confirmed by 9/9 e2e tests on 2026-03-15).
### BUG 2 (FIXED): dvae/__init__.py PyTorch OOM
See §8. Fixed by using `sys.path.insert(0, str(_HERE))` before importing from `exp_shared`.
### BUG 3 (FIXED 2026-03-09): NG5 scanner PriceData extraction
NG5 scanner had a PriceData extraction bug causing all-zero eigenvalues since 2026-03-08.
Fixed in `eso_cache/` and backfill scripts. All eigenvalue data now correct.
### BUG 4 (KNOWN): MC model sklearn version mismatch
MC models saved with sklearn 1.7.1, loaded with 1.8.0. Produces warnings but works.
Retraining models with sklearn 1.8.0 would eliminate warnings.
### BUG 5 (KNOWN): OOM during numba JIT warmup on low-RAM systems
With <1.5GB free RAM, `ensure_jit()` (which compiles all numba functions) may fail.
**Workaround:** Use `NUMBA_DISABLE_JIT=1` for quick checks, or wait for RAM to free.
Numba cache (95 `.nbc` files in `nautilus_dolphin/nautilus_dolphin/nautilus/__pycache__/`)
should be warmed from previous runs.
---
## 10. RESEARCH HISTORY (Exp1Exp15)
All experiments ran on the 56-day (Dec31 2025 Feb26 2026) dataset, T=2155 baseline.
### Foundation: NDAlphaEngine BRONZE baseline
- ROI=88.55%, PF=1.215, DD=15.05%, Sharpe=4.38, T=2155
- Script: `test_pf_dynamic_beta_validate.py`
### Exp4: proxy_B Signal Characterization
- Signal: `proxy_B = instability_50 - v750_lambda_max_velocity`
- AUC=0.715 for eigenspace stress detection
- r=+0.42 (p=0.003) correlation with intraday MAE
- r=-0.03 (ns) with vel_div ORTHOGONAL pure position-sizing layer
- Results: `dvae/exp4_proxy_coupling.py`
### Exp6: Stop Tightening Research (DEAD)
- All 8 configs fail: global stops cause re-entry cascade (14152916 trades)
- Best gated: ROI=38.42% DD=19.42% far worse than baseline
- `stop_pct=1.0` (effectively OFF) confirmed optimal
- Results: `dvae/exp6_stop_test_results.json`
### Exp7: Live Coupling (scale_boost)
- `scale_boost(thr=0.35, alpha=1.0)`: ROI=93.61% DD=14.51% T=2155 (+5.06pp ROI, -0.54pp DD)
- `hold_limit` and `rising_exit`: 91% early exit rate cascade DEAD
- Results: `dvae/exp7_live_coupling_results.json`
### Exp8: Adaptive Parameterization → PREV GOLD
- `adaptive_beta(thr=0.35, alpha×(1+day_beta))`: ROI=96.55% DD=14.32% T=2155
- NOT overfitting: both H1+H2 temporal halves improve vs baseline
- **Was GOLD from 2026-03-14 to 2026-03-15**
- Results: `dvae/exp8_boost_robustness_results.json`
### Exp9: Extended Leverage Ceiling (8 configs)
- MC-Forewarner stays GREEN at ALL leverage levels tested (5x through 10x)
- DD plateau after 7x: each +1x costs only ~+0.12pp DD (convex curve)
- Best ROI: E(9/10x)=184.00% DD=18.56% liquidation risk unmodeled
- MC decoupling via `begin_day` lever swap (mc_ref=5.0) confirmed essential
- Results: `dvae/exp9_leverage_ceiling_results.json`
### Exp9b: Liquidation Guard → D_LIQ_GOLD
- D_liq(8/9x) + liquidation floor at 10.56% (=1/9×0.95):
**ROI=181.81%, DD=17.65%, Calmar=10.30, T=2155, liq_stops=1**
- E_liq(9/10x): 5 stops cascade DEAD (DD=31.79%)
- D_liq is the sweet spot: high leverage, protected against forced liquidation
- **BECAME GOLD 2026-03-15**
- Results: `dvae/exp9b_liquidation_guard_results.json`
### Exp9c: Overfitting Validation
- H1/H2 split: D_LIQ wins ROI in BOTH halves; Calmar dips H2 (-0.23 margin)
- Q1Q4 split: PASS Q1/Q2, marginal FAIL Q3/Q4 (Q2 carries most outperformance)
- Buffer sweep 0.801.00: 0.901.00 identical; 0.80 cascades (5 stops)
- Verdict: regime-conditional upgrade works best in volatile markets (Q1/Q2)
- Results: `dvae/exp9c_overfitting_results.json`
### Exp10: 1m Keyframe Gate (DEAD)
- i150_z1m + TITAN recon_err z-scores all z_recon signals hurt performance
- Calmar 7.70 vs 7.82 threshold. Killed.
### Exp11: z_recon_inv Baseline (DEAD)
- Noise floor, scale_mean=0.999. No signal. Killed.
### Exp12: ConvNeXt z-Gate (INCONCLUSIVE)
- Used wrong ep=17 model (not v2 BOB). z10_inv +1.41pp ROI but Calmar 7.73 < 7.83.
### Exp13 v2: ZLeverageGateEngine → CONFIRMED SIGNAL ⭐
- Signal: daily z[13] from 1m ConvNeXt v2 BOB (r=+0.933 with proxy_B)
- **9/20 Phase 2 configs PASS** Calmar > 7.83 vs D_LIQ_GOLD baseline
- Best: `A_P5_M2_W1_a0.5` → ROI=186.40% (+4.59pp), Calmar=7.87
- Compounding: +$2.38M on $25k over 1 year (+11.1%) — zero DD cost
- **⚠️ PENDING PRODUCTIONIZATION** (see `memory/todo_productize.md`)
- Results: `dvae/exp13_multiscale_sweep_results.json`
### Exp14: z[13]/z_post_std/delta leverage gate sweep
- Running at time of writing. Results → `dvae/exp14_results.json`
### Exp15: z[13]-gated per-trade stop+TP extension
- Running at time of writing. Results → `dvae/exp15_results.json`
---
## 11. FILE MAP — ALL CRITICAL PATHS
### Core Engine Files
```
nautilus_dolphin/
└── nautilus_dolphin/
└── nautilus/
├── esf_alpha_orchestrator.py ← NDAlphaEngine (BASE) — ALL core logic
│ Lines of interest:
│ 6883: NDTradeRecord dataclass
│ 86720: NDAlphaEngine class
│ 196: self.trade_history: List[NDTradeRecord]
│ 241289: step_bar() — streaming API
│ 294357: process_bar() — per-bar entry/exit
│ 358450: _execute_exit() — exit finalization
│ 707720: set_esoteric_hazard_multiplier() ← BUG FIXED 2026-03-22
│ 779826: begin_day() — streaming API
│ 827850: end_day() — streaming API
├── proxy_boost_engine.py ← ProxyBase + AdaptiveBoost + ExtendedLev + LiqGuard
│ Lines of interest:
│ 136: module docstring with gold numbers
│ 47103: create_boost_engine() factory
│ 110203: ProxyBaseEngine — process_day() + _update_proxy()
│ 209303: AdaptiveBoostEngine — scale-boost logic
│ 311385: ExtendedLeverageEngine — MC decoupling begin_day()
│ 392430: LiquidationGuardEngine — _try_entry() + _execute_exit()
│ 437465: D_LIQ constants + create_d_liq_engine() factory
├── adaptive_circuit_breaker.py ← ACBv6: day_base_boost + day_beta
├── alpha_exit_manager.py ← Exit logic: FIXED_TP, MAX_HOLD, STOP, OB
├── alpha_bet_sizer.py ← compute_sizing_nb() — numba leverage sizing
├── alpha_asset_selector.py ← compute_irp_nb() — IRP asset ranking
├── alpha_signal_generator.py ← check_dc_nb() — direction confirmation
├── ob_features.py ← OB feature computation (numba)
└── ob_provider.py ← MockOBProvider / CSVOBProvider
```
### Test & Research Files
```
nautilus_dolphin/
├── tests/
│ └── test_proxy_boost_production.py ← 9 e2e tests, 42 unit tests (UNTRACKED)
├── dvae/
│ ├── exp_shared.py ← Shared test infrastructure (gold data, run_backtest)
│ ├── run_trace_backtest.py ← Painstaking per-tick trace logger (new 2026-03-22)
│ ├── test_dliq_fix_verify.py ← Quick D_LIQ gold reproduction verify (new 2026-03-22)
│ ├── test_dliq_nostomp.py ← WITH vs WITHOUT stomp comparison
│ │
│ ├── exp9b_liquidation_guard.py ← Exp9b original research
│ ├── exp9b_retest.log ← Retest attempt (died with sklearn warnings)
│ ├── exp9c_overfitting_validation.py ← Overfitting validation research
│ ├── exp13_multiscale_sweep.py ← ConvNeXt z[13] gate sweep
│ ├── exp14_sweep.py ← z[13] leverage gate sweep (running)
│ ├── exp15_stop_gate.py ← z[13] stop+TP gate (running)
│ │
│ ├── trace/ ← Created by run_trace_backtest.py
│ │ ├── tick_trace.csv ← Per-bar system state (~69MB)
│ │ ├── trade_trace.csv ← Per-trade details (~320KB)
│ │ ├── daily_trace.csv ← Per-day summary
│ │ └── summary.json ← Final ROI/DD/T/Calmar
│ │
│ └── convnext_model_v2.json ← 1m ConvNeXt v2 BOB (z[13]=proxy_B, r=0.933)
│ = convnext_model_1m_bob.json ← symlink/copy
└── run_logs/
└── REGISTRY.md ← CANONICAL inter-agent sync file — READ FIRST
```
### Data Paths
```
C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\
├── vbt_cache\ ← 56 daily parquet files (5s scans, primary backtest)
│ └── 2025-12-31.parquet .. 2026-02-26.parquet
├── vbt_cache_klines\ ← 1710 daily parquet files (1m OHLCV, 20212026)
├── external_factors\
│ ├── eso_cache\
│ │ └── latest_esoteric_factors.json ← Current lunar/astro/session state
│ ├── realtime_exf_service.py ← Live ExF update service
│ └── backfill_patch_npz.py ← Historical ExF backfill
└── nautilus_dolphin\
├── mc_results\models\ ← MC-Forewarner trained models
└── run_logs\REGISTRY.md ← Canonical registry
```
### Production Files (live trading)
```
nautilus_dolphin/
├── prod/
│ ├── dolphin_actor.py ← Live trading actor (reads boost_mode from config)
│ ├── paper_trade_flow.py ← Prefect paper trading flow
│ ├── vbt_backtest_flow.py ← Prefect backtest flow
│ ├── mc_forewarner_flow.py ← MC update flow (every 4h)
│ └── esof_update_flow.py ← EsoF update flow (every 6h)
└── dolphin_vbt_real.py ← (parent dir) Live VBT backtest runner
```
---
## 12. FAILURE MODE REFERENCE
### T ≠ 2155 (wrong trade count)
| Symptom | Likely Cause | Fix |
|---------|-------------|-----|
| T < 2155 | Missing parquet files / wrong date range | Check vbt_cache, ensure 56 files Dec31Feb26 |
| T < 2155 | Wrong vol_p60 (too high too many bars filtered) | Use gold load_data() method |
| T 2155 | Wrong seed different DC/IRP randomness | Ensure seed=42 in ENGINE_KWARGS |
| T > 2155 | Liquidation stop cascade (re-entries) | margin_buffer too small or abs_cap too high |
### ROI ≈ 145% instead of 181.81%
**Cause:** `set_esoteric_hazard_multiplier()` stomping `base_max_leverage` to 6.0.
**Fix:** Apply the `getattr(self, '_extended_soft_cap', 6.0)` fix. See §9 Bug 1.
### ROI ≈ 8896% instead of 181.81%
**Cause:** Using wrong engine. `create_boost_engine(mode='adaptive_beta')` gives 96.55%.
`NDAlphaEngine` gives 88.55%. Must use `create_d_liq_engine()` for 181.81%.
### OOM during test run
**Cause 1:** `from dvae.exp_shared import ...` triggers `dvae/__init__.py` → PyTorch load.
**Fix:** Use `sys.path.insert(0, str(_HERE)); from exp_shared import ...` (direct import).
**Cause 2:** `ensure_jit()` numba compilation with <1.5GB free RAM.
**Fix:** Close memory-hungry apps. Numba cache (95 `.nbc` files) should prevent recompilation.
Check: `ls nautilus_dolphin/nautilus_dolphin/nautilus/__pycache__/*.nbc | wc -l` 95.
### MC-Forewarner fires RED/ORANGE
**Cause:** `set_mc_forewarner()` called BEFORE `set_esoteric_hazard_multiplier()`.
Or `mc_leverage_ref` not set to 5.0 (mc_ref must match MC trained range ~5x).
**Expected:** 0 RED / 0 ORANGE when mc_ref=5.0. Any RED day halts trading fewer trades.
### sklearn InconsistentVersionWarning
Not a bug MC models saved with 1.7.1, loaded with 1.8.0. Warnings are harmless.
Suppress: `import warnings; warnings.filterwarnings('ignore', category=InconsistentVersionWarning)`
---
## APPENDIX: Quick Commands
```bash
# Working directory for all commands:
cd "C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict\nautilus_dolphin"
# Verify fix (fast, no numba):
python -c "
import os; os.environ['NUMBA_DISABLE_JIT']='1'
import sys; sys.path.insert(0, '.')
from nautilus_dolphin.nautilus.proxy_boost_engine import create_d_liq_engine
from dvae.exp_shared import ENGINE_KWARGS
e=create_d_liq_engine(**ENGINE_KWARGS)
e.set_esoteric_hazard_multiplier(0.0)
assert e.base_max_leverage==8.0, 'STOMP ACTIVE'
print('FIX OK: base_max_leverage=', e.base_max_leverage)
"
# Quick D_LIQ gold reproduction (~400s with lazy loading):
python dvae/test_dliq_fix_verify.py
# Full painstaking trace with per-tick/trade logging (~400s):
python dvae/run_trace_backtest.py
# Full e2e suite (9 tests, ~52 minutes):
pytest -m slow tests/test_proxy_boost_production.py -v
# Check REGISTRY for latest run history:
type run_logs\REGISTRY.md | more
```