Files
DOLPHIN/nautilus_dolphin/SYSTEM_GOLD_SPEC_GUIDE.md

908 lines
38 KiB
Markdown
Raw Normal View History

# 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 (1415→2916 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
```