- Implemented portfolio engine with risk-based allocation (50/50) - Added equity-based metrics for system-level evaluation - Validated portfolio against standalone strategies - Reduced max drawdown and volatility at system level - Quantitative decision closed before paper trading phase
102 lines
2.8 KiB
Python
102 lines
2.8 KiB
Python
# 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() |