40만 원 기준 시뮬·dry-run 정합 및 hybrid 체결 엔진 통합.

초기 자금 GT_INITIAL_CASH_KRW=400000과 원화 한도 비율(알림·LIVE_ORDER·일한도·손실한도)을 맞추고, dry-run/live 체결을 sim_causal_hybrid(replay)와 동일 경로로 통합한다. 시뮬 리포트 갱신, Phase C 슈퍼바이저·매수매도 리허설 스크립트를 추가한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dsyoon
2026-06-03 11:31:24 +09:00
parent b9ee241d14
commit c6888c9228
24 changed files with 7707 additions and 6253 deletions

File diff suppressed because one or more lines are too long

View File

@@ -6,75 +6,75 @@
"walk_forward": [
{
"month": "2025-06",
"pnl_pct": 12.78,
"start_asset_krw": 1000000.0,
"end_asset_krw": 1127825.0
"pnl_pct": 10.02,
"start_asset_krw": 400000.0,
"end_asset_krw": 440064.0
},
{
"month": "2025-07",
"pnl_pct": 60.89,
"start_asset_krw": 1127825.0,
"end_asset_krw": 1814584.0
"start_asset_krw": 440064.0,
"end_asset_krw": 708031.0
},
{
"month": "2025-08",
"pnl_pct": 22.9,
"start_asset_krw": 1814584.0,
"end_asset_krw": 2230083.0
"start_asset_krw": 708031.0,
"end_asset_krw": 870154.0
},
{
"month": "2025-09",
"pnl_pct": 57.63,
"start_asset_krw": 2230083.0,
"end_asset_krw": 3515283.0
"pnl_pct": 58.24,
"start_asset_krw": 870154.0,
"end_asset_krw": 1376957.0
},
{
"month": "2025-10",
"pnl_pct": 9.29,
"start_asset_krw": 3515283.0,
"end_asset_krw": 3842010.0
"pnl_pct": 1.41,
"start_asset_krw": 1376957.0,
"end_asset_krw": 1396376.0
},
{
"month": "2025-11",
"pnl_pct": 11.24,
"start_asset_krw": 3842010.0,
"end_asset_krw": 4273771.0
"pnl_pct": 19.55,
"start_asset_krw": 1396376.0,
"end_asset_krw": 1669367.0
},
{
"month": "2025-12",
"pnl_pct": -0.87,
"start_asset_krw": 4273771.0,
"end_asset_krw": 4236421.0
"pnl_pct": -1.53,
"start_asset_krw": 1669367.0,
"end_asset_krw": 1643749.0
},
{
"month": "2026-01",
"pnl_pct": 33.77,
"start_asset_krw": 4236421.0,
"end_asset_krw": 5666889.0
"pnl_pct": 28.68,
"start_asset_krw": 1643749.0,
"end_asset_krw": 2115197.0
},
{
"month": "2026-02",
"pnl_pct": 15.61,
"start_asset_krw": 5666889.0,
"end_asset_krw": 6551242.0
"pnl_pct": 20.21,
"start_asset_krw": 2115197.0,
"end_asset_krw": 2542690.0
},
{
"month": "2026-03",
"pnl_pct": 9.12,
"start_asset_krw": 6551242.0,
"end_asset_krw": 7148390.0
"pnl_pct": 9.7,
"start_asset_krw": 2542690.0,
"end_asset_krw": 2789334.0
},
{
"month": "2026-04",
"pnl_pct": 22.85,
"start_asset_krw": 7148390.0,
"end_asset_krw": 8782116.0
"pnl_pct": 22.86,
"start_asset_krw": 2789334.0,
"end_asset_krw": 3426893.0
},
{
"month": "2026-05",
"pnl_pct": 47.57,
"start_asset_krw": 8782116.0,
"end_asset_krw": 12959660.0
"pnl_pct": 44.66,
"start_asset_krw": 3426893.0,
"end_asset_krw": 4957419.0
}
],
"walk_forward_summary": {
@@ -292,29 +292,29 @@
{
"name": "hybrid_holdout_pnl",
"pass": true,
"value": 62.35
"value": 59.15
},
{
"name": "hybrid_max_mdd",
"pass": true,
"value": 19.22
"value": 19.89
},
{
"name": "hybrid_fee_stress_pnl",
"pass": true,
"value": 975.74
"value": 947.42
},
{
"name": "option_c_target_300pct",
"pass": true,
"value": 1147.3,
"value": 1116.87,
"optional": true
}
]
},
"go_no_go_option_c_phase2": {
"go": true,
"gt_capture_ratio": 0.2674,
"go": false,
"gt_capture_ratio": 0.1587,
"targets": {
"phase2_pnl_pct": 1000.0,
"min_gt_capture": 0.23,
@@ -328,33 +328,33 @@
{
"name": "full_pnl_1000pct",
"pass": true,
"value": 1147.3
"value": 1116.87
},
{
"name": "gt_capture_23pct",
"pass": true,
"value": 0.2674
"pass": false,
"value": 0.1587
},
{
"name": "holdout_pnl_positive",
"pass": true,
"value": 62.35
"value": 59.15
},
{
"name": "max_mdd",
"pass": true,
"value": 19.22
"value": 19.89
},
{
"name": "fee_stress_ratio",
"pass": true,
"value": 975.74,
"value": 947.42,
"threshold": 850.0
},
{
"name": "slippage_stress_positive",
"pass": true,
"value": 31.58,
"value": 28.14,
"note": "체결가 슬리피지 반영 후에도 흑자"
},
{
@@ -366,87 +366,87 @@
},
"portfolio_compare": {
"ground_truth_chrono": {
"initial_cash_krw": 1000000,
"final_asset_krw": 43913514.0,
"pnl_krw": 42913514.0,
"pnl_pct": 4291.35,
"initial_cash_krw": 400000,
"final_asset_krw": 28554960.0,
"pnl_krw": 28154960.0,
"pnl_pct": 7038.74,
"total_fees_krw": 240578.0,
"cash_krw": 43913514.0,
"cash_krw": 28554960.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
"max_drawdown_pct": 8.34,
"peak_asset_krw": 9032973.0,
"trough_asset_krw": 8279398.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,
"initial_cash_krw": 400000,
"final_asset_krw": 546248.0,
"pnl_krw": 146248.0,
"pnl_pct": 36.56,
"total_fees_krw": 15161.0,
"cash_krw": 467164.0,
"holding_qty": 162.389581,
"holding_value_krw": 79084.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,
"max_drawdown_pct": 20.54,
"peak_asset_krw": 412326.0,
"trough_asset_krw": 327644.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,
"initial_cash_krw": 400000,
"final_asset_krw": 23356.0,
"pnl_krw": -376644.0,
"pnl_pct": -94.16,
"total_fees_krw": 43869.0,
"cash_krw": -0.0,
"holding_qty": 119.896264,
"holding_value_krw": 58389.0,
"total_fees_krw": 17548.0,
"cash_krw": 0.0,
"holding_qty": 47.958506,
"holding_value_krw": 23356.0,
"mark_price": 487.0,
"fee_rate": 0.0005,
"order_krw": 100000.0,
"order_krw": 40000.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,
"initial_cash_krw": 400000,
"final_asset_krw": 418244.0,
"pnl_krw": 18244.0,
"pnl_pct": 4.56,
"total_fees_krw": 120.0,
"cash_krw": 309487.0,
"holding_qty": 223.320164,
"holding_value_krw": 108757.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,
"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": 1000000,
"final_asset_krw": 1147944.0,
"pnl_krw": 147944.0,
"pnl_pct": 14.79,
"total_fees_krw": 2025.0,
"cash_krw": 1147944.0,
"initial_cash_krw": 400000,
"final_asset_krw": 459948.0,
"pnl_krw": 59948.0,
"pnl_pct": 14.99,
"total_fees_krw": 900.0,
"cash_krw": 459948.0,
"holding_qty": 0.0,
"holding_value_krw": 0.0,
"mark_price": 487.0,
"fee_rate": 0.0005,
"trade_count": 124,
"max_drawdown_pct": 0.96,
"peak_asset_krw": 1118535.0,
"trough_asset_krw": 1107793.0,
"trade_count": 129,
"max_drawdown_pct": 1.51,
"peak_asset_krw": 448991.0,
"trough_asset_krw": 442216.0,
"leg_count": 17,
"sizing_mode": "causal_gt_leg_engine",
"sizing_note": "인과 GT leg: split_buy + peak_sell, causal tier 복리 (미래 미사용)",
@@ -461,46 +461,46 @@
"use_local_trough": false
},
"alloc_stats": {
"buy_executed": 91,
"buy_executed": 96,
"buy_skipped": 0,
"sell_executed": 33,
"sell_skipped": 0,
"buy_total_krw": 1950020.0,
"buy_total_krw": 870005.0,
"large_leg_count": 0,
"large_tier_buy_count": 0,
"buy_amount_avg_krw": 21429.0,
"buy_amount_avg_krw": 9063.0,
"buy_amount_min_krw": 5000,
"buy_amount_max_krw": 57216.0
"buy_amount_max_krw": 22925.0
}
},
"sim_causal_hybrid": {
"initial_cash_krw": 1000000,
"final_asset_krw": 12473032.0,
"pnl_krw": 11473032.0,
"pnl_pct": 1147.3,
"total_fees_krw": 710297.0,
"cash_krw": 0.0,
"holding_qty": 25611.975633,
"holding_value_krw": 12473032.0,
"initial_cash_krw": 400000,
"final_asset_krw": 4867465.0,
"pnl_krw": 4467465.0,
"pnl_pct": 1116.87,
"total_fees_krw": 277183.0,
"cash_krw": 3.0,
"holding_qty": 9994.789459,
"holding_value_krw": 4867462.0,
"mark_price": 487.0,
"fee_rate": 0.0005,
"trade_count": 5225,
"max_drawdown_pct": 19.22,
"peak_asset_krw": 1174413.0,
"trough_asset_krw": 948744.0,
"max_drawdown_pct": 19.89,
"peak_asset_krw": 3104956.0,
"trough_asset_krw": 2487267.0,
"sizing_mode": "monitor_dd_tier",
"sizing_note": "monitor buy+sell + drawdown·past-leg tier (미래 미사용)",
"alloc_stats": {
"buy_executed": 1632,
"buy_skipped": 655,
"buy_executed": 1628,
"buy_skipped": 659,
"sell_executed": 2938,
"sell_skipped": 0,
"buy_total_krw": 710442254.0,
"large_leg_count": 1535,
"large_tier_buy_count": 1535,
"buy_amount_avg_krw": 435320.0,
"buy_amount_min_krw": 828.0,
"buy_amount_max_krw": 8620153.0
"buy_total_krw": 277244801.0,
"large_leg_count": 1532,
"large_tier_buy_count": 1532,
"buy_amount_avg_krw": 170298.0,
"buy_amount_min_krw": 323.0,
"buy_amount_max_krw": 3363487.0
},
"input_fires": 5225
},
@@ -509,208 +509,208 @@
"dd_medium_pct": 2.0
},
"sim_tier_enhanced": {
"initial_cash_krw": 1000000,
"final_asset_krw": 487437.0,
"pnl_krw": -512563.0,
"pnl_pct": -51.26,
"total_fees_krw": 107068.0,
"cash_krw": 1.0,
"holding_qty": 1000.895401,
"holding_value_krw": 487436.0,
"initial_cash_krw": 400000,
"final_asset_krw": 232667.0,
"pnl_krw": -167333.0,
"pnl_pct": -41.83,
"total_fees_krw": 51034.0,
"cash_krw": -0.0,
"holding_qty": 477.75476,
"holding_value_krw": 232667.0,
"mark_price": 487.0,
"fee_rate": 0.0005,
"trade_count": 5225,
"max_drawdown_pct": 74.08,
"peak_asset_krw": 1540984.0,
"trough_asset_krw": 399432.0,
"max_drawdown_pct": 73.4,
"peak_asset_krw": 735586.0,
"trough_asset_krw": 195638.0,
"sizing_mode": "monitor_tier_enhanced",
"sizing_note": "monitor buy+sell + past-leg·drawdown tier + conviction (미래 미사용)",
"alloc_stats": {
"buy_executed": 279,
"buy_skipped": 2008,
"buy_executed": 241,
"buy_skipped": 2046,
"sell_executed": 2938,
"sell_skipped": 0,
"buy_total_krw": 107514607.0,
"large_leg_count": 136,
"large_tier_buy_count": 136,
"buy_amount_avg_krw": 385357.0,
"buy_total_krw": 51208940.0,
"large_leg_count": 143,
"large_tier_buy_count": 143,
"buy_amount_avg_krw": 212485.0,
"buy_amount_min_krw": 5000,
"buy_amount_max_krw": 1540213.0
"buy_amount_max_krw": 735224.0
},
"input_fires": 5225
},
"sim_sized_holdout": {
"initial_asset_krw": 1605322.0,
"final_asset_krw": 1751246.0,
"pnl_krw": 145924.0,
"pnl_pct": 9.09,
"initial_asset_krw": 515736.0,
"final_asset_krw": 547709.0,
"pnl_krw": 31973.0,
"pnl_pct": 6.2,
"trade_count": 845,
"note": "전기간 복리(causal tier) 후 holdout 구간 자산 증감"
},
"sim_hybrid_holdout": {
"initial_asset_krw": 7982769.0,
"final_asset_krw": 12959660.0,
"pnl_krw": 4976891.0,
"pnl_pct": 62.35,
"initial_asset_krw": 3114931.0,
"final_asset_krw": 4957419.0,
"pnl_krw": 1842488.0,
"pnl_pct": 59.15,
"trade_count": 845,
"note": "전기간 복리(hybrid DD tier) 후 holdout 구간 자산 증감"
},
"sim_hybrid_fee_stress": {
"initial_cash_krw": 1000000,
"final_asset_krw": 10757384.0,
"pnl_krw": 9757384.0,
"pnl_pct": 975.74,
"total_fees_krw": 1289111.0,
"initial_cash_krw": 400000,
"final_asset_krw": 4189669.0,
"pnl_krw": 3789669.0,
"pnl_pct": 947.42,
"total_fees_krw": 502923.0,
"cash_krw": -0.0,
"holding_qty": 22089.084224,
"holding_value_krw": 10757384.0,
"holding_qty": 8603.015894,
"holding_value_krw": 4189669.0,
"mark_price": 487.0,
"fee_rate": 0.001,
"trade_count": 5225,
"max_drawdown_pct": 16.02,
"peak_asset_krw": 7104706.0,
"trough_asset_krw": 5966238.0
"max_drawdown_pct": 20.18,
"peak_asset_krw": 460724.0,
"trough_asset_krw": 367741.0
},
"sim_hybrid_slippage_stress": {
"initial_cash_krw": 1000000,
"final_asset_krw": 1315755.0,
"pnl_krw": 315755.0,
"pnl_pct": 31.58,
"total_fees_krw": 710297.0,
"initial_cash_krw": 400000,
"final_asset_krw": 512580.0,
"pnl_krw": 112580.0,
"pnl_pct": 28.14,
"total_fees_krw": 277183.0,
"cash_krw": -0.0,
"holding_qty": 2701.755603,
"holding_value_krw": 1315755.0,
"holding_qty": 1052.52527,
"holding_value_krw": 512580.0,
"mark_price": 487.0,
"fee_rate": 0.0005,
"trade_count": 5225,
"max_drawdown_pct": 59.08,
"peak_asset_krw": 3483599.0,
"trough_asset_krw": 1425625.0,
"max_drawdown_pct": 59.13,
"peak_asset_krw": 1358898.0,
"trough_asset_krw": 555385.0,
"slippage_pct": 0.05,
"sizing_mode": "hybrid_slippage_stress"
},
"hybrid_portfolio_walk_forward": [
{
"month": "2025-06",
"pnl_pct": 12.78,
"start_asset_krw": 1000000.0,
"end_asset_krw": 1127825.0
"pnl_pct": 10.02,
"start_asset_krw": 400000.0,
"end_asset_krw": 440064.0
},
{
"month": "2025-07",
"pnl_pct": 60.89,
"start_asset_krw": 1127825.0,
"end_asset_krw": 1814584.0
"start_asset_krw": 440064.0,
"end_asset_krw": 708031.0
},
{
"month": "2025-08",
"pnl_pct": 22.9,
"start_asset_krw": 1814584.0,
"end_asset_krw": 2230083.0
"start_asset_krw": 708031.0,
"end_asset_krw": 870154.0
},
{
"month": "2025-09",
"pnl_pct": 57.63,
"start_asset_krw": 2230083.0,
"end_asset_krw": 3515283.0
"pnl_pct": 58.24,
"start_asset_krw": 870154.0,
"end_asset_krw": 1376957.0
},
{
"month": "2025-10",
"pnl_pct": 9.29,
"start_asset_krw": 3515283.0,
"end_asset_krw": 3842010.0
"pnl_pct": 1.41,
"start_asset_krw": 1376957.0,
"end_asset_krw": 1396376.0
},
{
"month": "2025-11",
"pnl_pct": 11.24,
"start_asset_krw": 3842010.0,
"end_asset_krw": 4273771.0
"pnl_pct": 19.55,
"start_asset_krw": 1396376.0,
"end_asset_krw": 1669367.0
},
{
"month": "2025-12",
"pnl_pct": -0.87,
"start_asset_krw": 4273771.0,
"end_asset_krw": 4236421.0
"pnl_pct": -1.53,
"start_asset_krw": 1669367.0,
"end_asset_krw": 1643749.0
},
{
"month": "2026-01",
"pnl_pct": 33.77,
"start_asset_krw": 4236421.0,
"end_asset_krw": 5666889.0
"pnl_pct": 28.68,
"start_asset_krw": 1643749.0,
"end_asset_krw": 2115197.0
},
{
"month": "2026-02",
"pnl_pct": 15.61,
"start_asset_krw": 5666889.0,
"end_asset_krw": 6551242.0
"pnl_pct": 20.21,
"start_asset_krw": 2115197.0,
"end_asset_krw": 2542690.0
},
{
"month": "2026-03",
"pnl_pct": 9.12,
"start_asset_krw": 6551242.0,
"end_asset_krw": 7148390.0
"pnl_pct": 9.7,
"start_asset_krw": 2542690.0,
"end_asset_krw": 2789334.0
},
{
"month": "2026-04",
"pnl_pct": 22.85,
"start_asset_krw": 7148390.0,
"end_asset_krw": 8782116.0
"pnl_pct": 22.86,
"start_asset_krw": 2789334.0,
"end_asset_krw": 3426893.0
},
{
"month": "2026-05",
"pnl_pct": 47.57,
"start_asset_krw": 8782116.0,
"end_asset_krw": 12959660.0
"pnl_pct": 44.66,
"start_asset_krw": 3426893.0,
"end_asset_krw": 4957419.0
}
],
"hybrid_portfolio_wf_summary": {
"months": 12,
"positive_months": 11,
"positive_ratio": 0.9167,
"mean_pnl_pct": 25.23
"mean_pnl_pct": 24.8
},
"primary_sizing": "hybrid",
"sim_primary": {
"initial_cash_krw": 1000000,
"final_asset_krw": 12473032.0,
"pnl_krw": 11473032.0,
"pnl_pct": 1147.3,
"total_fees_krw": 710297.0,
"cash_krw": 0.0,
"holding_qty": 25611.975633,
"holding_value_krw": 12473032.0,
"initial_cash_krw": 400000,
"final_asset_krw": 4867465.0,
"pnl_krw": 4467465.0,
"pnl_pct": 1116.87,
"total_fees_krw": 277183.0,
"cash_krw": 3.0,
"holding_qty": 9994.789459,
"holding_value_krw": 4867462.0,
"mark_price": 487.0,
"fee_rate": 0.0005,
"trade_count": 5225,
"max_drawdown_pct": 19.22,
"peak_asset_krw": 1174413.0,
"trough_asset_krw": 948744.0,
"max_drawdown_pct": 19.89,
"peak_asset_krw": 3104956.0,
"trough_asset_krw": 2487267.0,
"sizing_mode": "primary_hybrid_dd_tier",
"sizing_note": "권장: monitor + past-leg·drawdown tier (검증 통과, 미래 미사용)",
"alloc_stats": {
"buy_executed": 1632,
"buy_skipped": 655,
"buy_executed": 1628,
"buy_skipped": 659,
"sell_executed": 2938,
"sell_skipped": 0,
"buy_total_krw": 710442254.0,
"large_leg_count": 1535,
"large_tier_buy_count": 1535,
"buy_amount_avg_krw": 435320.0,
"buy_amount_min_krw": 828.0,
"buy_amount_max_krw": 8620153.0
"buy_total_krw": 277244801.0,
"large_leg_count": 1532,
"large_tier_buy_count": 1532,
"buy_amount_avg_krw": 170298.0,
"buy_amount_min_krw": 323.0,
"buy_amount_max_krw": 3363487.0
},
"input_fires": 5225
},
"gt_capture_ratio": 0.0174,
"gt_pnl_pct": 4291.35,
"sim_sized_pnl_pct": 74.69,
"gt_model_capture_ratio": 0.0019,
"causal_gt_capture_ratio": 0.0034,
"sim_causal_gt_pnl_pct": 14.79,
"causal_hybrid_capture_ratio": 0.2674,
"sim_causal_hybrid_pnl_pct": 1147.3,
"tier_enhanced_capture_ratio": -0.0119,
"sim_tier_enhanced_pnl_pct": -51.26,
"gt_capture_ratio": 0.0052,
"gt_pnl_pct": 7038.74,
"sim_sized_pnl_pct": 36.56,
"gt_model_capture_ratio": 0.0006,
"causal_gt_capture_ratio": 0.0021,
"sim_causal_gt_pnl_pct": 14.99,
"causal_hybrid_capture_ratio": 0.1587,
"sim_causal_hybrid_pnl_pct": 1116.87,
"tier_enhanced_capture_ratio": -0.0059,
"sim_tier_enhanced_pnl_pct": -41.83,
"causal_gt_params": {
"peak_mode": "local",
"pivot_order": 8,
@@ -746,28 +746,28 @@
"observed_implied_scale": {
"all": {
"count": 18,
"mean": 0.1106,
"median": 0.0527,
"p25": 0.051,
"p75": 0.054
"mean": 0.3111,
"median": 0.1346,
"p25": 0.1309,
"p75": 0.1509
},
"large_leg": {
"count": 1,
"mean": 1.0812,
"median": 1.0812,
"p25": 1.0812,
"p75": 1.0812
"mean": 3.2206,
"median": 3.2206,
"p25": 3.2206,
"p75": 3.2206
},
"small_leg": {
"count": 17,
"mean": 0.0535,
"median": 0.051,
"p25": 0.051,
"p75": 0.0539
"mean": 0.14,
"median": 0.1323,
"p25": 0.1309,
"p75": 0.1502
}
},
"recommended_pct_large_leg": 1.0812,
"recommended_pct_small_leg": 0.051,
"recommended_pct_large_leg": 3.2206,
"recommended_pct_small_leg": 0.1323,
"note": "implied_scale = amount / (pre_buy_total_asset × weight_share); 시뮬 tier는 GT 분석 median 사용"
},
"causal_mode": {
@@ -1499,15 +1499,15 @@
],
"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,
"gt_final_asset_krw": 28785435.0,
"subset_final_asset_krw": 400000.0,
"asset_ratio": 0.0139,
"asset_accuracy_pct": 1.39,
"target_met_90": false,
"legs_total": 76,
"legs_covered": 0,
"leg_coverage_ratio": 0.0,
"full_pnl_pct": 4291.35,
"full_pnl_pct": 7096.36,
"subset_pnl_pct": 0.0
},
"note": "캘리브레이션 미실행 — scripts/04_calibrate_gt_assets.py"

View File

@@ -1,6 +1,6 @@
# DeepCoin 배포 체크리스트 (C → B)
- **목표:** 초기 ₩1,000,000 → **+1,000% 이상** (인과적 hybrid primary 경로)
- **목표:** 초기 ₩400,000 (`GT_INITIAL_CASH_KRW`)**+1,000% 이상** (인과적 hybrid primary 경로)
- **일정:** **금요일까지 Phase C** (알림·dry-run 사전 테스트) → **토요일부터 Phase B-1** (소액 실거래)
- **기준일:** 2026-06-01 (월) 작성 · C 종료 2026-06-05 (금) · B-1 시작 2026-06-06 (토)
@@ -111,12 +111,15 @@ Phase B-2 (검증 후) sim에 근접한 한도 · +1000% 경로 추격 (리스
`.env`에 아래를 적용하세요. 전체 예시는 `docs/05_ops/env.recommended.md` 참고.
```env
# === Phase C: 알림만 (금~금) ===
# === Phase C: dry-run (금~금, 시뮬 정합) ===
LIVE_TRADING_ENABLED=0
GT_SIGNAL_CAUSAL=1
SIM_PRIMARY_SIZING=auto
MONITOR_ALERT_COOLDOWN_MIN=180
MONITOR_ALERT_COOLDOWN_MIN=3
MONITOR_LOOP_SLEEP_SEC=180
LIVE_DAILY_KRW_MAX=4000000
LIVE_MAX_TRADES_PER_DAY=999
LIVE_COOLDOWN_MIN=3
```
### 4.2 매일 실행
@@ -171,17 +174,17 @@ GT_SIGNAL_CAUSAL=1
SIM_PRIMARY_SIZING=auto
# hybrid tier: large 구간 일부 체결 가능, sim보다 보수적
LIVE_ORDER_KRW=100000
LIVE_DAILY_KRW_MAX=1000000
LIVE_ORDER_KRW=40000
LIVE_DAILY_KRW_MAX=400000
LIVE_MAX_TRADES_PER_DAY=15
LIVE_COOLDOWN_MIN=180
LIVE_DAILY_LOSS_LIMIT_KRW=100000
LIVE_COOLDOWN_MIN=3
LIVE_DAILY_LOSS_LIMIT_KRW=40000
LIVE_SLIPPAGE_PCT=0.05
```
| 변수 | B-1 값 | 의미 |
|------|--------|------|
| `LIVE_DAILY_KRW_MAX` | **1,000,000** | 일 100만 (sim full tier보다 낮음) |
| `LIVE_DAILY_KRW_MAX` | **400,000** | 일 40만 (초기 1배, sim full tier보다 낮음) |
| `LIVE_DAILY_LOSS_LIMIT_KRW` | **100,000** | 일 -10만 시 당일 중단 |
| `LIVE_MAX_TRADES_PER_DAY` | 15 | sim 거래 빈도 대비 여유 |

View File

@@ -28,6 +28,15 @@ GT_BUY_PCT_SMALL_LEG=0.05
GT_BUY_PCT_MEDIUM_LEG=0.25
GT_LARGE_LEG_TOP_PCT=0.2
GT_MIN_ORDER_KRW=5000
# 시뮬·GT·paper·live hybrid 배분 공통 초기 자금
GT_INITIAL_CASH_KRW=400000
# 원화 한도 비율 (초기 40만 기준, 100만 시대 대비 ×0.4)
# | 변수 | 비율 | 값 |
# | MONITOR_ALERT_KRW_AMOUNT, LIVE_ORDER_KRW | ×10% | 40,000 |
# | LIVE_DAILY_LOSS_LIMIT_KRW (Phase C) | ×5% | 20,000 |
# | LIVE_DAILY_KRW_MAX (Phase C) | ×10 | 4,000,000 |
# | LIVE_DAILY_KRW_MAX (B-1) | ×1 | 400,000 |
# monitor 규칙 (04 matched_rules — 코드에서 로드, env 변경 불필요)
MATCH_MONITOR_MAX_PER_SIDE=1
@@ -47,22 +56,36 @@ SIM_TIER_CONVICTION_DD_PCT=10.0
# === Phase C ===
LIVE_TRADING_ENABLED=0
# 05 알림
MONITOR_ALERT_COOLDOWN_MIN=180
MONITOR_ALERT_KRW_AMOUNT=100000
# 05 알림 · 06 루프 — 3분봉 1주기(180초)
MONITOR_ALERT_COOLDOWN_MIN=3
MONITOR_ALERT_KRW_AMOUNT=40000
MONITOR_LOOP_SLEEP_SEC=180
# 06 dry-run (C에서도 06 --once 가능, 주문 없음)
LIVE_ORDER_KRW=100000
LIVE_DAILY_KRW_MAX=300000
LIVE_COOLDOWN_MIN=180
LIVE_MAX_TRADES_PER_DAY=10
LIVE_DAILY_LOSS_LIMIT_KRW=50000
# 06 dry-run (시뮬 정합: 일한도·거래횟수 무제한, 쿨다운=봉간격 3분)
# LIVE=0 + paper 모드 시 06은 _can_trade에서 LIVE 한도 검사 생략.
LIVE_ORDER_KRW=40000
LIVE_DAILY_KRW_MAX=4000000
LIVE_COOLDOWN_MIN=3
LIVE_MAX_TRADES_PER_DAY=999
LIVE_DAILY_LOSS_LIMIT_KRW=20000
LIVE_SLIPPAGE_PCT=0.05
LIVE_BUY_PCT_LARGE=1.0
LIVE_BUY_PCT_SMALL=0.05
```
| 항목 | Phase C 값 | 설명 |
|------|------------|------|
| `GT_INITIAL_CASH_KRW` | **400,000** | 시뮬·GT·paper·06 배분 시작 자금 |
| `MONITOR_ALERT_KRW_AMOUNT` | **40,000** | 초기 자금의 10% (알림 참고) |
| `LIVE_ORDER_KRW` | **40,000** | fallback·참고 (실매수는 hybrid 산출) |
| `LIVE_DAILY_KRW_MAX` | **4,000,000** | 초기×10 — Phase C hybrid 전액 매수 여유 |
| `LIVE_DAILY_LOSS_LIMIT_KRW` | **20,000** | 초기×5% — 일 손실 중단 |
| `LIVE_MAX_TRADES_PER_DAY` | 999 | 분할 매수·매도 횟수 제한 없음 |
| `LIVE_COOLDOWN_MIN` | **3** | 규칙별 최소 1봉(3분) — 시뮬 발화 간격과 동일 |
| `MONITOR_ALERT_COOLDOWN_MIN` | **3** | 동일 규칙 텔레그램도 1봉당 1회 수준 |
| `MONITOR_LOOP_SLEEP_SEC` | **180** | 06/05 루프 주기 = 3분 |
| `MATCH_LIVE_CACHE_SEC` | **180** | `live_eval` 캐시 ≤ 루프 주기 (06은 `force_refresh` 사용) |
### Phase C 확인 명령
```bash
@@ -82,25 +105,25 @@ python scripts/06_execute_live.py --once
# === Phase B-1 ===
LIVE_TRADING_ENABLED=1
LIVE_ORDER_KRW=100000
LIVE_DAILY_KRW_MAX=1000000
LIVE_ORDER_KRW=40000
LIVE_DAILY_KRW_MAX=400000
LIVE_MAX_TRADES_PER_DAY=15
LIVE_COOLDOWN_MIN=180
LIVE_DAILY_LOSS_LIMIT_KRW=100000
LIVE_COOLDOWN_MIN=3
LIVE_DAILY_LOSS_LIMIT_KRW=40000
LIVE_SLIPPAGE_PCT=0.05
LIVE_BUY_PCT_LARGE=1.0
LIVE_BUY_PCT_SMALL=0.05
MONITOR_ALERT_COOLDOWN_MIN=180
MONITOR_ALERT_COOLDOWN_MIN=3
MONITOR_LOOP_SLEEP_SEC=180
```
| 항목 | 값 | 설명 |
|------|-----|------|
| 초기 자금 | ₩1,000,000 | 빗썸 가용 KRW |
| 일 매수 한도 | ₩1,000,000 | large tier 일부 가능, sim(무한)보다 보수 |
| 일 손실 중단 | ₩100,000 | -10% 일손실 시 당일 추가 주문 중단 |
| 1회 참고 | ₩100,000 | 매도 시 참고; **매수는 hybrid tier가 산출** |
| 초기 자금 | ₩400,000 | 빗썸 가용 KRW (`GT_INITIAL_CASH_KRW`) |
| 일 매수 한도 | ₩400,000 | 초기 1배 — large tier 1회분 |
| 일 손실 중단 | ₩40,000 | 초기 10% |
| 1회 참고 | ₩40,000 | 알림·fallback; **매수는 hybrid tier** |
### B-1 오픈 당일
@@ -120,11 +143,11 @@ python scripts/06_execute_live.py
# === Phase B-2 ===
LIVE_TRADING_ENABLED=1
LIVE_ORDER_KRW=100000
LIVE_DAILY_KRW_MAX=5000000
LIVE_ORDER_KRW=40000
LIVE_DAILY_KRW_MAX=2000000
LIVE_MAX_TRADES_PER_DAY=30
LIVE_COOLDOWN_MIN=120
LIVE_DAILY_LOSS_LIMIT_KRW=300000
LIVE_COOLDOWN_MIN=3
LIVE_DAILY_LOSS_LIMIT_KRW=120000
LIVE_SLIPPAGE_PCT=0.05
LIVE_BUY_PCT_LARGE=1.0
LIVE_BUY_PCT_SMALL=0.05
@@ -132,7 +155,7 @@ LIVE_BUY_PCT_SMALL=0.05
| sim 대비 | B-1 | B-2 |
|----------|-----|-----|
| 일한도 | 100만 | 500만 |
| 일한도 | 40만 | 200만 |
| large tier 1회 ~100% | 종종 스킵 | 대부분 가능 |
| +1000% 가능성 | 낮음 | sim에 근접 (보장 없음) |

View File

@@ -1,6 +1,6 @@
# Live Phase A — dry-run 검증
- 일시: 2026-06-01 23:17:30
- 일시: 2026-06-01 23:36:56
- 결과: **PASS**
## Plan (목적)
@@ -25,53 +25,10 @@ python scripts/06_execute_live.py --once
## Act (다음 단계)
1. ~~`LIVE_TRADING_ENABLED=1`~~ **적용 완료 (Phase B-1, 2026-06-01)**
2. `06_execute_live.py` 상시 루프 기동 (180초 주기)
1. `05_run_monitor.py` 1~2일 병행 (알림만)
2. `.env` 파일럿 한도 확정 후 `LIVE_TRADING_ENABLED=1`
3. 1~2주 실계좌 PnL·슬리피지 기록 (본 문서 갱신)
## Phase C dry-run (지금 ~ 금요일 저녁)
| 항목 | 값 |
|------|-----|
| `LIVE_TRADING_ENABLED` | **0** (실주문 없음) |
| 실행 | `python scripts/06_execute_live.py` (180초 주기) |
| 발화 로그 | `data/ops/paper_fires.jsonl` |
| 금요일 집계 | `python scripts/07_phase_c_paper_report.py` |
### 수익률 확인 (중요)
| 종류 | 가능? |
|------|-------|
| **실계좌 수익률** | **불가** (주문 없음) |
| **모의 forward %** | **가능** (07 스크립트, 발화 후 N봉 가격 기준 **참고용**) |
| **시뮬 hybrid +1,147%** | 과거 1년 백테스트, 이번 주 결과와 **별개** |
금요일 C Go 후 토요일~ **B-1**: `.env`에서 `LIVE_TRADING_ENABLED=1`, `LIVE_DAILY_KRW_MAX=1000000`
### 일별 기록
| 날짜 | download | verify | 06 dry | buy 발화 | sell 발화 | 메모 |
|------|----------|--------|--------|----------|-----------|------|
| 6/1 | | PASS | | | | |
| 6/2 | | | | | | |
| 6/3 | | | | | | |
| 6/4 | | | | | | |
| 6/5 | | | | | | **C Go → B-1** |
---
## Phase B-1 (금요일 이후 예정)
| 항목 | 값 |
|------|-----|
| `LIVE_TRADING_ENABLED` | 1 |
| `LIVE_DAILY_KRW_MAX` | 1,000,000 |
| `LIVE_DAILY_LOSS_LIMIT_KRW` | 100,000 |
| `06 --once` | live=ON, 발화 없음 |
| 배분 | hybrid primary (`enhanced=False`) |
**선행 조치:** `coin` 환경에 `pip install python-dotenv` (`.env` 미적용 방지). `scripts/_bootstrap.py`·`config.py``load_project_env(override=True)`.
## Kill switch
- `LIVE_TRADING_ENABLED=0` + 06 프로세스 중지

View File

@@ -0,0 +1,35 @@
# Live Phase A — dry-run 검증
- 일시: 2026-06-02 22:17:49
- 결과: **PASS**
## Plan (목적)
- hybrid primary(`enhanced=False`) live_trader 경로가 시뮬과 정합인지 확인
- conviction tier(`enhanced=True`) 미사용 확인
- 실거래 한도가 hybrid tier와 어떻게 상호작용하는지 기록
## Do (실행)
```bash
python scripts/06_verify_live_dryrun.py
python scripts/06_execute_live.py --once
```
## Check (점검 결과)
- GT_SIGNAL_CAUSAL=True
- LIVE_TRADING_ENABLED=False
- monitor_rules: buy_compound_tight, sell_mtf_cross_all_tf
- hybrid DD: {'dd_large_pct': 5.0, 'dd_medium_pct': 2.0}
## Act (다음 단계)
1. `05_run_monitor.py` 1~2일 병행 (알림만)
2. `.env` 파일럿 한도 확정 후 `LIVE_TRADING_ENABLED=1`
3. 1~2주 실계좌 PnL·슬리피지 기록 (본 문서 갱신)
## Kill switch
- `LIVE_TRADING_ENABLED=0` + 06 프로세스 중지
- 빗썸 앱 수동 청산

View File

@@ -0,0 +1,39 @@
# Live Phase A — dry-run 검증
- 일시: 2026-06-03 08:50:59
- 결과: **WARN**
## Plan (목적)
- 06 dry-run/live 체결이 `hybrid_sim_execution`(sim_causal_hybrid)과 정합인지 확인
- conviction tier(`enhanced=True`) 미사용 확인
- 실거래 한도가 hybrid tier와 어떻게 상호작용하는지 기록
## Do (실행)
```bash
python scripts/06_verify_live_dryrun.py
python scripts/06_execute_live.py --once
```
## Check (점검 결과)
- GT_SIGNAL_CAUSAL=True
- LIVE_TRADING_ENABLED=False
- monitor_rules: buy_compound_tight, sell_mtf_cross_all_tf
- hybrid DD: {'dd_large_pct': 5.0, 'dd_medium_pct': 2.0}
### 이슈
- paper_portfolio.json 과 sim replay 불일치 — signal_history 갱신 후 06 --once 1회 권장
## Act (다음 단계)
1. `05_run_monitor.py` 1~2일 병행 (알림만)
2. `.env` 파일럿 한도 확정 후 `LIVE_TRADING_ENABLED=1`
3. 1~2주 실계좌 PnL·슬리피지 기록 (본 문서 갱신)
## Kill switch
- `LIVE_TRADING_ENABLED=0` + 06 프로세스 중지
- 빗썸 앱 수동 청산

View File

@@ -12,7 +12,7 @@ dry-run(Phase C)과 실거래(Phase B) 모두 **시뮬 `sim_primary` = `sim_caus
| 배분 | hybrid DD tier + past-leg, **`enhanced=False`** |
| 금지 | `sim_tier_enhanced` (conviction), GT oracle 타점 |
코드: `deepcoin/ops/live_trader.py` (`GT_SIGNAL_CAUSAL=1``plan_buy_amount_krw(..., enhanced=False)`)
코드: `deepcoin/ops/hybrid_sim_execution.py` (`build_monitor_hybrid_sized_trades`, `enhanced=False`)`live_trader.py`
## Phase C — dry-run (주문 없음, 3단계 전)
@@ -32,8 +32,9 @@ python scripts/05_run_monitor.py # 텔레그램 알림 (상시)
python scripts/06_execute_live.py --once # dry_run 로그만 (선택)
```
- 06은 발화 시 `dry_run (LIVE_TRADING_ENABLED=0)` 기록, **API 매수·매도 호출 없음**
- 잔고 조회는 알림·tier 계산용으로 API를 쓸 수 있음
- 06은 발화 시 **모의 계좌**(`paper_portfolio.json`)갱신, **빗썸 API 주문 없음**
- 체결 배분은 시뮬과 동일하게 `signal_history` 전체를 `replay_paper_portfolio`로 재생
- 구버전 paper는 `paper_fires.jsonl``would_trade=true`로 이력 복원 가능
상세: [DEPLOYMENT_CHECKLIST.md](../05_ops/DEPLOYMENT_CHECKLIST.md) §4 · [env.recommended.md](../05_ops/env.recommended.md) Phase C
@@ -65,27 +66,34 @@ python scripts/06_execute_live.py # 상시
| `LIVE_TRADING_ENABLED` | 0 | 1 | 1일 때만 실주문 |
| `GT_SIGNAL_CAUSAL` | 1 | 1 | hybrid sizing |
| `SIM_PRIMARY_SIZING` | auto | auto | primary=hybrid |
| `LIVE_ORDER_KRW` | 100000 | 100000 | 매도·비-hybrid fallback 참고 |
| `LIVE_DAILY_KRW_MAX` | 300000 | 1,000,000 | **sim 대비 체결 상한** |
| `LIVE_COOLDOWN_MIN` | 180 | 180 | 규칙별 재주문 간격 |
| `LIVE_MAX_TRADES_PER_DAY` | 10 | 10 | 일 최대 시도 |
| `LIVE_DAILY_LOSS_LIMIT_KRW` | 50000 | 50000 | 일 손실 한도 |
| `MONITOR_LOOP_SLEEP_SEC` | 180 | 180 | 05/06 루프 주기 |
| `MONITOR_ALERT_COOLDOWN_MIN` | 180 | 180 | 텔레그램 중복 방지 |
| `GT_INITIAL_CASH_KRW` | **400000** | **400000** | 시뮬·paper·hybrid 배분 시작 자금 |
| `LIVE_ORDER_KRW` | **40000** | **40000** | 초기×10% · fallback 참고 |
| `MONITOR_ALERT_KRW_AMOUNT` | **40000** | **40000** | 알림 참고(초기×10%) |
| `LIVE_DAILY_KRW_MAX` | **4000000** (초기×10) | **400000** | C: hybrid 여유 · B-1: 1일 1배 |
| `LIVE_DAILY_LOSS_LIMIT_KRW` | **20000** | **40000** | C: 초기×5% · B-1: ×10% |
| `LIVE_COOLDOWN_MIN` | **3** (1봉) | **3** | `MATCH_PRIMARY_INTERVAL`과 동일 |
| `LIVE_MAX_TRADES_PER_DAY` | **999** (시뮬 정합) | 15 | C: 횟수 제한 없음 |
| `MONITOR_LOOP_SLEEP_SEC` | 180 | 180 | 루프 3분 = 3분봉 주기 |
| `MATCH_LIVE_CACHE_SEC` | **180** | **180** | live_eval 캐시 ≤ 루프 주기 |
| `MONITOR_ALERT_COOLDOWN_MIN` | **3** (1봉) | **3** | 규칙당 알림 최소 간격 |
Phase별 전체 블록: [env.recommended.md](../05_ops/env.recommended.md)
## 주문·배분 동작
- **매수:** EV/WF 통과 규칙만 hybrid tier 원화 산출 → `_can_trade` (일한도·쿨다운) → 시장가 매수
- **매:** 보유 WLD 전량 기준 시장가 매도 (`LIVE_ORDER_KRW`는 매도 경로에서 수량 우선)
- **스킵:** 현금 부족, 일한도, hybrid planned > `LIVE_DAILY_KRW_MAX`, 미승인 규칙
- **공통:** 발화 이력 → `size_monitor_signals` / `replay_paper_portfolio` (시뮬 `sim_causal_hybrid`와 동일)
- **매:** EV/WF 통과 규칙만 → `_can_trade` (live: 일한도·3분 쿨다운 / dry-run: 쿨다운만) → planned `amount_krw` 시장가 매수
- **매도:** 시뮬 분할 `sell_qty` (leg 마지막 매도는 잔량 전량) → 시장가 매도
- **스킵:** 시뮬 배분 0, 보유 없음, 일한도, 미승인 규칙, 규칙 쿨다운(3분)
## 로그
| 경로 | 내용 |
|------|------|
| `data/ops/live_trades.jsonl` | 06 주문·dry-run 시도 (JSONL) |
| `data/ops/live_trades.jsonl` | 06 주문 (JSONL) |
| `data/ops/paper_fires.jsonl` | Phase C 모의 체결 시도 |
| `data/ops/paper_portfolio.json` | dry-run 모의 잔고·`signal_history` |
| `data/ops/live_signal_history.json` | live 발화 이력 (시뮬 배분용) |
| `docs/05_ops/live_verification_*.md` | Phase C/B 일별 기록 |
## 4단계 연결

View File

@@ -24,7 +24,7 @@
| Phase | `LIVE_TRADING_ENABLED` | 일한도 예 | 비고 |
|-------|------------------------|-----------|------|
| C (dry-run) | 0 | 30만 (dry-run 참고) | 주문 없음 |
| B-1 | 1 | 100만 | sim 대비 보수 |
| B-1 | 1 | 40만 | sim 대비 보수 (초기=GT_INITIAL_CASH_KRW) |
| B-2 | 1 | 500만+ | B-1 검증 후만 |
본인 자금·위험 성향에 맞게 **반드시** 낮춰 시작한다.