Holdout Period Equity Curve
Strategy Architecture
Fed Liquidity Spread
Core positioning based on the spread between 2Y Treasury yields and the Fed Funds rate. When the spread signals cuts are priced in (<-0.25), the strategy goes aggressive. When hikes are expected (>0.25), it becomes defensive.
Volatility Efficiency
Uses Parkinson volatility and a 21-day efficiency ratio (directional move vs path traveled) ranked over 252 days. Scales exposure up in trending markets, down in choppy regimes.
Inflation Veto
Hard stop on long exposure when CPI YoY exceeds 3% and Fed is hiking. This protected capital during 2022's inflation-driven selloff while other models got crushed.
Bear Trap Detection
Microstructure signal identifying false breakdowns: when price dips below the 20-day low but closes back above. Adds 0.5x exposure to capture mean reversion.
Trend Filter (200 MA)
Modulates efficiency multiplier based on whether price is above or below the 200-day moving average. Bullish positioning gets amplified in uptrends, dampened in downtrends.
Robustness Framework
Strict train/validation/holdout splits (2000-2015 / 2016-2021 / 2022-2025). No lookahead bias. Sensitivity tested with +/-10% parameter shifts. Buffer zones prevent data leakage.
Performance Across Periods
| Strategy | Period | Sharpe | Calmar | Total Return | Max Drawdown |
|---|---|---|---|---|---|
| Enhanced Strategy | Holdout (2022-2025) | 1.55 | 0.92 | ~150% | -19.7% |
| Enhanced Strategy | Validation (2016-2021) | 1.01 | 0.71 | ~110% | -23.5% |
| Enhanced Strategy | Train (2000-2015) | 0.63 | 0.34 | ~85% | -30.8% |
| QQQ Benchmark | Holdout (2022-2025) | 0.52 | 0.24 | ~40% | -34.0% |
| QQQ Benchmark | Validation (2016-2021) | 1.15 | 0.89 | ~220% | -28.6% |
| QQQ Benchmark | Train (2000-2015) | 0.36 | 0.11 | ~65% | -61.5% |
Signal Components
Macro / Fed Signals
Volatility / Efficiency
Trend / Technical
Sentiment
Core Implementation
View on GitHub# Fed Liquidity Spread: Core position sizing
spread = df['Macro_Fed_Spread']
# Base sizing based on rate expectations
base_size = pd.Series(0.75, index=df.index)
base_size[spread < -0.25] = 1.0 # Cuts priced in → Aggressive
base_size[spread > 0.25] = 0.5 # Hikes priced in → Defensive
# Efficiency multiplier based on trend
trend_up = df['QQQ_Close'] > df['MA200']
eff_mult = pd.Series(1.0, index=df.index)
eff_mult[trend_up] = 1.0 + (eff_rank[trend_up] * 0.5) # Max 1.5x
eff_mult[~trend_up] = 1.0 - (eff_rank[~trend_up] * 0.8) # Min 0.2x
# Inflation veto: hard stop in stagflationary regime
cpi_veto = (df['Macro_CPI_YoY'] > 3.0) & (spread > 0.0)
# Combine + add bear trap alpha
exposure = base_size * eff_mult + (df['Micro_Trap'] * 0.5)
exposure[cpi_veto] = 0.0
exposure = exposure.clip(-1.0, 1.5)