import json
from collections import defaultdict

with open('espion_history.json') as f:
    h = json.load(f)

print(f'Total SPY trades: {len(h)}')
print()

# === PAR COIN ===
coins = defaultdict(lambda: {'n':0,'w':0,'pnl_usdt':0,'pnl_pct_sum':0,'max_pnl_sum':0,'hold_sum':0})
for t in h:
    s = t['symbol']
    coins[s]['n'] += 1
    coins[s]['w'] += 1 if t['pnl_pct'] > 0 else 0
    coins[s]['pnl_usdt'] += t['pnl_usdt']
    coins[s]['pnl_pct_sum'] += t['pnl_pct']
    coins[s]['max_pnl_sum'] += t.get('max_pnl', 0)
    coins[s]['hold_sum'] += t.get('hold_minutes', 0)

print("=== PAR COIN (trié par PnL total) ===")
header = f"{'Symbol':<20} {'N':>3} {'W':>3} {'L':>3}  {'TotalUSDT':>10}  {'AvgPct':>8}  {'AvgMaxPnl':>10}  {'Captured%':>10}  {'AvgHold':>8}"
print(header)
print('-'*len(header))
for sym, d in sorted(coins.items(), key=lambda x: x[1]['pnl_usdt'], reverse=True):
    n = d['n']
    avg_max = d['max_pnl_sum'] / n
    avg_hold = d['hold_sum'] / n
    cap = d['pnl_pct_sum'] / d['max_pnl_sum'] * 100 if d['max_pnl_sum'] > 0 else 0
    avg_pct = d['pnl_pct_sum'] / n
    flag = ''
    if d['pnl_usdt'] < -1 and n >= 2:
        flag = ' ⚠ PERDANT CHRONIQUE'
    elif d['pnl_usdt'] > 5 and d['w'] == n:
        flag = ' ✅ EXCELLENT'
    print(f"{sym:<20} {n:>3} {d['w']:>3} {n-d['w']:>3}  {d['pnl_usdt']:>+10.2f}  {avg_pct:>+7.3f}%  {avg_max:>10.3f}%  {cap:>9.0f}%  {avg_hold:>7.1f}min{flag}")

print()
print("=== SURGE TYPE ===")
stypes = defaultdict(lambda: {'n':0,'w':0,'pnl_usdt':0,'pnl_pct':[],'strength':[],'max_pnl':[]})
for t in h:
    s = t['surge_type']
    stypes[s]['n'] += 1
    stypes[s]['w'] += 1 if t['pnl_pct'] > 0 else 0
    stypes[s]['pnl_usdt'] += t['pnl_usdt']
    stypes[s]['pnl_pct'].append(t['pnl_pct'])
    stypes[s]['strength'].append(t.get('surge_strength', 0))
    stypes[s]['max_pnl'].append(t.get('max_pnl', 0))
for st, d in stypes.items():
    avg_str = sum(d['strength']) / len(d['strength'])
    avg_p = sum(d['pnl_pct']) / len(d['pnl_pct'])
    avg_max = sum(d['max_pnl']) / len(d['max_pnl'])
    wr = d['w'] / d['n'] * 100
    print(f"{st}: N={d['n']} W={d['w']} L={d['n']-d['w']}  WinRate={wr:.0f}%  PnL={d['pnl_usdt']:+.2f}USDT  avg={avg_p:+.3f}%  avgStrength={avg_str:.2f}x  avgMaxPnl={avg_max:.3f}%")

print()
print("=== EXIT REASONS ===")
exits = defaultdict(lambda: {'n':0,'pnl':0})
for t in h:
    key = t['exit_reason'].split('(')[0].strip()
    exits[key]['n'] += 1
    exits[key]['pnl'] += t['pnl_usdt']
for k, v in sorted(exits.items(), key=lambda x: -x[1]['n']):
    print(f"{v['n']:>3}x  {k:<35}  TotalPnL={v['pnl']:+.2f}USDT  avg={v['pnl']/v['n']:+.2f}USDT/trade")

print()
print("=== HOLD TIME vs PnL ===")
buckets = {'<2min':[],'2-5min':[],'5-10min':[],'10-15min':[],'>15min':[]}
for t in h:
    m = t.get('hold_minutes', 0)
    p = t['pnl_usdt']
    if m < 2:   buckets['<2min'].append(p)
    elif m < 5: buckets['2-5min'].append(p)
    elif m < 10: buckets['5-10min'].append(p)
    elif m < 15: buckets['10-15min'].append(p)
    else:        buckets['>15min'].append(p)
for k, ps in buckets.items():
    if ps:
        wins = sum(1 for p in ps if p > 0)
        print(f"{k:<12}: N={len(ps)}  WR={wins/len(ps)*100:.0f}%  TotalPnL={sum(ps):+.2f}USDT  avgPnL={sum(ps)/len(ps):+.2f}USDT/trade")

print()
print("=== HYPOTHESE: PRE-SELECTION CRITERES ===")
# Taux de capture: pnl_pct / max_pnl -> si capture < 30%, on entre trop tard
bad_capture = [t for t in h if t.get('max_pnl',0) > 0.3 and t['pnl_pct'] / t.get('max_pnl',1) < 0.3]
print(f"Trades avec max_pnl>0.3% mais capture<30% (entree tardive): {len(bad_capture)}/{len(h)}")
for t in bad_capture:
    cap = t['pnl_pct'] / t.get('max_pnl',1) * 100
    print(f"  {t['symbol']:<20} maxPnl={t['max_pnl']:.3f}% actual={t['pnl_pct']:+.3f}% capture={cap:.0f}% hold={t.get('hold_minutes',0):.1f}min")

print()
# Coins traded multiple times with consistently negative results
chronic_losers = {sym: d for sym, d in coins.items() if d['n'] >= 2 and d['pnl_usdt'] < -1}
print(f"Perdants chroniques (>=2 trades, PnL<-1 USDT): {list(chronic_losers.keys())}")

# Strong surge but lost
strong_surges_lost = [t for t in h if t.get('surge_strength',0) >= 2.0 and t['pnl_pct'] < 0]
print(f"\nSurges fortes (>=2x) mais perdantes: {len(strong_surges_lost)}/{len([t for t in h if t.get('surge_strength',0)>=2.0])}")
for t in strong_surges_lost:
    print(f"  {t['symbol']:<20} strength={t['surge_strength']:.2f}x  pnl={t['pnl_pct']:+.3f}%  maxPnl={t.get('max_pnl',0):.3f}%  exit={t['exit_reason'].split('(')[0].strip()}")
