{ "label_mode": "leg_gt", "train_ratio": 0.7, "holdout_ratio": 0.15, "outcomes_rows": 86924, "walk_forward": [ { "rule_id": "buy_compound_tight", "side": "buy", "month": "2025-06", "count": 263, "ev_pct": -1.9422, "win_rate": 0.3916, "profit_factor": 0.5766 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2025-07", "count": 140, "ev_pct": 13.1116, "win_rate": 0.8286, "profit_factor": 12.8707 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2025-08", "count": 216, "ev_pct": 7.649, "win_rate": 0.9491, "profit_factor": 63.0895 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2025-09", "count": 178, "ev_pct": 7.3711, "win_rate": 0.7697, "profit_factor": 6.8926 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2025-10", "count": 213, "ev_pct": 4.0333, "win_rate": 0.7746, "profit_factor": 6.2016 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2025-11", "count": 205, "ev_pct": -1.2831, "win_rate": 0.5268, "profit_factor": 0.6819 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2025-12", "count": 205, "ev_pct": 5.419, "win_rate": 0.6098, "profit_factor": 3.1271 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2026-01", "count": 179, "ev_pct": 13.9222, "win_rate": 0.7598, "profit_factor": 6.5045 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2026-02", "count": 150, "ev_pct": 8.9954, "win_rate": 0.9733, "profit_factor": 806.3668 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2026-03", "count": 234, "ev_pct": -0.5767, "win_rate": 0.5342, "profit_factor": 0.8951 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2026-04", "count": 153, "ev_pct": 5.1785, "win_rate": 0.6667, "profit_factor": 4.1474 }, { "rule_id": "buy_compound_tight", "side": "buy", "month": "2026-05", "count": 151, "ev_pct": 7.6904, "win_rate": 0.7152, "profit_factor": 4.3217 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2025-06", "count": 1662, "ev_pct": -1.2464, "win_rate": 0.4663, "profit_factor": 0.7035 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2025-07", "count": 1479, "ev_pct": 12.7113, "win_rate": 0.8087, "profit_factor": 10.5725 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2025-08", "count": 1482, "ev_pct": 7.2384, "win_rate": 0.9143, "profit_factor": 34.2206 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2025-09", "count": 1340, "ev_pct": 7.4951, "win_rate": 0.8075, "profit_factor": 8.2324 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2025-10", "count": 1666, "ev_pct": 3.5571, "win_rate": 0.7641, "profit_factor": 4.7418 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2025-11", "count": 1560, "ev_pct": -0.513, "win_rate": 0.5667, "profit_factor": 0.8596 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2025-12", "count": 1360, "ev_pct": 6.6657, "win_rate": 0.7059, "profit_factor": 4.31 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2026-01", "count": 1496, "ev_pct": 14.0964, "win_rate": 0.8483, "profit_factor": 9.9518 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2026-02", "count": 1248, "ev_pct": 8.6967, "win_rate": 0.9768, "profit_factor": 745.196 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2026-03", "count": 1654, "ev_pct": -1.0084, "win_rate": 0.4861, "profit_factor": 0.8106 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2026-04", "count": 1238, "ev_pct": 2.6525, "win_rate": 0.5872, "profit_factor": 2.4103 }, { "rule_id": "buy_compound_top3", "side": "buy", "month": "2026-05", "count": 1446, "ev_pct": 5.7454, "win_rate": 0.7434, "profit_factor": 3.8645 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2025-06", "count": 1619, "ev_pct": -1.1497, "win_rate": 0.4515, "profit_factor": 0.7231 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2025-07", "count": 1449, "ev_pct": 12.6089, "win_rate": 0.8213, "profit_factor": 11.252 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2025-08", "count": 1474, "ev_pct": 7.2413, "win_rate": 0.9064, "profit_factor": 24.6353 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2025-09", "count": 1572, "ev_pct": 6.7861, "win_rate": 0.7608, "profit_factor": 6.2571 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2025-10", "count": 1650, "ev_pct": 3.2113, "win_rate": 0.7212, "profit_factor": 3.8357 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2025-11", "count": 1452, "ev_pct": -0.596, "win_rate": 0.5882, "profit_factor": 0.8326 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2025-12", "count": 1465, "ev_pct": 6.909, "win_rate": 0.7065, "profit_factor": 4.9076 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2026-01", "count": 1519, "ev_pct": 13.7445, "win_rate": 0.8367, "profit_factor": 9.1005 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2026-02", "count": 1358, "ev_pct": 8.6035, "win_rate": 0.9624, "profit_factor": 341.2629 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2026-03", "count": 1714, "ev_pct": -0.9158, "win_rate": 0.5082, "profit_factor": 0.8265 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2026-04", "count": 1291, "ev_pct": 2.8274, "win_rate": 0.5716, "profit_factor": 2.7096 }, { "rule_id": "buy_contrast_m10_bb_pos", "side": "buy", "month": "2026-05", "count": 1430, "ev_pct": 6.2557, "win_rate": 0.7629, "profit_factor": 4.2613 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2025-06", "count": 308, "ev_pct": 0.3277, "win_rate": 0.5195, "profit_factor": 1.1378 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2025-07", "count": 227, "ev_pct": 13.6561, "win_rate": 0.6564, "profit_factor": 8.6272 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2025-08", "count": 301, "ev_pct": 7.494, "win_rate": 0.9568, "profit_factor": 103.4348 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2025-09", "count": 263, "ev_pct": 8.7699, "win_rate": 0.9202, "profit_factor": 24.9021 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2025-10", "count": 354, "ev_pct": 4.0776, "win_rate": 0.7881, "profit_factor": 4.7769 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2025-11", "count": 379, "ev_pct": 0.6357, "win_rate": 0.5752, "profit_factor": 1.2688 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2025-12", "count": 359, "ev_pct": 5.0753, "win_rate": 0.6769, "profit_factor": 2.7763 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2026-01", "count": 261, "ev_pct": 16.1777, "win_rate": 0.8238, "profit_factor": 12.0475 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2026-02", "count": 273, "ev_pct": 10.078, "win_rate": 1.0, "profit_factor": 2751.2872 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2026-03", "count": 358, "ev_pct": -0.7844, "win_rate": 0.4944, "profit_factor": 0.8406 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2026-04", "count": 232, "ev_pct": 2.1824, "win_rate": 0.5603, "profit_factor": 2.7443 }, { "rule_id": "buy_mtf_cross_all_tf", "side": "buy", "month": "2026-05", "count": 218, "ev_pct": 4.394, "win_rate": 0.6284, "profit_factor": 2.9914 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2025-06", "count": 78, "ev_pct": -0.6214, "win_rate": 0.5128, "profit_factor": 0.8099 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2025-07", "count": 88, "ev_pct": 15.6601, "win_rate": 0.8636, "profit_factor": 15.269 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2025-08", "count": 80, "ev_pct": 5.9541, "win_rate": 0.875, "profit_factor": 13.8636 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2025-09", "count": 88, "ev_pct": 8.453, "win_rate": 0.8068, "profit_factor": 10.5225 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2025-10", "count": 80, "ev_pct": 3.8108, "win_rate": 0.7875, "profit_factor": 8.4917 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2025-11", "count": 96, "ev_pct": 0.649, "win_rate": 0.6771, "profit_factor": 1.2386 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2025-12", "count": 108, "ev_pct": 6.9852, "win_rate": 0.7222, "profit_factor": 4.6301 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2026-01", "count": 152, "ev_pct": 17.6638, "win_rate": 0.9276, "profit_factor": 29.4996 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2026-02", "count": 131, "ev_pct": 8.5577, "win_rate": 0.9618, "profit_factor": 171.5897 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2026-03", "count": 196, "ev_pct": -0.173, "win_rate": 0.5102, "profit_factor": 0.964 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2026-04", "count": 224, "ev_pct": 2.4084, "win_rate": 0.5045, "profit_factor": 2.9195 }, { "rule_id": "gt_model_buy_trough_local", "side": "buy", "month": "2026-05", "count": 184, "ev_pct": 6.2009, "win_rate": 0.8587, "profit_factor": 8.1513 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2025-06", "count": 5, "ev_pct": 1.9875, "win_rate": 0.6, "profit_factor": 12.1145 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2025-11", "count": 5, "ev_pct": 6.6988, "win_rate": 1.0, "profit_factor": 33.4941 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2025-12", "count": 3, "ev_pct": 9.5205, "win_rate": 1.0, "profit_factor": 28.5616 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2026-01", "count": 2, "ev_pct": 30.7973, "win_rate": 1.0, "profit_factor": 61.5946 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2026-02", "count": 5, "ev_pct": 11.0061, "win_rate": 1.0, "profit_factor": 55.0306 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2026-03", "count": 3, "ev_pct": 3.166, "win_rate": 0.3333, "profit_factor": 3.345 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2026-04", "count": 1, "ev_pct": 9.9, "win_rate": 1.0, "profit_factor": 9.9 }, { "rule_id": "gt_model_buy_zigzag_bb", "side": "buy", "month": "2026-05", "count": 1, "ev_pct": 9.0429, "win_rate": 1.0, "profit_factor": 9.0429 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2025-06", "count": 289, "ev_pct": 3.5574, "win_rate": 0.8651, "profit_factor": 9.7973 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2025-07", "count": 390, "ev_pct": 3.192, "win_rate": 0.8256, "profit_factor": 6.122 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2025-08", "count": 412, "ev_pct": 3.8355, "win_rate": 0.8714, "profit_factor": 16.4526 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2025-09", "count": 343, "ev_pct": 2.7847, "win_rate": 0.8397, "profit_factor": 8.1316 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2025-10", "count": 367, "ev_pct": 3.0828, "win_rate": 0.8638, "profit_factor": 16.7214 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2025-11", "count": 440, "ev_pct": 2.5623, "win_rate": 0.7909, "profit_factor": 6.006 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2025-12", "count": 622, "ev_pct": 2.2781, "win_rate": 0.8135, "profit_factor": 4.902 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2026-01", "count": 628, "ev_pct": 2.4819, "win_rate": 0.8822, "profit_factor": 12.6381 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2026-02", "count": 596, "ev_pct": 3.1395, "win_rate": 0.9144, "profit_factor": 17.9664 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2026-03", "count": 736, "ev_pct": 1.3824, "win_rate": 0.7459, "profit_factor": 2.01 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2026-04", "count": 897, "ev_pct": 0.8388, "win_rate": 0.7759, "profit_factor": 1.813 }, { "rule_id": "gt_model_sell_peak_local", "side": "sell", "month": "2026-05", "count": 834, "ev_pct": 2.5192, "win_rate": 0.8321, "profit_factor": 5.9052 }, { "rule_id": "gt_model_sell_zigzag_peak", "side": "sell", "month": "2025-07", "count": 3, "ev_pct": 10.4846, "win_rate": 1.0, "profit_factor": 31.4539 }, { "rule_id": "gt_model_sell_zigzag_peak", "side": "sell", "month": "2025-09", "count": 5, "ev_pct": 12.7462, "win_rate": 1.0, "profit_factor": 63.7312 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2025-06", "count": 131, "ev_pct": 5.487, "win_rate": 0.9389, "profit_factor": 45.1788 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2025-07", "count": 260, "ev_pct": 4.9049, "win_rate": 0.9385, "profit_factor": 35.729 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2025-08", "count": 246, "ev_pct": 5.4156, "win_rate": 0.9715, "profit_factor": 157.8935 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2025-09", "count": 170, "ev_pct": 4.1968, "win_rate": 0.9294, "profit_factor": 28.4363 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2025-10", "count": 173, "ev_pct": 3.6467, "win_rate": 0.9711, "profit_factor": 141.2265 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2025-11", "count": 222, "ev_pct": 5.0714, "win_rate": 0.9459, "profit_factor": 30.843 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2025-12", "count": 196, "ev_pct": 3.895, "win_rate": 0.9643, "profit_factor": 40.9744 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2026-01", "count": 200, "ev_pct": 4.708, "win_rate": 0.9, "profit_factor": 26.6329 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2026-02", "count": 233, "ev_pct": 6.0765, "win_rate": 1.0, "profit_factor": 1415.8263 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2026-03", "count": 205, "ev_pct": 4.4932, "win_rate": 0.9415, "profit_factor": 16.1177 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2026-04", "count": 199, "ev_pct": 2.6254, "win_rate": 0.8492, "profit_factor": 12.0323 }, { "rule_id": "sell_compound_tight", "side": "sell", "month": "2026-05", "count": 312, "ev_pct": 6.6931, "win_rate": 0.9776, "profit_factor": 139.9974 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2025-06", "count": 1046, "ev_pct": 5.3143, "win_rate": 0.9694, "profit_factor": 60.8886 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2025-07", "count": 1503, "ev_pct": 5.2952, "win_rate": 0.9501, "profit_factor": 27.4175 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2025-08", "count": 1327, "ev_pct": 5.2946, "win_rate": 0.9661, "profit_factor": 117.1986 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2025-09", "count": 1279, "ev_pct": 5.1417, "win_rate": 0.9312, "profit_factor": 32.1165 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2025-10", "count": 1258, "ev_pct": 3.7386, "win_rate": 0.9316, "profit_factor": 33.5529 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2025-11", "count": 1277, "ev_pct": 5.0646, "win_rate": 0.9507, "profit_factor": 51.1384 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2025-12", "count": 1269, "ev_pct": 3.9295, "win_rate": 0.963, "profit_factor": 34.6971 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2026-01", "count": 1398, "ev_pct": 4.7231, "win_rate": 0.9599, "profit_factor": 64.7014 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2026-02", "count": 1163, "ev_pct": 5.8176, "win_rate": 0.9948, "profit_factor": 727.6797 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2026-03", "count": 1303, "ev_pct": 3.5755, "win_rate": 0.8979, "profit_factor": 6.9266 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2026-04", "count": 1319, "ev_pct": 2.857, "win_rate": 0.8855, "profit_factor": 11.4726 }, { "rule_id": "sell_compound_top3", "side": "sell", "month": "2026-05", "count": 1657, "ev_pct": 5.4517, "win_rate": 0.9572, "profit_factor": 68.7177 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2025-06", "count": 1055, "ev_pct": 5.3027, "win_rate": 0.9716, "profit_factor": 69.0846 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2025-07", "count": 1516, "ev_pct": 5.2797, "win_rate": 0.9459, "profit_factor": 33.0648 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2025-08", "count": 1412, "ev_pct": 5.1394, "win_rate": 0.9441, "profit_factor": 67.903 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2025-09", "count": 1232, "ev_pct": 4.8002, "win_rate": 0.9091, "profit_factor": 23.4189 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2025-10", "count": 1323, "ev_pct": 3.7359, "win_rate": 0.9327, "profit_factor": 40.3843 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2025-11", "count": 1287, "ev_pct": 4.9171, "win_rate": 0.9301, "profit_factor": 31.5454 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2025-12", "count": 1318, "ev_pct": 3.5399, "win_rate": 0.9317, "profit_factor": 18.8513 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2026-01", "count": 1469, "ev_pct": 4.2984, "win_rate": 0.9469, "profit_factor": 42.8817 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2026-02", "count": 1223, "ev_pct": 5.6511, "win_rate": 0.9853, "profit_factor": 229.8736 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2026-03", "count": 1292, "ev_pct": 3.5037, "win_rate": 0.8916, "profit_factor": 7.1733 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2026-04", "count": 1350, "ev_pct": 2.7395, "win_rate": 0.883, "profit_factor": 9.8467 }, { "rule_id": "sell_contrast_m10_bb_pos", "side": "sell", "month": "2026-05", "count": 1627, "ev_pct": 5.49, "win_rate": 0.9521, "profit_factor": 65.1094 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2025-06", "count": 136, "ev_pct": 6.9499, "win_rate": 1.0, "profit_factor": 945.1828 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2025-07", "count": 438, "ev_pct": 7.6836, "win_rate": 1.0, "profit_factor": 3365.4343 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2025-08", "count": 231, "ev_pct": 7.696, "win_rate": 1.0, "profit_factor": 1777.7845 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2025-09", "count": 241, "ev_pct": 8.0974, "win_rate": 1.0, "profit_factor": 1951.4689 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2025-10", "count": 122, "ev_pct": 4.2755, "win_rate": 1.0, "profit_factor": 521.6132 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2025-11", "count": 204, "ev_pct": 6.5692, "win_rate": 1.0, "profit_factor": 1340.1171 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2025-12", "count": 181, "ev_pct": 6.2362, "win_rate": 1.0, "profit_factor": 1128.7579 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2026-01", "count": 244, "ev_pct": 8.4765, "win_rate": 1.0, "profit_factor": 2068.2637 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2026-02", "count": 199, "ev_pct": 8.3106, "win_rate": 1.0, "profit_factor": 1653.8078 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2026-03", "count": 233, "ev_pct": 6.8041, "win_rate": 1.0, "profit_factor": 1585.3489 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2026-04", "count": 237, "ev_pct": 5.097, "win_rate": 1.0, "profit_factor": 1207.9774 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "month": "2026-05", "count": 472, "ev_pct": 7.7879, "win_rate": 1.0, "profit_factor": 3675.8689 } ], "walk_forward_summary": { "buy_compound_tight": { "months": 12, "positive_months": 9, "positive_ratio": 0.75, "mean_ev_pct": 5.7974 }, "buy_compound_top3": { "months": 12, "positive_months": 9, "positive_ratio": 0.75, "mean_ev_pct": 5.5076 }, "buy_contrast_m10_bb_pos": { "months": 12, "positive_months": 9, "positive_ratio": 0.75, "mean_ev_pct": 5.4605 }, "buy_mtf_cross_all_tf": { "months": 12, "positive_months": 11, "positive_ratio": 0.9167, "mean_ev_pct": 6.007 }, "gt_model_buy_trough_local": { "months": 12, "positive_months": 10, "positive_ratio": 0.8333, "mean_ev_pct": 6.2957 }, "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": 12, "positive_months": 12, "positive_ratio": 1.0, "mean_ev_pct": 2.6379 }, "gt_model_sell_zigzag_peak": { "months": 2, "positive_months": 2, "positive_ratio": 1.0, "mean_ev_pct": 11.6154 }, "sell_compound_tight": { "months": 12, "positive_months": 12, "positive_ratio": 1.0, "mean_ev_pct": 4.7678 }, "sell_compound_top3": { "months": 12, "positive_months": 12, "positive_ratio": 1.0, "mean_ev_pct": 4.6836 }, "sell_contrast_m10_bb_pos": { "months": 12, "positive_months": 12, "positive_ratio": 1.0, "mean_ev_pct": 4.5331 }, "sell_mtf_cross_all_tf": { "months": 12, "positive_months": 12, "positive_ratio": 1.0, "mean_ev_pct": 6.9987 } }, "fee_stress_mult": 2.0, "fee_stress_by_rule": { "buy_compound_top3": { "count": 17631, "ev_pct": 5.2063, "win_rate": 0.7138, "profit_factor": 3.4418 }, "buy_compound_tight": { "count": 2287, "ev_pct": 4.9966, "win_rate": 0.6874, "profit_factor": 3.0632 }, "buy_contrast_m10_bb_pos": { "count": 17993, "ev_pct": 5.2294, "win_rate": 0.7098, "profit_factor": 3.4977 }, "buy_mtf_cross_all_tf": { "count": 3533, "ev_pct": 5.3986, "win_rate": 0.7085, "profit_factor": 3.899 }, "sell_compound_top3": { "count": 15799, "ev_pct": 4.5906, "win_rate": 0.9455, "profit_factor": 29.2716 }, "sell_compound_tight": { "count": 2547, "ev_pct": 4.7878, "win_rate": 0.9458, "profit_factor": 38.8127 }, "sell_contrast_m10_bb_pos": { "count": 16104, "ev_pct": 4.4385, "win_rate": 0.9343, "profit_factor": 25.8628 }, "sell_mtf_cross_all_tf": { "count": 2938, "ev_pct": 7.1232, "win_rate": 1.0, "profit_factor": 20927.8254 }, "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": 1505, "ev_pct": 5.9624, "win_rate": 0.7302, "profit_factor": 4.588 }, "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": 6554, "ev_pct": 2.3084, "win_rate": 0.8184, "profit_factor": 4.8039 } }, "live_order_cap_sim": { "assumptions": { "slippage_pct": 0.05, "sizing": "gt_model_compound_no_daily_cap" }, "taken_count": 845, "total_count": 845, "rules": { "buy_compound_tight": { "taken_count": 221, "total_count": 221, "metrics": { "count": 221, "ev_pct": 5.6133, "win_rate": 0.6471, "profit_factor": 3.1259 } }, "sell_mtf_cross_all_tf": { "taken_count": 624, "total_count": 624, "metrics": { "count": 624, "ev_pct": 7.0822, "win_rate": 1.0, "profit_factor": 4419.2872 } } }, "portfolio_adj_ev_pct": 6.698 }, "go_no_go": { "go": true, "checks": [ { "rule_id": "buy_compound_tight", "side": "buy", "pass": true, "holdout_ev": 5.6633, "holdout_pf": 3.1592, "wf_positive_ratio": 0.75, "fee_stress_ev": 4.9966 }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "pass": true, "holdout_ev": 7.1322, "holdout_pf": 4450.4872, "wf_positive_ratio": 1.0, "fee_stress_ev": 7.1232 } ], "live_cap_taken_ratio": 1.0 }, "portfolio_compare": { "ground_truth_chrono": { "initial_cash_krw": 1000000, "final_asset_krw": 43913514.0, "pnl_krw": 42913514.0, "pnl_pct": 4291.35, "total_fees_krw": 240578.0, "cash_krw": 43913514.0, "holding_qty": 0.0, "holding_value_krw": 0.0, "mark_price": 487.0, "fee_rate": 0.0005, "trade_count": 456, "max_drawdown_pct": 6.17, "peak_asset_krw": 1234838.0, "trough_asset_krw": 1158619.0 }, "sim_sized": { "initial_cash_krw": 1000000, "final_asset_krw": 1746868.0, "pnl_krw": 746868.0, "pnl_pct": 74.69, "total_fees_krw": 29780.0, "cash_krw": 1509979.0, "holding_qty": 486.425998, "holding_value_krw": 236889.0, "mark_price": 487.0, "fee_rate": 0.0005, "trade_count": 5225, "max_drawdown_pct": 9.53, "peak_asset_krw": 1023021.0, "trough_asset_krw": 925549.0, "sizing_mode": "gt_model_compound_causal", "sizing_note": "전기간 복리·GT tier·총자산×비중, 보유현금 한도; 인과적 신호·tier(미래 미사용)" }, "sim_fixed_order": { "initial_cash_krw": 1000000, "final_asset_krw": 58389.0, "pnl_krw": -941611.0, "pnl_pct": -94.16, "total_fees_krw": 43869.0, "cash_krw": -0.0, "holding_qty": 119.896264, "holding_value_krw": 58389.0, "mark_price": 487.0, "fee_rate": 0.0005, "order_krw": 100000.0, "sizing_mode": "fixed", "trade_count": 5225 }, "sim_gt_model": { "initial_cash_krw": 1000000, "final_asset_krw": 1081984.0, "pnl_krw": 81984.0, "pnl_pct": 8.2, "total_fees_krw": 240.0, "cash_krw": 881042.0, "holding_qty": 412.612808, "holding_value_krw": 200942.0, "mark_price": 487.0, "fee_rate": 0.0005, "trade_count": 33, "max_drawdown_pct": 4.38, "peak_asset_krw": 1072413.0, "trough_asset_krw": 1025457.0, "sizing_mode": "gt_model_compound_causal", "sizing_note": "전기간 복리·GT tier·총자산×비중, 보유현금 한도; 인과적 신호·tier(미래 미사용)" }, "sim_sized_holdout": { "initial_asset_krw": 1605322.0, "final_asset_krw": 1751246.0, "pnl_krw": 145924.0, "pnl_pct": 9.09, "note": "전기간 복리 후 holdout 구간 자산 증감 (1M 재시작 아님)", "trade_count": 845 }, "gt_capture_ratio": 0.0174, "gt_pnl_pct": 4291.35, "sim_sized_pnl_pct": 74.69, "gt_model_capture_ratio": 0.0019, "gt_allocation_analysis": { "large_leg_ids": [ 3, 5, 14, 18, 19, 20, 21, 22, 33, 40, 46, 49, 52, 53, 72, 74 ], "large_leg_count": 16, "config_pct_large": 1.0, "config_pct_small": 0.05, "observed_implied_scale": { "all": { "count": 18, "mean": 0.1106, "median": 0.0527, "p25": 0.051, "p75": 0.054 }, "large_leg": { "count": 1, "mean": 1.0812, "median": 1.0812, "p25": 1.0812, "p75": 1.0812 }, "small_leg": { "count": 17, "mean": 0.0535, "median": 0.051, "p25": 0.051, "p75": 0.0539 } }, "recommended_pct_large_leg": 1.0812, "recommended_pct_small_leg": 0.051, "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": 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.020269805294580265, "hi": 0.1573047482613718 }, { "col": "m10_ga_cci_20", "op": "between", "lo": -176.0610418573743, "hi": -134.25322440673844 }, { "col": "m5_bb_pos", "op": "between", "lo": 0.04935035261803711, "hi": 0.1678449416858898 } ], "valid_fire_rate": 0.0143, "metrics": { "all": { "count": 2287, "ev_pct": 5.0966, "win_rate": 0.6891, "profit_factor": 3.1319 }, "train": { "count": 1446, "ev_pct": 4.3319, "win_rate": 0.6812, "profit_factor": 3.0046 }, "valid": { "count": 620, "ev_pct": 6.6782, "win_rate": 0.7226, "profit_factor": 3.3483 }, "holdout": { "count": 221, "ev_pct": 5.6633, "win_rate": 0.6471, "profit_factor": 3.1592 } }, "pass_valid": true, "pass_holdout": true }, { "rule_id": "sell_mtf_cross_all_tf", "side": "sell", "kind": "mtf_cross", "conditions": [ { "col": "m3_ga_cci_20", "op": "between", "lo": 71.08020816708225, "hi": 152.0239279574577 }, { "col": "m5_bb_pos", "op": "between", "lo": 0.7812942210429725, "hi": 0.979827466617936 }, { "col": "m10_bb_pos", "op": "between", "lo": 0.8052954063070535, "hi": 1.0 }, { "col": "m15_bb_pos", "op": "between", "lo": 0.8266597207479214, "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.013, "metrics": { "all": { "count": 2938, "ev_pct": 7.2232, "win_rate": 1.0, "profit_factor": 21221.6254 }, "train": { "count": 1749, "ev_pct": 7.1667, "win_rate": 1.0, "profit_factor": 12534.5465 }, "valid": { "count": 565, "ev_pct": 7.4984, "win_rate": 1.0, "profit_factor": 4236.5917 }, "holdout": { "count": 624, "ev_pct": 7.1322, "win_rate": 1.0, "profit_factor": 4450.4872 } }, "pass_valid": true, "pass_holdout": true } ], "gt_portfolio_calibration": { "portfolio": { "gt_final_asset_krw": 43913513.0, "subset_final_asset_krw": 1000000.0, "asset_ratio": 0.0228, "asset_accuracy_pct": 2.28, "target_met_90": false, "legs_total": 76, "legs_covered": 0, "leg_coverage_ratio": 0.0, "full_pnl_pct": 4291.35, "subset_pnl_pct": 0.0 }, "note": "캘리브레이션 미실행 — scripts/04_calibrate_gt_assets.py" }, "criteria": { "min_holdout_ev": 0.0, "min_holdout_pf": 1.0, "wf_positive_ratio": 0.5, "wf_min_months": 3 } }