# test_optimizer.py """ Script para probar el optimizador de parámetros """ import os import sys from dotenv import load_dotenv from pathlib import Path from datetime import datetime, timedelta # Añadir raíz del proyecto al path sys.path.insert(0, str(Path(__file__).parent.parent)) from src.utils.logger import log from src.data.storage import StorageManager from src.strategies import MovingAverageCrossover from src.core.optimizer import ParameterOptimizer def setup_environment(): """Carga variables de entorno""" env_path = Path(__file__).parent.parent / 'config' / 'secrets.env' load_dotenv(dotenv_path=env_path) def test_optimizer(): """ Prueba el optimizador con Moving Average Crossover """ log.info("="*70) log.info("🔧 TEST: OPTIMIZADOR DE PARÁMETROS") log.info("="*70) # Setup setup_environment() # Cargar datos storage = StorageManager( db_host=os.getenv('DB_HOST'), db_port=int(os.getenv('DB_PORT', 5432)), db_name=os.getenv('DB_NAME'), db_user=os.getenv('DB_USER'), db_password=os.getenv('DB_PASSWORD'), ) log.info("\n📥 Cargando datos...") # end_date = datetime.now() # start_date = end_date - timedelta(days=60) data = storage.load_ohlcv( symbol='BTC/USDT', timeframe='1h', start_date=None, end_date=None, use_cache=False ) log.success(f"✓ Datos cargados: {len(data)} velas") # Crear optimizador log.info("\n🔧 Creando optimizador...") optimizer = ParameterOptimizer( strategy_class=MovingAverageCrossover, data=data, initial_capital=10000, commission=0.001 ) # Definir parámetros a probar (pequeño para empezar) param_grid = { 'fast_period': [10, 15], 'slow_period': [30, 50], 'ma_type': ['sma', 'ema'], 'use_adx': [True], 'adx_threshold': [20, 25, 30] } log.info(f"\n📊 Grid de parámetros:") log.info(f" fast_period: {param_grid['fast_period']}") log.info(f" slow_period: {param_grid['slow_period']}") log.info(f" ma_type: {param_grid['ma_type']}") log.info(f" Total combinaciones: {3 * 2 * 2} = 12") # Optimizar log.info("\n🚀 Iniciando optimización...") results_df = optimizer.optimize(param_grid) # Mostrar resultados log.info("\n📊 RESULTADOS COMPLETOS:") print(results_df.to_string(index=False)) # Mejores parámetros log.info("\n🏆 ANÁLISIS:") best_params = optimizer.get_best_params(metric='sharpe_ratio') # Guardar resultados (OPCIONAL - ya se guarda por defecto) optimizer.save_results() storage.close() log.success("\n✅ TEST COMPLETADO") if __name__ == "__main__": test_optimizer()