Initial commit — Trading AI Secure project complet
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>
This commit is contained in:
96
tests/conftest.py
Normal file
96
tests/conftest.py
Normal file
@@ -0,0 +1,96 @@
|
||||
"""
|
||||
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
|
||||
Reference in New Issue
Block a user