Files
Bithumb/docs/04_matching/simulation_report.json
xavis 91c9338651 fix: GT 중복 인덱스 Series 오류 수정 및 파이프라인 산출물 갱신
봉 데이터 갱신 후 02~04 재실행. BB 저점 수집 시 _row_at_ts로 스칼라 추출.
hybrid Go/No-Go 및 matched_rules·fire_outcomes 동기화.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-04 08:41:33 +09:00

1567 lines
36 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"label_mode": "leg_gt",
"train_ratio": 0.7,
"holdout_ratio": 0.15,
"outcomes_rows": 77184,
"walk_forward": [
{
"month": "2025-06",
"pnl_pct": 15.0,
"start_asset_krw": 400000.0,
"end_asset_krw": 459985.0
},
{
"month": "2025-07",
"pnl_pct": 57.74,
"start_asset_krw": 459985.0,
"end_asset_krw": 725559.0
},
{
"month": "2025-08",
"pnl_pct": 21.52,
"start_asset_krw": 725559.0,
"end_asset_krw": 881721.0
},
{
"month": "2025-09",
"pnl_pct": 42.03,
"start_asset_krw": 881721.0,
"end_asset_krw": 1252333.0
},
{
"month": "2025-10",
"pnl_pct": 8.51,
"start_asset_krw": 1252333.0,
"end_asset_krw": 1358874.0
},
{
"month": "2025-11",
"pnl_pct": 8.1,
"start_asset_krw": 1358874.0,
"end_asset_krw": 1468941.0
},
{
"month": "2025-12",
"pnl_pct": -3.67,
"start_asset_krw": 1468941.0,
"end_asset_krw": 1415055.0
},
{
"month": "2026-01",
"pnl_pct": 34.57,
"start_asset_krw": 1415055.0,
"end_asset_krw": 1904276.0
},
{
"month": "2026-02",
"pnl_pct": 21.04,
"start_asset_krw": 1904276.0,
"end_asset_krw": 2304943.0
},
{
"month": "2026-03",
"pnl_pct": 1.08,
"start_asset_krw": 2304943.0,
"end_asset_krw": 2329782.0
},
{
"month": "2026-04",
"pnl_pct": 21.17,
"start_asset_krw": 2329782.0,
"end_asset_krw": 2822903.0
},
{
"month": "2026-05",
"pnl_pct": 41.14,
"start_asset_krw": 2822903.0,
"end_asset_krw": 3984211.0
},
{
"month": "2026-06",
"pnl_pct": 32.08,
"start_asset_krw": 3984211.0,
"end_asset_krw": 5262393.0
}
],
"walk_forward_summary": {
"buy_compound_tight": {
"months": 13,
"positive_months": 10,
"positive_ratio": 0.7692,
"mean_ev_pct": 7.0206
},
"buy_compound_top3": {
"months": 13,
"positive_months": 11,
"positive_ratio": 0.8462,
"mean_ev_pct": 6.8063
},
"buy_contrast_m10_bb_pos": {
"months": 13,
"positive_months": 10,
"positive_ratio": 0.7692,
"mean_ev_pct": 6.6378
},
"buy_mtf_cross_all_tf": {
"months": 12,
"positive_months": 11,
"positive_ratio": 0.9167,
"mean_ev_pct": 5.7691
},
"gt_model_buy_trough_local": {
"months": 13,
"positive_months": 11,
"positive_ratio": 0.8462,
"mean_ev_pct": 6.9544
},
"gt_model_buy_zigzag_bb": {
"months": 8,
"positive_months": 8,
"positive_ratio": 1.0,
"mean_ev_pct": 10.2649
},
"gt_model_sell_peak_local": {
"months": 13,
"positive_months": 13,
"positive_ratio": 1.0,
"mean_ev_pct": 2.6722
},
"gt_model_sell_zigzag_peak": {
"months": 2,
"positive_months": 2,
"positive_ratio": 1.0,
"mean_ev_pct": 11.6154
},
"sell_compound_tight": {
"months": 13,
"positive_months": 13,
"positive_ratio": 1.0,
"mean_ev_pct": 5.3948
},
"sell_compound_top3": {
"months": 13,
"positive_months": 13,
"positive_ratio": 1.0,
"mean_ev_pct": 5.0831
},
"sell_contrast_m10_bb_pos": {
"months": 13,
"positive_months": 13,
"positive_ratio": 1.0,
"mean_ev_pct": 4.8883
},
"sell_mtf_cross_all_tf": {
"months": 13,
"positive_months": 13,
"positive_ratio": 1.0,
"mean_ev_pct": 7.4322
}
},
"fee_stress_mult": 2.0,
"fee_stress_by_rule": {
"buy_compound_top3": {
"count": 9989,
"ev_pct": 5.3657,
"win_rate": 0.7162,
"profit_factor": 3.6056
},
"buy_compound_tight": {
"count": 1029,
"ev_pct": 5.4293,
"win_rate": 0.6842,
"profit_factor": 3.3529
},
"buy_contrast_m10_bb_pos": {
"count": 19029,
"ev_pct": 5.3862,
"win_rate": 0.7152,
"profit_factor": 3.6162
},
"buy_mtf_cross_all_tf": {
"count": 5244,
"ev_pct": 5.3262,
"win_rate": 0.7061,
"profit_factor": 3.809
},
"sell_compound_top3": {
"count": 11480,
"ev_pct": 4.6861,
"win_rate": 0.9444,
"profit_factor": 30.4894
},
"sell_compound_tight": {
"count": 1394,
"ev_pct": 5.0381,
"win_rate": 0.9505,
"profit_factor": 48.4627
},
"sell_contrast_m10_bb_pos": {
"count": 16859,
"ev_pct": 4.506,
"win_rate": 0.9361,
"profit_factor": 26.6487
},
"sell_mtf_cross_all_tf": {
"count": 4019,
"ev_pct": 7.2121,
"win_rate": 1.0,
"profit_factor": 28985.5736
},
"gt_model_buy_zigzag_bb": {
"count": 25,
"ev_pct": 8.5824,
"win_rate": 0.84,
"profit_factor": 41.1466
},
"gt_model_buy_trough_local": {
"count": 1508,
"ev_pct": 6.1193,
"win_rate": 0.7381,
"profit_factor": 4.738
},
"gt_model_sell_zigzag_peak": {
"count": 8,
"ev_pct": 11.7981,
"win_rate": 1.0,
"profit_factor": 94.3851
},
"gt_model_sell_peak_local": {
"count": 6600,
"ev_pct": 2.3127,
"win_rate": 0.8191,
"profit_factor": 4.83
}
},
"live_order_cap_sim": {
"assumptions": {
"slippage_pct": 0.05,
"sizing": "hybrid_dd_tier_compound"
},
"taken_count": 890,
"total_count": 913,
"rules": {
"buy_compound_tight": {
"taken_count": 77,
"total_count": 100,
"metrics": {
"count": 77,
"ev_pct": 8.9083,
"win_rate": 0.7013,
"profit_factor": 6.6417
}
},
"sell_mtf_cross_all_tf": {
"taken_count": 813,
"total_count": 813,
"metrics": {
"count": 813,
"ev_pct": 7.7543,
"win_rate": 1.0,
"profit_factor": 6304.2446
}
}
},
"portfolio_adj_ev_pct": 7.8541
},
"go_no_go": {
"go": true,
"checks": [
{
"rule_id": "buy_compound_tight",
"side": "buy",
"pass": true,
"holdout_ev": 10.8775,
"holdout_pf": 9.8832,
"wf_positive_ratio": 0.7692,
"fee_stress_ev": 5.4293
},
{
"rule_id": "sell_mtf_cross_all_tf",
"side": "sell",
"pass": true,
"holdout_ev": 7.8043,
"holdout_pf": 6344.8946,
"wf_positive_ratio": 1.0,
"fee_stress_ev": 7.2121
}
],
"live_cap_taken_ratio": 1.0
},
"go_no_go_hybrid": {
"go": true,
"primary_sizing": "hybrid",
"checks": [
{
"name": "monitor_rules_go",
"pass": true
},
{
"name": "hybrid_holdout_pnl",
"pass": true,
"value": 101.42
},
{
"name": "hybrid_max_mdd",
"pass": true,
"value": 19.76
},
{
"name": "hybrid_fee_stress_pnl",
"pass": true,
"value": 1065.77
},
{
"name": "option_c_target_300pct",
"pass": true,
"value": 1215.6,
"optional": true
}
]
},
"go_no_go_option_c_phase2": {
"go": false,
"gt_capture_ratio": 0.2019,
"targets": {
"phase2_pnl_pct": 1000.0,
"min_gt_capture": 0.23,
"portfolio_wf_min_ratio": 0.5
},
"checks": [
{
"name": "phase1_hybrid_go",
"pass": true
},
{
"name": "full_pnl_1000pct",
"pass": true,
"value": 1215.6
},
{
"name": "gt_capture_23pct",
"pass": false,
"value": 0.2019
},
{
"name": "holdout_pnl_positive",
"pass": true,
"value": 101.42
},
{
"name": "max_mdd",
"pass": true,
"value": 19.76
},
{
"name": "fee_stress_ratio",
"pass": true,
"value": 1065.77,
"threshold": 850.0
},
{
"name": "slippage_stress_positive",
"pass": true,
"value": 91.16,
"note": "체결가 슬리피지 반영 후에도 흑자"
},
{
"name": "portfolio_wf_positive_ratio",
"pass": true,
"value": 0.9231
}
]
},
"portfolio_compare": {
"ground_truth_chrono": {
"initial_cash_krw": 400000,
"final_asset_krw": 24488124.0,
"pnl_krw": 24088124.0,
"pnl_pct": 6022.03,
"total_fees_krw": 127822.0,
"cash_krw": 24488124.0,
"holding_qty": 0.0,
"holding_value_krw": 0.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 485,
"max_drawdown_pct": 6.57,
"peak_asset_krw": 491720.0,
"trough_asset_krw": 459404.0
},
"sim_sized": {
"initial_cash_krw": 400000,
"final_asset_krw": 632469.0,
"pnl_krw": 232469.0,
"pnl_pct": 58.12,
"total_fees_krw": 8806.0,
"cash_krw": 632400.0,
"holding_qty": 0.087967,
"holding_value_krw": 69.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 5048,
"max_drawdown_pct": 9.61,
"peak_asset_krw": 408681.0,
"trough_asset_krw": 369398.0,
"sizing_mode": "gt_model_compound_causal",
"sizing_note": "전기간 복리·GT tier·총자산×비중, 보유현금 한도; 인과적 신호·tier(미래 미사용)"
},
"sim_fixed_order": {
"initial_cash_krw": 400000,
"final_asset_krw": 26802.0,
"pnl_krw": -373198.0,
"pnl_pct": -93.3,
"total_fees_krw": 14326.0,
"cash_krw": 26802.0,
"holding_qty": 0.0,
"holding_value_krw": 0.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"order_krw": 40000.0,
"sizing_mode": "fixed",
"trade_count": 5048
},
"sim_gt_model": {
"initial_cash_krw": 400000,
"final_asset_krw": 485017.0,
"pnl_krw": 85017.0,
"pnl_pct": 21.25,
"total_fees_krw": 120.0,
"cash_krw": 309487.0,
"holding_qty": 223.320164,
"holding_value_krw": 175530.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 33,
"max_drawdown_pct": 9.79,
"peak_asset_krw": 429734.0,
"trough_asset_krw": 387649.0,
"sizing_mode": "gt_model_compound_causal",
"sizing_note": "전기간 복리·GT tier·총자산×비중, 보유현금 한도; 인과적 신호·tier(미래 미사용)"
},
"sim_causal_gt": {
"initial_cash_krw": 400000,
"final_asset_krw": 457564.0,
"pnl_krw": 57564.0,
"pnl_pct": 14.39,
"total_fees_krw": 920.0,
"cash_krw": 457564.0,
"holding_qty": 0.0,
"holding_value_krw": 0.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 134,
"max_drawdown_pct": 1.52,
"peak_asset_krw": 446670.0,
"trough_asset_krw": 439902.0,
"leg_count": 17,
"sizing_mode": "causal_gt_leg_engine",
"sizing_note": "인과 GT leg: split_buy + peak_sell, causal tier 복리 (미래 미사용)",
"causal_gt_params": {
"peak_mode": "local",
"pivot_order": 8,
"buy_swing_pct": 2.0,
"sell_swing_pct": 3.0,
"bb_max": 0.55,
"min_leg_pct": 8.0,
"min_bars_between_legs": 60,
"use_local_trough": false
},
"alloc_stats": {
"buy_executed": 101,
"buy_skipped": 0,
"sell_executed": 33,
"sell_skipped": 0,
"buy_total_krw": 891175.0,
"large_leg_count": 0,
"large_tier_buy_count": 0,
"buy_amount_avg_krw": 8824.0,
"buy_amount_min_krw": 5000,
"buy_amount_max_krw": 22806.0
}
},
"sim_causal_hybrid": {
"initial_cash_krw": 400000,
"final_asset_krw": 5262393.0,
"pnl_krw": 4862393.0,
"pnl_pct": 1215.6,
"total_fees_krw": 197687.0,
"cash_krw": 5262393.0,
"holding_qty": 0.0,
"holding_value_krw": 0.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 5048,
"max_drawdown_pct": 19.76,
"peak_asset_krw": 2685460.0,
"trough_asset_krw": 2154801.0,
"sizing_mode": "monitor_dd_tier",
"sizing_note": "monitor buy+sell + drawdown·past-leg tier (미래 미사용)",
"alloc_stats": {
"buy_executed": 761,
"buy_skipped": 268,
"sell_executed": 4019,
"sell_skipped": 0,
"buy_total_krw": 195156416.0,
"large_leg_count": 750,
"large_tier_buy_count": 750,
"buy_amount_avg_krw": 256447.0,
"buy_amount_min_krw": 5000,
"buy_amount_max_krw": 3067511.0
},
"input_fires": 5048
},
"hybrid_dd_params": {
"dd_large_pct": 5.0,
"dd_medium_pct": 2.0
},
"sim_tier_enhanced": {
"initial_cash_krw": 400000,
"final_asset_krw": 542410.0,
"pnl_krw": 142410.0,
"pnl_pct": 35.6,
"total_fees_krw": 58472.0,
"cash_krw": 542395.0,
"holding_qty": 0.019611,
"holding_value_krw": 15.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 5048,
"max_drawdown_pct": 60.86,
"peak_asset_krw": 844144.0,
"trough_asset_krw": 330412.0,
"sizing_mode": "monitor_tier_enhanced",
"sizing_note": "monitor buy+sell + past-leg·drawdown tier + conviction (미래 미사용)",
"alloc_stats": {
"buy_executed": 150,
"buy_skipped": 879,
"sell_executed": 4019,
"sell_skipped": 0,
"buy_total_krw": 58371500.0,
"large_leg_count": 113,
"large_tier_buy_count": 113,
"buy_amount_avg_krw": 389143.0,
"buy_amount_min_krw": 5000,
"buy_amount_max_krw": 843688.0
},
"input_fires": 5048
},
"sim_sized_holdout": {
"initial_asset_krw": 559081.0,
"final_asset_krw": 632472.0,
"pnl_krw": 73391.0,
"pnl_pct": 13.13,
"trade_count": 913,
"note": "전기간 복리(causal tier) 후 holdout 구간 자산 증감"
},
"sim_hybrid_holdout": {
"initial_asset_krw": 2612582.0,
"final_asset_krw": 5262393.0,
"pnl_krw": 2649811.0,
"pnl_pct": 101.42,
"trade_count": 913,
"note": "전기간 복리(hybrid DD tier) 후 holdout 구간 자산 증감"
},
"sim_hybrid_fee_stress": {
"initial_cash_krw": 400000,
"final_asset_krw": 4663063.0,
"pnl_krw": 4263063.0,
"pnl_pct": 1065.77,
"total_fees_krw": 365943.0,
"cash_krw": 4663059.0,
"holding_qty": 0.005146,
"holding_value_krw": 4.0,
"mark_price": 786.0,
"fee_rate": 0.001,
"trade_count": 5048,
"max_drawdown_pct": 20.13,
"peak_asset_krw": 2445202.0,
"trough_asset_krw": 1953065.0
},
"sim_hybrid_slippage_stress": {
"initial_cash_krw": 400000,
"final_asset_krw": 764640.0,
"pnl_krw": 364640.0,
"pnl_pct": 91.16,
"total_fees_krw": 197687.0,
"cash_krw": 764640.0,
"holding_qty": 0.0,
"holding_value_krw": 0.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 5048,
"max_drawdown_pct": 46.47,
"peak_asset_krw": 1421723.0,
"trough_asset_krw": 761079.0,
"slippage_pct": 0.05,
"sizing_mode": "hybrid_slippage_stress"
},
"hybrid_portfolio_walk_forward": [
{
"month": "2025-06",
"pnl_pct": 15.0,
"start_asset_krw": 400000.0,
"end_asset_krw": 459985.0
},
{
"month": "2025-07",
"pnl_pct": 57.74,
"start_asset_krw": 459985.0,
"end_asset_krw": 725559.0
},
{
"month": "2025-08",
"pnl_pct": 21.52,
"start_asset_krw": 725559.0,
"end_asset_krw": 881721.0
},
{
"month": "2025-09",
"pnl_pct": 42.03,
"start_asset_krw": 881721.0,
"end_asset_krw": 1252333.0
},
{
"month": "2025-10",
"pnl_pct": 8.51,
"start_asset_krw": 1252333.0,
"end_asset_krw": 1358874.0
},
{
"month": "2025-11",
"pnl_pct": 8.1,
"start_asset_krw": 1358874.0,
"end_asset_krw": 1468941.0
},
{
"month": "2025-12",
"pnl_pct": -3.67,
"start_asset_krw": 1468941.0,
"end_asset_krw": 1415055.0
},
{
"month": "2026-01",
"pnl_pct": 34.57,
"start_asset_krw": 1415055.0,
"end_asset_krw": 1904276.0
},
{
"month": "2026-02",
"pnl_pct": 21.04,
"start_asset_krw": 1904276.0,
"end_asset_krw": 2304943.0
},
{
"month": "2026-03",
"pnl_pct": 1.08,
"start_asset_krw": 2304943.0,
"end_asset_krw": 2329782.0
},
{
"month": "2026-04",
"pnl_pct": 21.17,
"start_asset_krw": 2329782.0,
"end_asset_krw": 2822903.0
},
{
"month": "2026-05",
"pnl_pct": 41.14,
"start_asset_krw": 2822903.0,
"end_asset_krw": 3984211.0
},
{
"month": "2026-06",
"pnl_pct": 32.08,
"start_asset_krw": 3984211.0,
"end_asset_krw": 5262393.0
}
],
"hybrid_portfolio_wf_summary": {
"months": 13,
"positive_months": 12,
"positive_ratio": 0.9231,
"mean_pnl_pct": 23.1
},
"primary_sizing": "hybrid",
"sim_primary": {
"initial_cash_krw": 400000,
"final_asset_krw": 5262393.0,
"pnl_krw": 4862393.0,
"pnl_pct": 1215.6,
"total_fees_krw": 197687.0,
"cash_krw": 5262393.0,
"holding_qty": 0.0,
"holding_value_krw": 0.0,
"mark_price": 786.0,
"fee_rate": 0.0005,
"trade_count": 5048,
"max_drawdown_pct": 19.76,
"peak_asset_krw": 2685460.0,
"trough_asset_krw": 2154801.0,
"sizing_mode": "primary_hybrid_dd_tier",
"sizing_note": "권장: monitor + past-leg·drawdown tier (검증 통과, 미래 미사용)",
"alloc_stats": {
"buy_executed": 761,
"buy_skipped": 268,
"sell_executed": 4019,
"sell_skipped": 0,
"buy_total_krw": 195156416.0,
"large_leg_count": 750,
"large_tier_buy_count": 750,
"buy_amount_avg_krw": 256447.0,
"buy_amount_min_krw": 5000,
"buy_amount_max_krw": 3067511.0
},
"input_fires": 5048
},
"gt_capture_ratio": 0.0097,
"gt_pnl_pct": 6022.03,
"sim_sized_pnl_pct": 58.12,
"gt_model_capture_ratio": 0.0035,
"causal_gt_capture_ratio": 0.0024,
"sim_causal_gt_pnl_pct": 14.39,
"causal_hybrid_capture_ratio": 0.2019,
"sim_causal_hybrid_pnl_pct": 1215.6,
"tier_enhanced_capture_ratio": 0.0059,
"sim_tier_enhanced_pnl_pct": 35.6,
"causal_gt_params": {
"peak_mode": "local",
"pivot_order": 8,
"buy_swing_pct": 2.0,
"sell_swing_pct": 3.0,
"bb_max": 0.55,
"min_leg_pct": 8.0,
"min_bars_between_legs": 60,
"use_local_trough": false
},
"gt_allocation_analysis": {
"large_leg_ids": [
3,
5,
18,
19,
20,
21,
22,
33,
40,
46,
49,
52,
53,
72,
74,
76,
78
],
"large_leg_count": 17,
"config_pct_large": 1.0,
"config_pct_small": 0.05,
"observed_implied_scale": {
"all": {
"count": 18,
"mean": 0.1404,
"median": 0.0667,
"p25": 0.0539,
"p75": 0.1318
},
"large_leg": {
"count": 1,
"mean": 1.1008,
"median": 1.1008,
"p25": 1.1008,
"p75": 1.1008
},
"small_leg": {
"count": 17,
"mean": 0.0839,
"median": 0.0583,
"p25": 0.0539,
"p75": 0.119
}
},
"recommended_pct_large_leg": 1.1008,
"recommended_pct_small_leg": 0.0583,
"note": "implied_scale = amount / (pre_buy_total_asset × weight_share); 시뮬 tier는 GT 분석 median 사용"
},
"causal_mode": {
"gt_signal_causal": true,
"sim_causal_tier": true,
"note": "인과적: t 시점까지 데이터만 사용 (운영 정합)"
}
},
"gt_model": {
"selection_mode": "split_buy_peak_sell",
"leg_definition": "이전 고점 매도 ~ 다음 고점 매도 구간 = leg_id; 기간말 잔여 구간은 마지막 leg",
"entry": {
"pivot": "trough",
"price": "Low",
"weight_rule": "inverse_price_normalized",
"weight_formula": "w_i = (1/price_i) / sum(1/price_j)",
"max_buys_per_leg": 12,
"min_bars_between_buys": 24,
"bb_filter": "bb_pos <= 0.45"
},
"exit": {
"pivot": "peak",
"price": "High",
"weight_rule": "fixed_split_or_full",
"weights_split": [
0.65,
0.35
],
"split_gap_pct": 2.5,
"max_sells_per_leg": 2
},
"capital": {
"buy": "target = total_asset * (weight/remaining_weights) * tier_scale; amount = min(target, available_cash/(1+fee))",
"optimal_buy_rate": "weight / sum(remaining_buy_weights_in_leg)",
"large_leg_top_pct": 0.2,
"pct_large_leg": 1.0,
"pct_small_leg": 0.05,
"min_order_krw": 5000.0,
"sell": "sell_base_qty * sell_weight * price (last sell = full leg_qty)"
},
"execution": {
"chrono": "amount_krw 배분·summary.pnl_pct = 시각순 체결(매도 후 현금 → 다음 매수 반영)",
"leg_block_json": "JSON 저장 순서 = leg별 매수 전량 → 매도 전량 (차트·테이블 leg 정합)"
}
},
"gt_weight_policy": {
"entry_weight_rule": "inverse_price_normalized",
"exit_split_weights": [
0.65,
0.35
],
"capital_large_pct": 1.0,
"capital_small_pct": 0.05,
"large_leg_top_pct": 0.2
},
"gt_leg_weight_validation": {
"legs": {
"0": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"1": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 12,
"n_sell": 2,
"valid": true
},
"2": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"3": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"4": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"5": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"6": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"7": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"8": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"9": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"10": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"11": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"12": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"13": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 7,
"n_sell": 2,
"valid": true
},
"14": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"15": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"16": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 7,
"n_sell": 2,
"valid": true
},
"17": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"18": {
"buy_sum": 0.999,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"19": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"20": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"21": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"22": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"23": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"24": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"25": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"26": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"27": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 1,
"valid": true
},
"28": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"29": {
"buy_sum": 0.999,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"30": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"31": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"32": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"33": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"34": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"35": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 7,
"n_sell": 2,
"valid": true
},
"36": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"37": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"38": {
"buy_sum": 0.999,
"sell_sum": 1.0,
"n_buy": 7,
"n_sell": 2,
"valid": true
},
"39": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"40": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"41": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 12,
"n_sell": 2,
"valid": true
},
"42": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 11,
"n_sell": 2,
"valid": true
},
"43": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"44": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"45": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 7,
"n_sell": 2,
"valid": true
},
"46": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"47": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"48": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 8,
"n_sell": 2,
"valid": true
},
"49": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 10,
"n_sell": 2,
"valid": true
},
"50": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"51": {
"buy_sum": 0.999,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"52": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"53": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"54": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"55": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"56": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"57": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"58": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"59": {
"buy_sum": 0.999,
"sell_sum": 1.0,
"n_buy": 9,
"n_sell": 2,
"valid": true
},
"60": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 5,
"n_sell": 2,
"valid": true
},
"61": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"62": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"63": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"64": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 7,
"n_sell": 2,
"valid": true
},
"65": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"66": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"67": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"68": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"69": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 1,
"n_sell": 2,
"valid": true
},
"70": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"71": {
"buy_sum": 0.999,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"72": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"73": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"74": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 4,
"n_sell": 2,
"valid": true
},
"75": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"76": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 2,
"valid": true
},
"77": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 3,
"n_sell": 2,
"valid": true
},
"78": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"79": {
"buy_sum": 1.001,
"sell_sum": 1.0,
"n_buy": 6,
"n_sell": 2,
"valid": true
},
"80": {
"buy_sum": 1.0,
"sell_sum": 1.0,
"n_buy": 2,
"n_sell": 1,
"valid": true
}
},
"invalid_leg_ids": [],
"all_valid": true
},
"monitor_rules": [
{
"rule_id": "buy_compound_tight",
"side": "buy",
"kind": "compound_tight",
"conditions": [
{
"col": "m10_bb_pos",
"op": "between",
"lo": 0.02269722528896669,
"hi": 0.16417141470116056
},
{
"col": "m5_bb_pos",
"op": "between",
"lo": 0.050986874829589954,
"hi": 0.17673357601131273
},
{
"col": "m5_ga_cci_20",
"op": "between",
"lo": -169.2052113398648,
"hi": -124.73123841544977
},
{
"col": "m10_ga_cci_20",
"op": "between",
"lo": -175.7862791639258,
"hi": -132.6451584428887
}
],
"valid_fire_rate": 0.0055,
"metrics": {
"all": {
"count": 1029,
"ev_pct": 5.5293,
"win_rate": 0.688,
"profit_factor": 3.4292
},
"train": {
"count": 686,
"ev_pct": 4.4243,
"win_rate": 0.6706,
"profit_factor": 3.0189
},
"valid": {
"count": 243,
"ev_pct": 6.448,
"win_rate": 0.7119,
"profit_factor": 3.187
},
"holdout": {
"count": 100,
"ev_pct": 10.8775,
"win_rate": 0.75,
"profit_factor": 9.8832
}
},
"pass_valid": true,
"pass_holdout": true
},
{
"rule_id": "sell_mtf_cross_all_tf",
"side": "sell",
"kind": "mtf_cross",
"conditions": [
{
"col": "m3_bb_pos",
"op": "between",
"lo": 0.6734769690278859,
"hi": 0.9584317797555851
},
{
"col": "m5_bb_pos",
"op": "between",
"lo": 0.776608631452867,
"hi": 0.9797670778565873
},
{
"col": "m10_bb_pos",
"op": "between",
"lo": 0.7897850598593097,
"hi": 1.0
},
{
"col": "m15_bb_pos",
"op": "between",
"lo": 0.8094990667113329,
"hi": 1.0
},
{
"col": "m30_ga_ha_bull",
"op": "eq_int",
"value": 1
},
{
"col": "m60_ga_ha_bull",
"op": "eq_int",
"value": 1
},
{
"col": "m240_ga_ha_bull",
"op": "eq_int",
"value": 1
},
{
"col": "d1_ga_ha_bull",
"op": "eq_int",
"value": 1
}
],
"valid_fire_rate": 0.0182,
"metrics": {
"all": {
"count": 4019,
"ev_pct": 7.3121,
"win_rate": 1.0,
"profit_factor": 29387.4736
},
"train": {
"count": 2397,
"ev_pct": 7.1764,
"win_rate": 1.0,
"profit_factor": 17201.897
},
"valid": {
"count": 809,
"ev_pct": 7.2196,
"win_rate": 1.0,
"profit_factor": 5840.682
},
"holdout": {
"count": 813,
"ev_pct": 7.8043,
"win_rate": 1.0,
"profit_factor": 6344.8946
}
},
"pass_valid": true,
"pass_holdout": true
}
],
"gt_portfolio_calibration": {},
"criteria": {
"min_holdout_ev": 0.0,
"min_holdout_pf": 1.0,
"wf_positive_ratio": 0.5,
"wf_min_months": 3,
"hybrid_min_holdout_pnl_pct": 0.0,
"hybrid_max_mdd_pct": 30.0,
"option_c_target_pnl_pct": 300.0,
"option_c_phase2_target_pnl_pct": 1000.0,
"option_c_phase2_fee_stress_ratio": 0.85,
"option_c_min_gt_capture": 0.23
}
}