Phase 2: Live paper trading engine + extended backtesting analytics

Track A — Live paper trading system:
- Extract PositionManager from backtester into shared src/position_manager.py
- Refactor backtester/engine.py to delegate to PositionManager
- New src/live/ package: data_feed (OANDA polling), executor (paper/live orders),
  engine (LiveEngine orchestrator with 5 strategy slots), run.py entry point
- Add phase2 config to system.yaml (S7_Tight, S9, S9_Filtered, S4F, S3)

Track B — Extended backtesting analytics:
- Regime analysis: per-year (2021-2023) breakdown shows 4/5 strategies trending UP
- Correlation analysis: S7+S3 GBP_JPY overlap=16.9% (moderate), S9 pairs=12% (low)
- Kelly sizing: S9_Filtered half-Kelly=7.3%, S4F=2.4%, S3=1.6% with Monte Carlo DD

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Brent Neale
2026-02-19 14:46:51 +10:00
co-authored by Claude Opus 4.6
parent 39a6536284
commit 072ac0f245
14 changed files with 2361 additions and 409 deletions
+23
View File
@@ -0,0 +1,23 @@
{
"S7_S3_overlap": {
"overlap_count": 21,
"same_dir": 21,
"opposite_dir": 0,
"ratio": 0.169
},
"S9_S9F_temporal": {
"s9_trade_days": 275,
"s9f_trade_days": 65,
"shared_trade_days": 33,
"temporal_overlap_ratio": 0.12
},
"portfolio": {
"total_trades": 694,
"win_rate_pct": 53.3,
"profit_factor": 0.99,
"total_pnl_pips": -175.1,
"total_pnl_dollars": -23036.66,
"max_drawdown_pct": -47.8,
"sharpe_ratio": -0.71
}
}
+82
View File
@@ -0,0 +1,82 @@
{
"S7_Tight_GBP_JPY": {
"trades": 98,
"win_rate": 59.2,
"avg_win_pips": 42.8,
"avg_loss_pips": 62.3,
"avg_win_loss_ratio": 0.69,
"kelly_full_pct": 0,
"kelly_half_pct": 0,
"monte_carlo_half_kelly": {
"p50_dd": 0,
"p75_dd": 0,
"p95_dd": 0,
"p99_dd": 0,
"ruin_pct": 0
}
},
"S9_GBP_USD": {
"trades": 285,
"win_rate": 53.7,
"avg_win_pips": 29.3,
"avg_loss_pips": 41.7,
"avg_win_loss_ratio": 0.7,
"kelly_full_pct": 0,
"kelly_half_pct": 0,
"monte_carlo_half_kelly": {
"p50_dd": 0,
"p75_dd": 0,
"p95_dd": 0,
"p99_dd": 0,
"ruin_pct": 0
}
},
"S9_Filtered_GBP_AUD": {
"trades": 66,
"win_rate": 60.6,
"avg_win_pips": 49.5,
"avg_loss_pips": 57.9,
"avg_win_loss_ratio": 0.85,
"kelly_full_pct": 14.53,
"kelly_half_pct": 7.26,
"monte_carlo_half_kelly": {
"p50_dd": 2.5,
"p75_dd": 3.3,
"p95_dd": 4.8,
"p99_dd": 6.3,
"ruin_pct": 0.0
}
},
"S4F_EUR_AUD": {
"trades": 95,
"win_rate": 45.3,
"avg_win_pips": 38.8,
"avg_loss_pips": 28.7,
"avg_win_loss_ratio": 1.35,
"kelly_full_pct": 4.7,
"kelly_half_pct": 2.35,
"monte_carlo_half_kelly": {
"p50_dd": 0.7,
"p75_dd": 1.0,
"p95_dd": 1.5,
"p99_dd": 1.9,
"ruin_pct": 0.0
}
},
"S3_GBP_JPY": {
"trades": 150,
"win_rate": 50.7,
"avg_win_pips": 43.5,
"avg_loss_pips": 41.9,
"avg_win_loss_ratio": 1.04,
"kelly_full_pct": 3.11,
"kelly_half_pct": 1.56,
"monte_carlo_half_kelly": {
"p50_dd": 0.9,
"p75_dd": 1.2,
"p95_dd": 1.9,
"p99_dd": 2.4,
"ruin_pct": 0.0
}
}
}
+192
View File
@@ -0,0 +1,192 @@
{
"S7_Tight_GBP_JPY": {
"pair": "GBP_JPY",
"timeframe": "H1",
"years": {
"2021": {
"trades": 34,
"wr": 47.1,
"pf": 0.47,
"pnl_pips": -465.5,
"max_dd_pips": -618.3,
"expectancy": -13.69
},
"2022": {
"trades": 29,
"wr": 58.6,
"pf": 0.89,
"pnl_pips": -102.1,
"max_dd_pips": -412.7,
"expectancy": -3.52
},
"2023": {
"trades": 35,
"wr": 71.4,
"pf": 1.8,
"pnl_pips": 558.9,
"max_dd_pips": -219.9,
"expectancy": 15.97
}
},
"full": {
"trades": 98,
"wr": 59.2,
"pf": 1.0,
"pnl_pips": -8.6,
"max_dd_pips": -723.9,
"expectancy": -0.09
}
},
"S9_GBP_USD": {
"pair": "GBP_USD",
"timeframe": "H1",
"years": {
"2021": {
"trades": 138,
"wr": 52.2,
"pf": 0.71,
"pnl_pips": -701.8,
"max_dd_pips": -856.6,
"expectancy": -5.09
},
"2022": {
"trades": 115,
"wr": 51.3,
"pf": 0.83,
"pnl_pips": -470.0,
"max_dd_pips": -1030.5,
"expectancy": -4.09
},
"2023": {
"trades": 32,
"wr": 68.8,
"pf": 1.38,
"pnl_pips": 154.8,
"max_dd_pips": -132.7,
"expectancy": 4.84
}
},
"full": {
"trades": 285,
"wr": 53.7,
"pf": 0.82,
"pnl_pips": -1017.0,
"max_dd_pips": -1775.8,
"expectancy": -3.57
}
},
"S9_Filtered_GBP_AUD": {
"pair": "GBP_AUD",
"timeframe": "H1",
"years": {
"2021": {
"trades": 31,
"wr": 45.2,
"pf": 0.58,
"pnl_pips": -412.3,
"max_dd_pips": -535.5,
"expectancy": -13.3
},
"2022": {
"trades": 23,
"wr": 73.9,
"pf": 2.57,
"pnl_pips": 544.1,
"max_dd_pips": -116.9,
"expectancy": 23.65
},
"2023": {
"trades": 12,
"wr": 75.0,
"pf": 2.98,
"pnl_pips": 342.6,
"max_dd_pips": -49.6,
"expectancy": 28.55
}
},
"full": {
"trades": 66,
"wr": 60.6,
"pf": 1.32,
"pnl_pips": 474.3,
"max_dd_pips": -561.2,
"expectancy": 7.19
}
},
"S4F_EUR_AUD": {
"pair": "EUR_AUD",
"timeframe": "M15",
"years": {
"2021": {
"trades": 42,
"wr": 42.9,
"pf": 1.11,
"pnl_pips": 57.8,
"max_dd_pips": -119.7,
"expectancy": 1.38
},
"2022": {
"trades": 33,
"wr": 60.6,
"pf": 1.79,
"pnl_pips": 370.0,
"max_dd_pips": -183.7,
"expectancy": 11.21
},
"2023": {
"trades": 20,
"wr": 25.0,
"pf": 0.48,
"pnl_pips": -254.7,
"max_dd_pips": -337.2,
"expectancy": -12.74
}
},
"full": {
"trades": 95,
"wr": 45.3,
"pf": 1.12,
"pnl_pips": 173.0,
"max_dd_pips": -337.2,
"expectancy": 1.82
}
},
"S3_GBP_JPY": {
"pair": "GBP_JPY",
"timeframe": "H1",
"years": {
"2021": {
"trades": 65,
"wr": 46.2,
"pf": 0.9,
"pnl_pips": -112.6,
"max_dd_pips": -345.7,
"expectancy": -1.73
},
"2022": {
"trades": 47,
"wr": 53.2,
"pf": 1.21,
"pnl_pips": 262.9,
"max_dd_pips": -307.3,
"expectancy": 5.59
},
"2023": {
"trades": 38,
"wr": 55.3,
"pf": 1.07,
"pnl_pips": 56.9,
"max_dd_pips": -182.9,
"expectancy": 1.5
}
},
"full": {
"trades": 150,
"wr": 50.7,
"pf": 1.07,
"pnl_pips": 203.1,
"max_dd_pips": -533.2,
"expectancy": 1.35
}
}
}