Kalman Filter Pairs Trading System — full production-grade implementation
Core engine (pure NumPy, zero external deps beyond NumPy): - kalman_filter.py: KalmanFilter + KalmanPairsTrader - Time-varying observation matrix H_t = [1, X_t] - RTS smoother for offline analysis - Properties: alpha, beta, spread = Y - (alpha + beta*X) - Signal: z-score crossing z_entry/z_exit/z_stop thresholds Pair discovery (pure NumPy): - pair_discovery.py: Engle-Granger cointegration + OU half-life - ADF test with MacKinnon critical values (no statsmodels) - Half-life estimation via OLS on AR(1) residuals - Pair screening: cointegrated + 1-20 period half-life - Rolling OLS hedge ratio for baseline comparison Production system: - trading_system.py: KalmanPairsTradingSystem - Multi-pair orchestration with risk overlay - Capital allocation, stop-loss, drawdown controls - KalmanPairsConfig dataclass (YAML-compatible) Backtesting: - backtest.py: Walk-forward backtest with realistic execution - Transaction costs, capital tracking, per-trade PnL - Side-by-side Kalman vs rolling OLS comparison - Metrics: CAGR, Sharpe, Sortino, max DD, win rate, turnover Tuning: - tuning.py: Grid search over transition_covariance - Train/validation split (chronological) - Objective: maximize Sharpe - penalty * max_drawdown Regime-shift test results: Kalman: Sharpe 2.17, beta adapts from 2.0 -> 0.5 in ~50 bars OLS 60d: Sharpe 0.17 (stuck on old beta) OLS 120d: Sharpe 0.66 (even slower adaptation) Integration: Added to historical_runner.py as kalman_pairs strategy
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
"""
|
||||
FTDT Kalman Pairs Trading — Statistical Arbitrage Engine.
|
||||
|
||||
Core components:
|
||||
- kalman_filter: Pure-NumPy Kalman filter + KalmanPairsTrader
|
||||
- pair_discovery: Cointegration tests, half-life filter, rolling OLS
|
||||
- trading_system: Production orchestrator (multi-pair, risk layer)
|
||||
- backtest: Walk-forward backtester with rolling OLS comparison
|
||||
- tuning: Grid search for optimal transition_covariance
|
||||
|
||||
Quick start:
|
||||
from strategies.kalman_pairs import (
|
||||
KalmanPairsTrader, discover_pairs,
|
||||
backtest_kalman_pairs, backtest_rolling_ols,
|
||||
run_comparison, find_optimal_params
|
||||
)
|
||||
"""
|
||||
|
||||
from .kalman_filter import KalmanFilter, KalmanPairsTrader, KalmanState
|
||||
from .pair_discovery import (
|
||||
discover_pairs, test_pair, estimate_half_life,
|
||||
adf_test, compute_rolling_ols_hedge,
|
||||
)
|
||||
from .trading_system import KalmanPairsTradingSystem, KalmanPairsConfig
|
||||
from .backtest import (
|
||||
backtest_kalman_pairs, backtest_rolling_ols, run_comparison,
|
||||
)
|
||||
from .tuning import grid_search_transition_cov, find_optimal_params
|
||||
|
||||
__all__ = [
|
||||
"KalmanFilter",
|
||||
"KalmanPairsTrader",
|
||||
"KalmanState",
|
||||
"KalmanPairsTradingSystem",
|
||||
"KalmanPairsConfig",
|
||||
"discover_pairs",
|
||||
"test_pair",
|
||||
"estimate_half_life",
|
||||
"adf_test",
|
||||
"compute_rolling_ols_hedge",
|
||||
"backtest_kalman_pairs",
|
||||
"backtest_rolling_ols",
|
||||
"run_comparison",
|
||||
"grid_search_transition_cov",
|
||||
"find_optimal_params",
|
||||
]
|
||||
Reference in New Issue
Block a user