#!/usr/bin/env python3
"""
Optimisation Rapide Stratégie Hybride
Trouve les meilleurs paramètres pour BULL/BEAR/RANGE

Approche:
1. Teste 30-50 configs aléatoires
2. Garde les meilleures
3. Sauvegarde résultats
"""

import pandas as pd
import numpy as np
import json
import random
from datetime import datetime
from pathlib import Path

from hybrid_strategy import HybridStrategy
from backtest_hybrid import HybridBacktest, get_btc_historical_data

print("=" * 80)
print("🎯 OPTIMISATION RAPIDE HYBRID STRATEGY")
print("=" * 80)

# Charger données
df = get_btc_historical_data(days=1, interval='1m')

results = []
TOTAL_TESTS = 30

print(f"\n🔄 Lancement de {TOTAL_TESTS} tests...")
print()

for i in range(TOTAL_TESTS):
    # Générer config aléatoire
    config = {
        # Bull params
        'bull.min_trend_strength': random.randint(50, 75),
        'bull.rsi_pullback_max': random.randint(35, 50),
        'bull.sl_atr_multiplier': round(random.uniform(1.0, 2.0), 2),
        'bull.tp_atr_multiplier': round(random.uniform(2.5, 4.0), 2),
        'bull.leverage': random.choice([50, 75, 100, 125, 150]),
        
        # Bear params
        'bear.min_trend_strength': random.randint(50, 75),
        'bear.rsi_rally_min': random.randint(50, 65),
        'bear.sl_atr_multiplier': round(random.uniform(1.0, 2.0), 2),
        'bear.tp_atr_multiplier': round(random.uniform(2.5, 4.0), 2),
        'bear.leverage': random.choice([50, 75, 100, 125, 150]),
        
        # Range params (V10)
        'range.rsi_oversold': random.randint(25, 40),
        'range.rsi_overbought': random.randint(60, 80),
        'range.range_atr_threshold': round(random.uniform(0.25, 0.40), 2),
        'range.sl_atr_multiplier': round(random.uniform(1.0, 2.0), 2),
        'range.leverage': random.choice([100, 150, 200, 250]),
    }
    
    # Créer stratégie avec ces params
    strategy = HybridStrategy(leverage=100)
    
    # Appliquer params bull
    strategy.bull_strategy.params['min_trend_strength'] = config['bull.min_trend_strength']
    strategy.bull_strategy.params['rsi_pullback_max'] = config['bull.rsi_pullback_max']
    strategy.bull_strategy.params['sl_atr_multiplier'] = config['bull.sl_atr_multiplier']
    strategy.bull_strategy.params['tp_atr_multiplier'] = config['bull.tp_atr_multiplier']
    strategy.bull_strategy.leverage = config['bull.leverage']
    
    # Appliquer params bear
    strategy.bear_strategy.params['min_trend_strength'] = config['bear.min_trend_strength']
    strategy.bear_strategy.params['rsi_rally_min'] = config['bear.rsi_rally_min']
    strategy.bear_strategy.params['sl_atr_multiplier'] = config['bear.sl_atr_multiplier']
    strategy.bear_strategy.params['tp_atr_multiplier'] = config['bear.tp_atr_multiplier']
    strategy.bear_strategy.leverage = config['bear.leverage']
    
    # Appliquer params range
    strategy.range_strategy.params['rsi_oversold'] = config['range.rsi_oversold']
    strategy.range_strategy.params['rsi_overbought'] = config['range.rsi_overbought']
    strategy.range_strategy.params['range_atr_threshold'] = config['range.range_atr_threshold']
    strategy.range_strategy.params['sl_atr_multiplier'] = config['range.sl_atr_multiplier']
    strategy.range_strategy.leverage = config['range.leverage']
    
    # Backtest
    try:
        backtest = HybridBacktest(df, initial_capital=500.0)
        result = backtest.run("Hybrid", strategy)
        
        if result['total_trades'] > 0:
            results.append({
                'config': config,
                'pnl_pct': result['total_pnl_pct'],
                'trades': result['total_trades'],
                'win_rate': result['win_rate'],
                'profit_factor': result['profit_factor'],
                'max_dd': result['max_drawdown'],
                'trades_by_strategy': result['trades_by_strategy']
            })
            
            print(f"Test {i+1}/{TOTAL_TESTS}: PnL {result['total_pnl_pct']:+.1f}% | Trades {result['total_trades']} | WR {result['win_rate']:.0f}% | PF {result['profit_factor']:.2f}")
    except Exception as e:
        print(f"Test {i+1}/{TOTAL_TESTS}: ERREUR - {e}")

# Sauvegarder
output_file = 'hybrid_optimization_results.json'
with open(output_file, 'w') as f:
    json.dump(results, f, indent=2)

print()
print("=" * 80)
print("📊 RÉSULTATS")
print("=" * 80)

if results:
    # Trier par PnL
    profitable = [r for r in results if r['pnl_pct'] > 0 and r['profit_factor'] > 1.0]
    print(f"Configs profitables: {len(profitable)}/{len(results)} ({len(profitable)/len(results)*100:.0f}%)")
    
    if profitable:
        profitable.sort(key=lambda x: x['pnl_pct'], reverse=True)
        
        print("\n🏆 TOP 3:")
        for i, r in enumerate(profitable[:3], 1):
            print(f"\n{i}. PnL: {r['pnl_pct']:+.1f}% | PF: {r['profit_factor']:.2f} | WR: {r['win_rate']:.0f}% | Trades: {r['trades']}")
            print(f"   Max DD: {r['max_dd']:.1f}%")
            print(f"   Répartition: {r['trades_by_strategy']}")
            print("   Config:")
            for k, v in r['config'].items():
                print(f"     {k}: {v}")
    else:
        print("\n❌ Aucune config profitable trouvée")
else:
    print("\n❌ Aucun résultat")

print()
print(f"💾 Résultats sauvegardés: {output_file}")
print("=" * 80)
