Files
DOLPHIN/prod/run_gold_monte_carlo.py

88 lines
2.9 KiB
Python
Raw Normal View History

import sys
from pathlib import Path
import json
import numpy as np
import time
import gc
import pandas as pd
HCM_DIR = Path(r"C:\Users\Lenovo\Documents\- DOLPHIN NG HD HCM TSF Predict")
sys.path.insert(0, str(HCM_DIR / 'nautilus_dolphin'))
sys.path.insert(0, str(HCM_DIR / 'nautilus_dolphin' / 'dvae'))
from exp_shared import ensure_jit, load_data, ENGINE_KWARGS, META_COLS
from nautilus_dolphin.nautilus.proxy_boost_engine import create_d_liq_engine
from nautilus_dolphin.nautilus.adaptive_circuit_breaker import AdaptiveCircuitBreaker
def run_monte_carlo(n_iters=5):
print("="*60)
print(f"MONTE CARLO SIMULATION: 56-DAY DATA ({n_iters} iterations)")
print("="*60)
ensure_jit()
d = load_data()
# 1. Deterministic Baseline (Iteration 0)
# 2. Stochastic Range (Iterations 1-N)
# Target ROI Range from Silver/Gold: [55%, 181%]
mc_results = []
for i in range(n_iters):
seed = 42 + i
print(f"\nIteration {i+1}/{n_iters} (Seed: {seed})")
# Stochastic Unlock
kw = ENGINE_KWARGS.copy()
kw.update({
'seed': seed,
'sp_maker_entry_rate': 0.62,
'sp_maker_exit_rate': 0.50,
'use_sp_fees': True,
'use_sp_slippage': True
})
eng = create_d_liq_engine(**kw)
eng.set_ob_engine(d['ob_eng'])
acb = AdaptiveCircuitBreaker()
acb.preload_w750(d['date_strings'])
eng.set_acb(acb)
t0 = time.time()
for j, pf in enumerate(d['parquet_files']):
df = pd.read_parquet(pf)
acols = [c for c in df.columns if c not in META_COLS]
# Simple dvol for gating
bp = df['BTCUSDT'].values if 'BTCUSDT' in df.columns else None
dvol = np.zeros(len(df))
if bp is not None:
rets = np.diff(bp)/bp[:-1]
for k in range(50, len(bp)):
dvol[k] = np.std(rets[k-50:k])
vol_ok = dvol > d['vol_p60']
eng.process_day(pf.stem, df, acols, vol_regime_ok=vol_ok)
del df
gc.collect()
roi = (eng.capital - 25000.0) / 25000.0 * 100.0
n_trades = len(eng.trade_history)
elapsed = time.time() - t0
print(f" Result: ROI={roi:.2f}% | Trades={n_trades} | t={elapsed:.0f}s")
mc_results.append({'roi': roi, 'trades': n_trades, 'seed': seed})
rois = [r['roi'] for r in mc_results]
print("\n" + "="*60)
print("MONTE CARLO STATISTICS")
print("="*60)
print(f" Range: [{min(rois):.2f}%, {max(rois):.2f}%]")
print(f" Mean: {np.mean(rois):.2f}%")
print(f" Median: {np.median(rois):.2f}%")
print(f" StdDev: {np.std(rois):.2f}%")
if __name__ == "__main__":
# Reduced iterations to 3 for initial validation to avoid perceived lockup
run_monte_carlo(n_iters=3)