Files
signal-platform/reports/execution_recovery_matrix.json
2026-07-18 16:57:19 +02:00

796 lines
22 KiB
JSON

{
"generated_at": "2026-07-18T16:56:10.007302",
"snapshot": "/Users/taathde3/git/lab/signal_platform/backtest_snapshots/prod.sqlite",
"validation_split": "2024-07-01",
"n_trials": 4,
"hypothesis": "stale_close (signal t-1, fill t close) recovers close-fill economics; the next_open haircut is scheduling, not lost edge",
"decision_baseline": "next_open",
"qualified_longs": 5189,
"arms": [
{
"id": "close_control",
"label": "Close fill (historical control)",
"config": {
"fill_mode": "close"
},
"windows": [
{
"window": "train",
"dsr": 0.936,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "close",
"final_equity": 23706.04,
"total_return_pct": 137.1,
"cagr_pct": 49.8,
"max_drawdown_pct": 17.9,
"calmar": 2.78,
"sharpe": 1.75,
"sharpe_se": 0.675,
"psr": 0.9953,
"n_returns": 535,
"return_skew": 0.4266,
"return_kurtosis": 4.9374,
"trades": 240,
"win_rate": 36.7,
"avg_trade_pnl": 57.11,
"best_trade_r": 12.02,
"worst_trade_r": -3.1,
"best_trade_pnl": 2008.56,
"worst_trade_pnl": -561.69,
"avg_hold_days": 15.3,
"exit_reasons": {
"stop": 112,
"time": 53,
"trailing_stop": 75
},
"skipped_book_full": 327,
"spy_return_pct": 36.7,
"yearly_returns": [
{
"year": 2022,
"return_pct": 11.9
},
{
"year": 2023,
"return_pct": 78.1
},
{
"year": 2024,
"return_pct": 19.1
}
],
"start_date": "2022-06-24",
"end_date": "2024-08-12",
"post_stop_events": 112,
"post_stop_reentries": 61,
"post_stop_states_open_at_end": 51
},
{
"window": "validation",
"dsr": 0.9039,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "close",
"final_equity": 20060.98,
"total_return_pct": 100.6,
"cagr_pct": 41.6,
"max_drawdown_pct": 20.9,
"calmar": 1.99,
"sharpe": 1.68,
"sharpe_se": 0.716,
"psr": 0.9905,
"n_returns": 502,
"return_skew": -0.0866,
"return_kurtosis": 4.395,
"trades": 239,
"win_rate": 35.1,
"avg_trade_pnl": 42.1,
"best_trade_r": 12.03,
"worst_trade_r": -2.82,
"best_trade_pnl": 2012.72,
"worst_trade_pnl": -330.01,
"avg_hold_days": 14.0,
"exit_reasons": {
"stop": 121,
"time": 44,
"trailing_stop": 74
},
"skipped_book_full": 207,
"spy_return_pct": 36.6,
"yearly_returns": [
{
"year": 2024,
"return_pct": 16.7
},
{
"year": 2025,
"return_pct": 50.3
},
{
"year": 2026,
"return_pct": 14.5
}
],
"start_date": "2024-07-01",
"end_date": "2026-07-02",
"post_stop_events": 121,
"post_stop_reentries": 63,
"post_stop_states_open_at_end": 58
},
{
"window": "full",
"dsr": 0.9939,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "close",
"final_equity": 48810.86,
"total_return_pct": 388.1,
"cagr_pct": 48.3,
"max_drawdown_pct": 21.6,
"calmar": 2.23,
"sharpe": 1.77,
"sharpe_se": 0.496,
"psr": 0.9998,
"n_returns": 1008,
"return_skew": 0.2714,
"return_kurtosis": 4.9751,
"trades": 472,
"win_rate": 36.2,
"avg_trade_pnl": 82.23,
"best_trade_r": 12.03,
"worst_trade_r": -3.1,
"best_trade_pnl": 4897.19,
"worst_trade_pnl": -802.94,
"avg_hold_days": 14.6,
"exit_reasons": {
"stop": 229,
"time": 96,
"trailing_stop": 147
},
"skipped_book_full": 519,
"spy_return_pct": 90.9,
"yearly_returns": [
{
"year": 2022,
"return_pct": 11.9
},
{
"year": 2023,
"return_pct": 78.1
},
{
"year": 2024,
"return_pct": 42.5
},
{
"year": 2025,
"return_pct": 50.3
},
{
"year": 2026,
"return_pct": 14.5
}
],
"start_date": "2022-06-24",
"end_date": "2026-07-02",
"post_stop_events": 229,
"post_stop_reentries": 142,
"post_stop_states_open_at_end": 87
}
]
},
{
"id": "next_open",
"label": "Next-open fill (decision baseline)",
"config": {
"fill_mode": "next_open"
},
"windows": [
{
"window": "train",
"dsr": 0.6243,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "next_open",
"final_equity": 15364.14,
"total_return_pct": 53.6,
"cagr_pct": 22.2,
"max_drawdown_pct": 18.1,
"calmar": 1.23,
"sharpe": 0.94,
"sharpe_se": 0.688,
"psr": 0.9148,
"n_returns": 536,
"return_skew": -0.039,
"return_kurtosis": 4.2924,
"trades": 260,
"win_rate": 31.2,
"avg_trade_pnl": 20.63,
"best_trade_r": 11.53,
"worst_trade_r": -2.99,
"best_trade_pnl": 1265.39,
"worst_trade_pnl": -303.24,
"avg_hold_days": 13.7,
"exit_reasons": {
"stop": 133,
"time": 48,
"trailing_stop": 79
},
"skipped_book_full": 140,
"spy_return_pct": 39.0,
"yearly_returns": [
{
"year": 2022,
"return_pct": 4.5
},
{
"year": 2023,
"return_pct": 44.6
},
{
"year": 2024,
"return_pct": 1.7
}
],
"start_date": "2022-06-24",
"end_date": "2024-08-13",
"skipped_missing_fill": 0,
"overnight_slippage": {
"n": 260,
"mean_pct": -0.063,
"median_pct": -0.1627,
"p05_pct": -2.5148,
"p95_pct": 1.8498
},
"post_stop_events": 133,
"post_stop_reentries": 79,
"post_stop_states_open_at_end": 50
},
{
"window": "validation",
"dsr": 0.8327,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "next_open",
"final_equity": 18586.06,
"total_return_pct": 85.9,
"cagr_pct": 36.3,
"max_drawdown_pct": 28.2,
"calmar": 1.29,
"sharpe": 1.44,
"sharpe_se": 0.719,
"psr": 0.9774,
"n_returns": 502,
"return_skew": -0.2169,
"return_kurtosis": 4.6486,
"trades": 243,
"win_rate": 35.0,
"avg_trade_pnl": 35.33,
"best_trade_r": 12.2,
"worst_trade_r": -4.0,
"best_trade_pnl": 1731.6,
"worst_trade_pnl": -196.48,
"avg_hold_days": 13.8,
"exit_reasons": {
"stop": 114,
"time": 48,
"trailing_stop": 81
},
"skipped_book_full": 197,
"spy_return_pct": 36.6,
"yearly_returns": [
{
"year": 2024,
"return_pct": 14.2
},
{
"year": 2025,
"return_pct": 42.6
},
{
"year": 2026,
"return_pct": 14.1
}
],
"start_date": "2024-07-01",
"end_date": "2026-07-02",
"skipped_missing_fill": 0,
"overnight_slippage": {
"n": 243,
"mean_pct": -0.519,
"median_pct": -0.1786,
"p05_pct": -4.5194,
"p95_pct": 2.0911
},
"post_stop_events": 114,
"post_stop_reentries": 51,
"post_stop_states_open_at_end": 52
},
{
"window": "full",
"dsr": 0.9093,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "next_open",
"final_equity": 28701.57,
"total_return_pct": 187.0,
"cagr_pct": 30.0,
"max_drawdown_pct": 28.2,
"calmar": 1.06,
"sharpe": 1.2,
"sharpe_se": 0.504,
"psr": 0.9914,
"n_returns": 1008,
"return_skew": -0.1589,
"return_kurtosis": 4.4517,
"trades": 502,
"win_rate": 32.5,
"avg_trade_pnl": 37.25,
"best_trade_r": 12.2,
"worst_trade_r": -4.0,
"best_trade_pnl": 2674.03,
"worst_trade_pnl": -303.42,
"avg_hold_days": 13.7,
"exit_reasons": {
"stop": 251,
"time": 97,
"trailing_stop": 154
},
"skipped_book_full": 356,
"spy_return_pct": 90.9,
"yearly_returns": [
{
"year": 2022,
"return_pct": 4.5
},
{
"year": 2023,
"return_pct": 44.6
},
{
"year": 2024,
"return_pct": 15.7
},
{
"year": 2025,
"return_pct": 44.0
},
{
"year": 2026,
"return_pct": 14.1
}
],
"start_date": "2022-06-24",
"end_date": "2026-07-02",
"skipped_missing_fill": 0,
"overnight_slippage": {
"n": 502,
"mean_pct": -0.2566,
"median_pct": -0.1661,
"p05_pct": -2.7763,
"p95_pct": 1.8997
},
"post_stop_events": 251,
"post_stop_reentries": 157,
"post_stop_states_open_at_end": 81
}
]
},
{
"id": "stale_close",
"label": "Stale-signal close fill (MOC proxy: signal t-1, fill t close)",
"config": {
"fill_mode": "stale_close"
},
"windows": [
{
"window": "train",
"dsr": 0.8241,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "stale_close",
"final_equity": 18942.53,
"total_return_pct": 89.4,
"cagr_pct": 34.8,
"max_drawdown_pct": 17.0,
"calmar": 2.05,
"sharpe": 1.36,
"sharpe_se": 0.685,
"psr": 0.9767,
"n_returns": 536,
"return_skew": 0.0918,
"return_kurtosis": 3.1111,
"trades": 246,
"win_rate": 39.0,
"avg_trade_pnl": 36.35,
"best_trade_r": 10.3,
"worst_trade_r": -2.67,
"best_trade_pnl": 1318.25,
"worst_trade_pnl": -328.1,
"avg_hold_days": 16.1,
"exit_reasons": {
"stop": 103,
"time": 54,
"trailing_stop": 89
},
"skipped_book_full": 668,
"spy_return_pct": 39.0,
"yearly_returns": [
{
"year": 2022,
"return_pct": -0.9
},
{
"year": 2023,
"return_pct": 72.8
},
{
"year": 2024,
"return_pct": 10.6
}
],
"start_date": "2022-06-24",
"end_date": "2024-08-13",
"skipped_missing_fill": 0,
"signal_to_fill_drift": {
"n": 246,
"mean_pct": -0.3836,
"median_pct": -0.4703,
"p05_pct": -4.841,
"p95_pct": 3.908
},
"post_stop_events": 103,
"post_stop_reentries": 54,
"post_stop_states_open_at_end": 47
},
{
"window": "validation",
"dsr": 0.9216,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "stale_close",
"final_equity": 20546.48,
"total_return_pct": 105.5,
"cagr_pct": 43.3,
"max_drawdown_pct": 21.6,
"calmar": 2.0,
"sharpe": 1.74,
"sharpe_se": 0.702,
"psr": 0.9933,
"n_returns": 502,
"return_skew": 0.3013,
"return_kurtosis": 5.6337,
"trades": 234,
"win_rate": 37.2,
"avg_trade_pnl": 45.07,
"best_trade_r": 11.94,
"worst_trade_r": -4.23,
"best_trade_pnl": 2186.87,
"worst_trade_pnl": -732.55,
"avg_hold_days": 15.2,
"exit_reasons": {
"open_at_end": 1,
"stop": 103,
"time": 50,
"trailing_stop": 80
},
"skipped_book_full": 223,
"spy_return_pct": 36.6,
"yearly_returns": [
{
"year": 2024,
"return_pct": 17.6
},
{
"year": 2025,
"return_pct": 74.8
},
{
"year": 2026,
"return_pct": -0.1
}
],
"start_date": "2024-07-01",
"end_date": "2026-07-02",
"skipped_missing_fill": 0,
"signal_to_fill_drift": {
"n": 234,
"mean_pct": -0.5217,
"median_pct": -0.0138,
"p05_pct": -6.5593,
"p95_pct": 4.5614
},
"post_stop_events": 103,
"post_stop_reentries": 45,
"post_stop_states_open_at_end": 53
},
{
"window": "full",
"dsr": 0.9816,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "stale_close",
"final_equity": 39381.26,
"total_return_pct": 293.8,
"cagr_pct": 40.6,
"max_drawdown_pct": 21.8,
"calmar": 1.87,
"sharpe": 1.57,
"sharpe_se": 0.5,
"psr": 0.9991,
"n_returns": 1008,
"return_skew": 0.0941,
"return_kurtosis": 4.1297,
"trades": 483,
"win_rate": 37.5,
"avg_trade_pnl": 60.83,
"best_trade_r": 11.94,
"worst_trade_r": -4.23,
"best_trade_pnl": 4191.56,
"worst_trade_pnl": -1404.07,
"avg_hold_days": 15.5,
"exit_reasons": {
"open_at_end": 1,
"stop": 208,
"time": 102,
"trailing_stop": 172
},
"skipped_book_full": 894,
"spy_return_pct": 90.9,
"yearly_returns": [
{
"year": 2022,
"return_pct": -0.9
},
{
"year": 2023,
"return_pct": 72.8
},
{
"year": 2024,
"return_pct": 31.7
},
{
"year": 2025,
"return_pct": 74.7
},
{
"year": 2026,
"return_pct": -0.1
}
],
"start_date": "2022-06-24",
"end_date": "2026-07-02",
"skipped_missing_fill": 0,
"signal_to_fill_drift": {
"n": 483,
"mean_pct": -0.4799,
"median_pct": -0.381,
"p05_pct": -5.5621,
"p95_pct": 4.2818
},
"post_stop_events": 208,
"post_stop_reentries": 118,
"post_stop_states_open_at_end": 83
}
]
},
{
"id": "next_open_gap2",
"label": "Next-open + skip gap-up > 2%",
"config": {
"fill_mode": "next_open",
"max_entry_gap_pct": 0.02
},
"windows": [
{
"window": "train",
"dsr": 0.4988,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "next_open",
"final_equity": 13619.82,
"total_return_pct": 36.2,
"cagr_pct": 15.5,
"max_drawdown_pct": 21.5,
"calmar": 0.72,
"sharpe": 0.72,
"sharpe_se": 0.686,
"psr": 0.8518,
"n_returns": 536,
"return_skew": 0.0343,
"return_kurtosis": 4.6315,
"trades": 274,
"win_rate": 31.4,
"avg_trade_pnl": 13.21,
"best_trade_r": 11.53,
"worst_trade_r": -2.99,
"best_trade_pnl": 1223.62,
"worst_trade_pnl": -268.81,
"avg_hold_days": 13.4,
"exit_reasons": {
"stop": 138,
"time": 47,
"trailing_stop": 89
},
"skipped_book_full": 325,
"spy_return_pct": 39.0,
"yearly_returns": [
{
"year": 2022,
"return_pct": -4.1
},
{
"year": 2023,
"return_pct": 38.7
},
{
"year": 2024,
"return_pct": 2.4
}
],
"start_date": "2022-06-24",
"end_date": "2024-08-13",
"skipped_missing_fill": 0,
"overnight_slippage": {
"n": 274,
"mean_pct": -0.4245,
"median_pct": -0.2836,
"p05_pct": -2.6277,
"p95_pct": 1.3953
},
"max_entry_gap_pct": 0.02,
"skipped_gap_cap": 146,
"post_stop_events": 138,
"post_stop_reentries": 76,
"post_stop_states_open_at_end": 55
},
{
"window": "validation",
"dsr": 0.8234,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "next_open",
"final_equity": 18053.3,
"total_return_pct": 80.5,
"cagr_pct": 34.3,
"max_drawdown_pct": 28.2,
"calmar": 1.22,
"sharpe": 1.41,
"sharpe_se": 0.715,
"psr": 0.9758,
"n_returns": 502,
"return_skew": -0.0944,
"return_kurtosis": 4.7767,
"trades": 251,
"win_rate": 35.1,
"avg_trade_pnl": 32.08,
"best_trade_r": 12.2,
"worst_trade_r": -4.0,
"best_trade_pnl": 1693.37,
"worst_trade_pnl": -213.76,
"avg_hold_days": 13.7,
"exit_reasons": {
"open_at_end": 1,
"stop": 117,
"time": 49,
"trailing_stop": 84
},
"skipped_book_full": 200,
"spy_return_pct": 36.6,
"yearly_returns": [
{
"year": 2024,
"return_pct": 12.7
},
{
"year": 2025,
"return_pct": 40.4
},
{
"year": 2026,
"return_pct": 14.1
}
],
"start_date": "2024-07-01",
"end_date": "2026-07-02",
"skipped_missing_fill": 0,
"overnight_slippage": {
"n": 251,
"mean_pct": -0.7233,
"median_pct": -0.2245,
"p05_pct": -4.6154,
"p95_pct": 1.0467
},
"max_entry_gap_pct": 0.02,
"skipped_gap_cap": 116,
"post_stop_events": 117,
"post_stop_reentries": 56,
"post_stop_states_open_at_end": 53
},
{
"window": "full",
"dsr": 0.8561,
"starting_capital": 10000.0,
"cost_per_side_pct": 0.1,
"fill_mode": "next_open",
"final_equity": 24698.25,
"total_return_pct": 147.0,
"cagr_pct": 25.2,
"max_drawdown_pct": 27.8,
"calmar": 0.91,
"sharpe": 1.06,
"sharpe_se": 0.502,
"psr": 0.983,
"n_returns": 1008,
"return_skew": -0.0453,
"return_kurtosis": 4.7254,
"trades": 523,
"win_rate": 32.7,
"avg_trade_pnl": 28.1,
"best_trade_r": 12.2,
"worst_trade_r": -4.0,
"best_trade_pnl": 2316.66,
"worst_trade_pnl": -292.44,
"avg_hold_days": 13.4,
"exit_reasons": {
"open_at_end": 1,
"stop": 258,
"time": 97,
"trailing_stop": 167
},
"skipped_book_full": 525,
"spy_return_pct": 90.9,
"yearly_returns": [
{
"year": 2022,
"return_pct": -4.1
},
{
"year": 2023,
"return_pct": 38.7
},
{
"year": 2024,
"return_pct": 14.8
},
{
"year": 2025,
"return_pct": 41.7
},
{
"year": 2026,
"return_pct": 14.1
}
],
"start_date": "2022-06-24",
"end_date": "2026-07-02",
"skipped_missing_fill": 0,
"overnight_slippage": {
"n": 523,
"mean_pct": -0.5565,
"median_pct": -0.2628,
"p05_pct": -3.5771,
"p95_pct": 1.3699
},
"max_entry_gap_pct": 0.02,
"skipped_gap_cap": 262,
"post_stop_events": 258,
"post_stop_reentries": 158,
"post_stop_states_open_at_end": 87
}
]
}
],
"recovery": {
"recover": false,
"near_close_control": true,
"beats_next_open": true,
"train_ok": false,
"validation_delta_vs_close": 0.06,
"validation_delta_vs_next_open": 0.3,
"half_se": 0.358,
"reason": "stale_close does not meet recovery criteria \u2014 see flags"
}
}