#!/usr/bin/env python3
"""
Analyse les résultats du backtest pour optimiser les paramètres
"""

import json
import statistics

with open('martingale_results.json', 'r') as f:
    data = json.load(f)

trades = data['trades']

print("="*80)
print("📊 ANALYSE DÉTAILLÉE DES TRADES")
print("="*80)

# Séparer wins et losses
wins = [t for t in trades if t['pnl_pct'] > 0]
losses = [t for t in trades if t['pnl_pct'] <= 0]

print(f"\n✅ TRADES GAGNANTS ({len(wins)}):")
for i, t in enumerate(wins, 1):
    print(f"   #{i}: {t['side']:5} @ L{t['martingale_level']} | "
          f"PnL: {t['pnl_pct']:+7.2f}% | Exit: {t['exit_reason']:7} | "
          f"Lev: {t['leverage']:4}x | Durée: {t['duration_minutes']}m")

print(f"\n❌ TRADES PERDANTS ({len(losses)}):")
for i, t in enumerate(losses, 1):
    print(f"   #{i}: {t['side']:5} @ L{t['martingale_level']} | "
          f"PnL: {t['pnl_pct']:+7.2f}% | Exit: {t['exit_reason']:7} | "
          f"Lev: {t['leverage']:4}x | Durée: {t['duration_minutes']}m")

print("\n" + "="*80)
print("🔍 ANALYSE DES PATTERNS")
print("="*80)

# Exit reasons
exit_reasons = {}
for t in trades:
    reason = t['exit_reason']
    if reason not in exit_reasons:
        exit_reasons[reason] = {'count': 0, 'wins': 0, 'total_pnl': 0}
    exit_reasons[reason]['count'] += 1
    if t['pnl_pct'] > 0:
        exit_reasons[reason]['wins'] += 1
    exit_reasons[reason]['total_pnl'] += t['pnl_pct']

print("\n📌 PAR RAISON DE SORTIE:")
for reason, stats in exit_reasons.items():
    wr = (stats['wins'] / stats['count'] * 100) if stats['count'] > 0 else 0
    avg_pnl = stats['total_pnl'] / stats['count']
    print(f"   {reason:8} : {stats['count']:2} trades | WR: {wr:5.1f}% | Avg PnL: {avg_pnl:+7.2f}%")

# Par niveau martingale
levels = {}
for t in trades:
    level = t['martingale_level']
    if level not in levels:
        levels[level] = {'count': 0, 'wins': 0, 'total_pnl': 0, 'pnls': []}
    levels[level]['count'] += 1
    if t['pnl_pct'] > 0:
        levels[level]['wins'] += 1
    levels[level]['total_pnl'] += t['pnl_pct']
    levels[level]['pnls'].append(t['pnl_pct'])

print("\n📌 PAR NIVEAU MARTINGALE:")
for level in sorted(levels.keys()):
    stats = levels[level]
    wr = (stats['wins'] / stats['count'] * 100) if stats['count'] > 0 else 0
    avg_pnl = stats['total_pnl'] / stats['count']
    print(f"   L{level} : {stats['count']:2} trades | WR: {wr:5.1f}% | Avg PnL: {avg_pnl:+7.2f}%")

# Par côté
sides = {}
for t in trades:
    side = t['side']
    if side not in sides:
        sides[side] = {'count': 0, 'wins': 0, 'total_pnl': 0}
    sides[side]['count'] += 1
    if t['pnl_pct'] > 0:
        sides[side]['wins'] += 1
    sides[side]['total_pnl'] += t['pnl_pct']

print("\n📌 PAR CÔTÉ:")
for side, stats in sides.items():
    wr = (stats['wins'] / stats['count'] * 100) if stats['count'] > 0 else 0
    avg_pnl = stats['total_pnl'] / stats['count']
    print(f"   {side:5} : {stats['count']:2} trades | WR: {wr:5.1f}% | Avg PnL: {avg_pnl:+7.2f}%")

print("\n" + "="*80)
print("💡 RECOMMANDATIONS D'OPTIMISATION")
print("="*80)

# Analyse timeout
timeout_trades = [t for t in trades if t['exit_reason'] == 'TIMEOUT']
if timeout_trades:
    timeout_pnls = [t['pnl_pct'] for t in timeout_trades]
    avg_timeout = sum(timeout_pnls) / len(timeout_pnls)
    print(f"\n⚠️  TIMEOUT ({len(timeout_trades)} trades):")
    print(f"   → PnL moyen: {avg_timeout:+.2f}%")
    if avg_timeout < 0:
        print(f"   ❌ Timeout perdant en moyenne")
        print(f"   💡 SOLUTION: Réduire timeout (60min → 30min)")

# Analyse SL
sl_trades = [t for t in trades if t['exit_reason'] == 'SL']
if sl_trades:
    sl_pnls = [t['pnl_pct'] for t in sl_trades]
    avg_sl = sum(sl_pnls) / len(sl_pnls)
    print(f"\n⚠️  STOP-LOSS ({len(sl_trades)} trades):")
    print(f"   → PnL moyen: {avg_sl:+.2f}%")
    print(f"   → Perte moyenne beaucoup trop grosse!")
    print(f"   💡 SOLUTION: SL plus large OU leverage réduit")

# Analyse TP
tp_trades = [t for t in trades if t['exit_reason'] == 'TP']
if tp_trades:
    tp_pnls = [t['pnl_pct'] for t in tp_trades]
    avg_tp = sum(tp_pnls) / len(tp_pnls)
    print(f"\n✅ TAKE-PROFIT ({len(tp_trades)} trades):")
    print(f"   → PnL moyen: {avg_tp:+.2f}%")
    if avg_tp < abs(avg_sl) * 2:
        print(f"   ⚠️  TP trop petit par rapport au SL")
        print(f"   💡 SOLUTION: Augmenter TP ratio (3:1 → 5:1)")

# Ratio win/loss
if wins and losses:
    avg_win = sum(t['pnl_pct'] for t in wins) / len(wins)
    avg_loss = sum(t['pnl_pct'] for t in losses) / len(losses)
    ratio = abs(avg_win / avg_loss)

    print(f"\n📊 RATIO GAIN/PERTE:")
    print(f"   Gain moyen:  {avg_win:+.2f}%")
    print(f"   Perte moyenne: {avg_loss:+.2f}%")
    print(f"   Ratio: 1:{ratio:.2f}")

    if ratio < 2:
        print(f"   ❌ Ratio insuffisant (besoin 1:2 minimum)")
        print(f"   💡 SOLUTION: TP ratio 3:1 → 5:1")

print("\n" + "="*80)
print("🎯 PARAMÈTRES OPTIMAUX SUGGÉRÉS")
print("="*80)

print("""
PROBLÈMES IDENTIFIÉS:
1. ❌ Pertes moyennes 4x plus grandes que gains
2. ❌ Timeout perdant (-16.27% moyenne)
3. ❌ SL hit avec leverage élevé = pertes énormes
4. ⚠️  SHORT semble moins performant

SOLUTIONS:
1. 🔧 Augmenter TP ratio: 3:1 → 5:1
   - TP plus loin = meilleurs gains quand ça marche

2. 🔧 Réduire leverage de base: 100x → 50x
   - Moins de risque de liquidation
   - Pertes SL plus supportables

3. 🔧 Réduire leverage max: 1000x → 500x
   - Level 5 à 500x au lieu de 1000x

4. 🔧 Timeout plus court: 60min → 30min
   - Sortir plus vite des trades perdants

5. 🔧 Score minimum plus élevé: 0.6 → 0.7
   - Trades de meilleure qualité seulement

6. 🔧 SL légèrement plus large: 0.3% → 0.4%
   - Moins de faux SL

CONFIGURATION SUGGÉRÉE:
""")

print("""
strategy = MartingaleStrategy(
    base_position_size=10.0,
    max_martingale_level=5,
    base_leverage=50,           # 100 → 50
    max_leverage=500,           # 1000 → 500
    stop_loss_pct=0.004,        # 0.003 → 0.004
    take_profit_ratio=5.0,      # 3.0 → 5.0
    min_signal_score=0.7        # 0.6 → 0.7
)
""")

print("\n" + "="*80)
