Architecture Docker (8 services), FastAPI, TimescaleDB, Redis, Streamlit. Stratégies : scalping, intraday, swing. MLEngine + RegimeDetector (HMM). BacktestEngine + WalkForwardAnalyzer + Optuna optimizer. Routes API complètes dont /optimize async. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
97 lines
2.7 KiB
Python
97 lines
2.7 KiB
Python
"""
|
|
Pytest Configuration - Fixtures Globales.
|
|
|
|
Ce fichier contient les fixtures pytest partagées par tous les tests.
|
|
"""
|
|
|
|
import pytest
|
|
import pandas as pd
|
|
import numpy as np
|
|
from datetime import datetime, timedelta
|
|
from typing import Dict
|
|
|
|
from src.core.risk_manager import RiskManager
|
|
from src.core.strategy_engine import StrategyEngine
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_config() -> Dict:
|
|
"""
|
|
Fixture de configuration de test.
|
|
|
|
Returns:
|
|
Configuration complète pour tests
|
|
"""
|
|
return {
|
|
'risk_limits': {
|
|
'initial_capital': 10000.0,
|
|
'global_limits': {
|
|
'max_portfolio_risk': 0.05,
|
|
'max_position_size': 0.10,
|
|
'max_drawdown': 0.15,
|
|
'max_daily_loss': 0.03,
|
|
'max_correlation': 0.7,
|
|
},
|
|
'strategy_limits': {
|
|
'scalping': {
|
|
'risk_per_trade': 0.01,
|
|
'max_trades_per_day': 50,
|
|
},
|
|
'intraday': {
|
|
'risk_per_trade': 0.02,
|
|
'max_trades_per_day': 20,
|
|
},
|
|
}
|
|
},
|
|
'strategy_params': {
|
|
'scalping_strategy': {
|
|
'name': 'scalping',
|
|
'timeframe': '5m',
|
|
'risk_per_trade': 0.01,
|
|
'max_holding_time': 1800,
|
|
'max_trades_per_day': 50,
|
|
'adaptive_params': {
|
|
'bb_period': 20,
|
|
'rsi_period': 14,
|
|
'min_confidence': 0.65,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def risk_manager(sample_config) -> RiskManager:
|
|
"""Fixture RiskManager initialisé."""
|
|
rm = RiskManager()
|
|
rm.initialize(sample_config['risk_limits'])
|
|
return rm
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_ohlcv_data() -> pd.DataFrame:
|
|
"""Fixture de données OHLCV pour tests."""
|
|
dates = pd.date_range(start='2024-01-01', periods=100, freq='1H')
|
|
np.random.seed(42)
|
|
|
|
base_price = 1.1000
|
|
returns = np.random.normal(0.0001, 0.01, 100)
|
|
prices = base_price * np.exp(np.cumsum(returns))
|
|
|
|
df = pd.DataFrame(index=dates)
|
|
df['close'] = prices
|
|
df['open'] = df['close'].shift(1).fillna(df['close'].iloc[0])
|
|
df['high'] = df[['open', 'close']].max(axis=1) * (1 + np.random.uniform(0, 0.001, 100))
|
|
df['low'] = df[['open', 'close']].min(axis=1) * (1 - np.random.uniform(0, 0.001, 100))
|
|
df['volume'] = np.random.randint(1000, 10000, 100)
|
|
|
|
return df
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def reset_singletons():
|
|
"""Reset les singletons entre chaque test."""
|
|
RiskManager._instance = None
|
|
yield
|
|
RiskManager._instance = None
|