Files
ftdt-quant-lab/strategies/kalman_pairs/__init__.py
T
ramseshk f4c8bca15a 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
2026-08-05 06:47:33 +00:00

47 lines
1.4 KiB
Python

"""
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",
]