85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
|
|
"""Quick test: D_LIQ with and without set_esoteric_hazard_multiplier(0.0)
|
||
|
|
to confirm that's the root cause of 181.81% → 145.84% regression.
|
||
|
|
"""
|
||
|
|
import sys, time, math
|
||
|
|
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
||
|
|
from pathlib import Path
|
||
|
|
import numpy as np
|
||
|
|
|
||
|
|
_HERE = Path(__file__).resolve().parent
|
||
|
|
sys.path.insert(0, str(_HERE.parent))
|
||
|
|
|
||
|
|
from exp_shared import ensure_jit, ENGINE_KWARGS, load_data, load_forewarner, MC_BASE_CFG
|
||
|
|
from nautilus_dolphin.nautilus.proxy_boost_engine import create_d_liq_engine
|
||
|
|
from nautilus_dolphin.nautilus.adaptive_circuit_breaker import AdaptiveCircuitBreaker
|
||
|
|
|
||
|
|
|
||
|
|
def _run(eng, d, fw, call_esof):
|
||
|
|
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)
|
||
|
|
if call_esof:
|
||
|
|
eng.set_esoteric_hazard_multiplier(0.0)
|
||
|
|
|
||
|
|
# Print leverage state BEFORE trading
|
||
|
|
print(f" base_max_leverage = {eng.base_max_leverage}")
|
||
|
|
print(f" abs_max_leverage = {eng.abs_max_leverage}")
|
||
|
|
print(f" bet_sizer.max_lev = {eng.bet_sizer.max_leverage}")
|
||
|
|
|
||
|
|
t0 = time.time()
|
||
|
|
daily_caps, daily_pnls = [], []
|
||
|
|
for pf_file in d['parquet_files']:
|
||
|
|
ds = pf_file.stem
|
||
|
|
df, acols, dvol = d['pq_data'][ds]
|
||
|
|
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)
|
||
|
|
daily_caps.append(eng.capital)
|
||
|
|
daily_pnls.append(eng.capital - cap_before)
|
||
|
|
|
||
|
|
tr = eng.trade_history
|
||
|
|
n = len(tr)
|
||
|
|
roi = (eng.capital - 25000.0) / 25000.0 * 100.0
|
||
|
|
peak, max_dd = 25000.0, 0.0
|
||
|
|
for cap in daily_caps:
|
||
|
|
peak = max(peak, cap)
|
||
|
|
max_dd = max(max_dd, (peak - cap) / peak * 100.0)
|
||
|
|
|
||
|
|
def _abs(t):
|
||
|
|
return t.pnl_absolute if hasattr(t, 'pnl_absolute') else t.pnl_pct * 250.0
|
||
|
|
wins = [t for t in tr if _abs(t) > 0]
|
||
|
|
losses = [t for t in tr if _abs(t) <= 0]
|
||
|
|
pf = sum(_abs(t) for t in wins) / max(abs(sum(_abs(t) for t in losses)), 1e-9)
|
||
|
|
|
||
|
|
lev_vals = [t.leverage for t in tr if hasattr(t, 'leverage') and t.leverage > 0]
|
||
|
|
avg_lev = float(np.mean(lev_vals)) if lev_vals else 0.0
|
||
|
|
liq_stops = getattr(eng, 'liquidation_stops', 0)
|
||
|
|
|
||
|
|
print(f" ROI={roi:+.2f}% T={n} DD={max_dd:.2f}% PF={pf:.4f} avg_lev={avg_lev:.2f}x liq_stops={liq_stops} ({time.time()-t0:.0f}s)")
|
||
|
|
return roi, n, max_dd, avg_lev
|
||
|
|
|
||
|
|
|
||
|
|
def main():
|
||
|
|
ensure_jit()
|
||
|
|
d = load_data()
|
||
|
|
fw = load_forewarner()
|
||
|
|
|
||
|
|
print("\n=== WITH set_esoteric_hazard_multiplier(0.0) ===")
|
||
|
|
eng_a = create_d_liq_engine(**ENGINE_KWARGS)
|
||
|
|
roi_a, n_a, dd_a, lev_a = _run(eng_a, d, fw, call_esof=True)
|
||
|
|
|
||
|
|
print("\n=== WITHOUT set_esoteric_hazard_multiplier(0.0) ===")
|
||
|
|
eng_b = create_d_liq_engine(**ENGINE_KWARGS)
|
||
|
|
roi_b, n_b, dd_b, lev_b = _run(eng_b, d, fw, call_esof=False)
|
||
|
|
|
||
|
|
print(f"\nGOLD TARGET: ROI=181.81%, T=2155, DD=17.65%, avg_lev=4.09x")
|
||
|
|
print(f"WITH stomp: ROI={roi_a:+.2f}% T={n_a} DD={dd_a:.2f}% avg_lev={lev_a:.2f}x")
|
||
|
|
print(f"WITHOUT stomp: ROI={roi_b:+.2f}% T={n_b} DD={dd_b:.2f}% avg_lev={lev_b:.2f}x")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
main()
|