ee3e799de1
주요 변경: - tools/build_rebalance_engine_v1.py: REBALANCE_ENGINE_V1 신규 * account_snapshot 직접 합산(_build_snap_position_map) → 소수주 분리 행 병합 * 레짐 소스 macro.REGIME_PRELIM 최우선 (GAS 와 동일) - src/gas_adapter_parts/gdf_06_rebalance.gs: runRebalanceSheet_() 신규 * Logger.log / getSpreadsheet_() 로 run_all 연동 수정 - src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs * _mergePositionRecord_(): 소수주 중복 행 합산 신규 * parseInt → parseFloat (qty, availQty) - src/gas_adapter_parts/gdf_01_price_metrics.gs * 미보유 종목 SELL_READY → WATCH_EXIT_SIGNAL - spec/41_release_dag.yaml: build_rebalance_sheet 노드 추가 (step_count 63) - spec/51_formula_lifecycle_registry.yaml: REBALANCE_ENGINE_V1 등록 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3211 lines
96 KiB
YAML
3211 lines
96 KiB
YAML
golden_cases_v2:
|
||
- formula_id: TICK_NORMALIZER_V1
|
||
gas_function: tickNormalize_
|
||
gas_file: gas_lib.gs
|
||
python_function: compute_formula_outputs.normalize_tick
|
||
cases:
|
||
- id: tick_exact_multiple
|
||
description: 정확한 배수 — 양측 동일 기대
|
||
inputs:
|
||
price: 185300
|
||
expected:
|
||
normalized: 185300
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:TICK_NORMALIZER_V1 tick_table
|
||
note: 185300 < 200000 → tick=100, 185300÷100=1853.0 exact → floor=round=1853 ×
|
||
100 = 185300
|
||
- id: tick_floor_vs_round_diverge_1
|
||
description: 비정확 배수 — GAS(floor)=14520, Python(round)=14530. spec_correct=14520(GAS)
|
||
inputs:
|
||
price: 14527
|
||
expected:
|
||
normalized: 14520
|
||
spec_correct: 14520
|
||
gas_expected: 14520
|
||
python_expected: 14530
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:TICK_NORMALIZER_V1
|
||
note: '14527 < 20000 → tick=10.
|
||
|
||
SPEC(floor): floor(14527/10)*10 = 1452*10 = 14520 (GAS 동작).
|
||
|
||
Python(round): round(14527/10)*10 = round(1452.7)*10 = 1453*10 = 14530.
|
||
|
||
[DIVERGENCE] Python은 1 tick 고가 출력 — HTS 입력 시 의도보다 높은 가격.
|
||
|
||
B06: Python normalize_tick을 math.floor 방식으로 수정 필요.
|
||
|
||
'
|
||
- id: tick_floor_vs_round_diverge_2
|
||
description: 비정확 배수 — GAS=3750, Python=3755. spec_correct=3750(GAS)
|
||
inputs:
|
||
price: 3753
|
||
expected:
|
||
normalized: 3750
|
||
spec_correct: 3750
|
||
gas_expected: 3750
|
||
python_expected: 3755
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:TICK_NORMALIZER_V1
|
||
note: '3753 >= 2000, < 5000 → tick=5.
|
||
|
||
SPEC(floor): floor(3753/5)*5 = 750*5 = 3750.
|
||
|
||
Python(round): round(3753/5)*5 = round(750.6)*5 = 751*5 = 3755.
|
||
|
||
[DIVERGENCE] 동일 패턴.
|
||
|
||
'
|
||
- id: tick_large_price
|
||
description: 500000원 이상 → tick=1000
|
||
inputs:
|
||
price: 550000
|
||
expected:
|
||
normalized: 550000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 550000 ÷ 1000 = 550 exact → 양측 동일
|
||
- formula_id: VELOCITY_V1
|
||
gas_function: inline_in_calcAntiLateEntryGateV2Impl_
|
||
gas_file: gas_apex_alpha_watch.gs
|
||
python_function: inline_in_compute_formula_outputs
|
||
cases:
|
||
- id: vel_positive
|
||
inputs:
|
||
close: 110000
|
||
prevClose: 100000
|
||
ret5d: 8.0
|
||
expected:
|
||
velocity_1d: 10.0
|
||
velocity_5d: 8.0
|
||
tolerance:
|
||
velocity_1d: 0.001
|
||
velocity_5d: 0.001
|
||
provenance: HAND_COMPUTED
|
||
note: (110000-100000)/100000*100 = 10.0%
|
||
- id: vel_negative
|
||
inputs:
|
||
close: 98000
|
||
prevClose: 100000
|
||
ret5d: -3.5
|
||
expected:
|
||
velocity_1d: -2.0
|
||
velocity_5d: -3.5
|
||
tolerance:
|
||
velocity_1d: 0.001
|
||
velocity_5d: 0.001
|
||
provenance: HAND_COMPUTED
|
||
note: (98000-100000)/100000*100 = -2.0%
|
||
- id: vel_zero
|
||
inputs:
|
||
close: 100000
|
||
prevClose: 100000
|
||
ret5d: 0.0
|
||
expected:
|
||
velocity_1d: 0.0
|
||
velocity_5d: 0.0
|
||
tolerance:
|
||
velocity_1d: 0.001
|
||
provenance: HAND_COMPUTED
|
||
- formula_id: PROFIT_LOCK_STAGE_V1
|
||
gas_function: null
|
||
gas_file: gas_data_feed.gs
|
||
python_function: compute_formula_outputs.classify_profit_lock_stage
|
||
cases:
|
||
- id: profit_apex_super
|
||
inputs:
|
||
profit_pct: 65.0
|
||
expected:
|
||
stage: APEX_SUPER
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: profit_pct=65 ≥ 60 → APEX_SUPER
|
||
- id: profit_apex_trailing
|
||
inputs:
|
||
profit_pct: 45.0
|
||
expected:
|
||
stage: APEX_TRAILING
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 40 ≤ 45 < 60 → APEX_TRAILING
|
||
- id: profit_lock_30
|
||
inputs:
|
||
profit_pct: 33.0
|
||
expected:
|
||
stage: PROFIT_LOCK_30
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: profit_lock_20
|
||
inputs:
|
||
profit_pct: 22.0
|
||
expected:
|
||
stage: PROFIT_LOCK_20
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: profit_lock_10
|
||
inputs:
|
||
profit_pct: 12.0
|
||
expected:
|
||
stage: PROFIT_LOCK_10
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: profit_breakeven
|
||
inputs:
|
||
profit_pct: 3.0
|
||
expected:
|
||
stage: BREAKEVEN_RATCHET
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 0 ≤ 3 < 10 → BREAKEVEN_RATCHET
|
||
- id: profit_normal
|
||
inputs:
|
||
profit_pct: -5.0
|
||
expected:
|
||
stage: NORMAL
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: -5 < 0 → NORMAL
|
||
- id: profit_gas_fix_note
|
||
description: "[B06 수정 완료 2026-05-30] GAS calcPrices_ 단계명이 spec 기준으로 정정됨:\n이전:\
|
||
\ PROFIT_LOCK_STAGE_50/30/20/10/NORMAL (임계값 50%/30%/20%/10%)\n이후: APEX_SUPER(60%)/APEX_TRAILING(40%)/PROFIT_LOCK_30(30%)/PROFIT_LOCK_20(20%)/\n\
|
||
\ PROFIT_LOCK_10(10%)/BREAKEVEN_RATCHET(0%)/NORMAL(<0%)\nGAS golden case는\
|
||
\ 아래 ANTI_LATE_ENTRY_GATE_V2 패턴으로 검증 (calcPrices_ 전체 실행 불가).\n"
|
||
- formula_id: ANTI_CHASING_VELOCITY_V1
|
||
gas_function: inline_gate1_of_calcAntiLateEntryGateV2Impl_
|
||
gas_file: gas_apex_alpha_watch.gs
|
||
python_function: compute_formula_outputs.compute_anti_chasing
|
||
cases:
|
||
- id: chase_block
|
||
inputs:
|
||
velocity_1d: 3.5
|
||
expected:
|
||
anti_chasing_verdict: BLOCK_CHASE
|
||
anti_chasing_velocity_status: BLOCKED
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 3.5 ≥ 3.0 → BLOCK_CHASE
|
||
- id: chase_block_boundary
|
||
inputs:
|
||
velocity_1d: 3.0
|
||
expected:
|
||
anti_chasing_verdict: BLOCK_CHASE
|
||
anti_chasing_velocity_status: BLOCKED
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 경계값 3.0 → BLOCK (>= 3.0 포함)
|
||
- id: chase_pullback
|
||
inputs:
|
||
velocity_1d: 2.0
|
||
expected:
|
||
anti_chasing_verdict: PULLBACK_WAIT
|
||
anti_chasing_velocity_status: WAIT
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 1.5 ≤ 2.0 < 3.0 → PULLBACK_WAIT
|
||
- id: chase_clear
|
||
inputs:
|
||
velocity_1d: 0.8
|
||
expected:
|
||
anti_chasing_verdict: CLEAR
|
||
anti_chasing_velocity_status: PASS
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- formula_id: PULLBACK_ENTRY_TRIGGER_V1
|
||
gas_function: null
|
||
gas_file: gas_data_feed.gs
|
||
python_function: compute_formula_outputs.compute_pullback_trigger
|
||
cases:
|
||
- id: pullback_above_zone
|
||
inputs:
|
||
close: 55000
|
||
ma20: 50000
|
||
atr20: 2000
|
||
expected:
|
||
pullback_entry_verdict: ABOVE_PULLBACK_ZONE
|
||
pullback_state: BLOCKED
|
||
pullback_entry_trigger_price: 49000
|
||
pullback_upper_band: 51500
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'trigger = floor(50000 - 0.5*2000) = floor(49000) = 49000 (tick=50, 49000÷50=980
|
||
exact)
|
||
|
||
upper_band = 50000*1.03 = 51500 (51500÷50=1030 exact)
|
||
|
||
close=55000 > 51500 → ABOVE_PULLBACK_ZONE
|
||
|
||
'
|
||
- id: pullback_in_zone
|
||
inputs:
|
||
close: 51000
|
||
ma20: 50000
|
||
atr20: 2000
|
||
expected:
|
||
pullback_entry_verdict: PULLBACK_ZONE
|
||
pullback_state: PASS
|
||
pullback_entry_trigger_price: 49000
|
||
pullback_upper_band: 51500
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: close=51000 ≤ 51500 → PULLBACK_ZONE
|
||
- formula_id: SELL_PRICE_SANITY_V1
|
||
gas_function: calcSellPriceSanityV2_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: compute_formula_outputs.check_sell_price_sanity
|
||
cases:
|
||
- id: sanity_price_inversion
|
||
inputs:
|
||
sell_limit_price: 290000
|
||
stop_loss_price: 291000
|
||
prev_close: 300000
|
||
expected:
|
||
sell_price_sanity_status: INVALID_PRICE_INVERSION
|
||
hts_allowed: false
|
||
shadow_ledger: true
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 290000 < 291000 → 가격 역전
|
||
- id: sanity_unrealistic_price
|
||
inputs:
|
||
sell_limit_price: 261000
|
||
stop_loss_price: 250000
|
||
prev_close: 200000
|
||
expected:
|
||
sell_price_sanity_status: INVALID_UNREALISTIC_PRICE
|
||
hts_allowed: false
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 200000*1.30=260000, 261000>260000 → 비현실 상한 초과
|
||
- id: sanity_invalid_tick
|
||
inputs:
|
||
sell_limit_price: 185350
|
||
stop_loss_price: 180000
|
||
prev_close: 200000
|
||
expected:
|
||
sell_price_sanity_status: INVALID_TICK
|
||
hts_allowed: false
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 185350 < 200000 → tick=100, 185350÷100=1853.5 → 나머지 50 → INVALID_TICK
|
||
- id: sanity_pass
|
||
inputs:
|
||
sell_limit_price: 186000
|
||
stop_loss_price: 180000
|
||
prev_close: 200000
|
||
expected:
|
||
sell_price_sanity_status: PASS
|
||
hts_allowed: true
|
||
shadow_ledger: false
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 186000 > 180000, 186000 < 260000, 186000÷100=1860 exact → PASS
|
||
- formula_id: ANTI_LATE_ENTRY_GATE_V2
|
||
gas_function: calcAntiLateEntryGateV2Impl_
|
||
gas_file: gas_apex_alpha_watch.gs
|
||
python_function: null
|
||
cases:
|
||
- id: aleg_gate1_block
|
||
description: GATE1 BLOCK — velocity_1d > 3%
|
||
inputs:
|
||
holdings:
|
||
- ticker: TEST
|
||
name: TEST
|
||
close: 103100
|
||
dfMap:
|
||
TEST:
|
||
prevClose: 100000
|
||
ma20: 100000
|
||
rsi14: 50
|
||
flowCredit: 0.4
|
||
volume: 1000000
|
||
avgVolume5d: 1000000
|
||
frg5d: 0
|
||
inst5d: 0
|
||
ret5d: 2.0
|
||
acGate: ''
|
||
expected:
|
||
gate1_status: BLOCK_CHASE
|
||
gate2_status: PASS
|
||
gate3_status: PASS
|
||
final_gate_status: BLOCK
|
||
entry_grade: F
|
||
velocity_1d: 3.1
|
||
dist_weighted_sum: 0.0
|
||
tolerance:
|
||
velocity_1d: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: (103100-100000)/100000*100 = 3.1% ≥ 3.0 → gate1=BLOCK_CHASE → finalGate=BLOCK
|
||
- id: aleg_gate2_block
|
||
description: GATE2 BLOCK — velocity_5d >= 8%
|
||
inputs:
|
||
holdings:
|
||
- ticker: TEST
|
||
name: TEST
|
||
close: 100500
|
||
dfMap:
|
||
TEST:
|
||
prevClose: 100000
|
||
ma20: 100000
|
||
rsi14: 50
|
||
flowCredit: 0.4
|
||
volume: 1000000
|
||
avgVolume5d: 1000000
|
||
frg5d: 0
|
||
inst5d: 0
|
||
ret5d: 9.0
|
||
acGate: ''
|
||
expected:
|
||
gate1_status: PASS
|
||
gate2_status: BLOCK_CHASE_5D
|
||
gate3_status: PASS
|
||
final_gate_status: BLOCK
|
||
entry_grade: F
|
||
velocity_1d: 0.5
|
||
velocity_5d: 9.0
|
||
tolerance:
|
||
velocity_1d: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: vel1d=0.5<1.5→PASS, vel5d=9.0>=8.0→BLOCK_CHASE_5D → finalGate=BLOCK
|
||
- id: aleg_gate3_block
|
||
description: GATE3 BLOCK — distWS >= 3.0 (frg5d+inst5d 모두 음수)
|
||
inputs:
|
||
holdings:
|
||
- ticker: TEST
|
||
name: TEST
|
||
close: 100500
|
||
dfMap:
|
||
TEST:
|
||
prevClose: 100000
|
||
ma20: 100000
|
||
rsi14: 50
|
||
flowCredit: 0.4
|
||
volume: 1000000
|
||
avgVolume5d: 1000000
|
||
frg5d: -100000
|
||
inst5d: -50000
|
||
ret5d: 1.0
|
||
acGate: ''
|
||
expected:
|
||
gate1_status: PASS
|
||
gate2_status: PASS
|
||
gate3_status: BLOCK_DISTRIBUTION
|
||
final_gate_status: BLOCK
|
||
entry_grade: F
|
||
dist_weighted_sum: 4.0
|
||
tolerance:
|
||
velocity_1d: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: frg5d<0→+2.0, inst5d<0→+2.0 → distWS=4.0 ≥ 3.0 → gate3=BLOCK_DISTRIBUTION
|
||
- id: aleg_all_pass_grade_a
|
||
description: All PASS + grade A 조건 (vel1d<0.5, MA20근접, flowCredit>=0.55)
|
||
inputs:
|
||
holdings:
|
||
- ticker: TEST
|
||
name: TEST
|
||
close: 50100
|
||
dfMap:
|
||
TEST:
|
||
prevClose: 50000
|
||
ma20: 50000
|
||
rsi14: 50
|
||
flowCredit: 0.6
|
||
volume: 1000000
|
||
avgVolume5d: 1000000
|
||
frg5d: 100000
|
||
inst5d: 50000
|
||
ret5d: 0.5
|
||
acGate: ''
|
||
expected:
|
||
gate1_status: PASS
|
||
gate2_status: PASS
|
||
gate3_status: PASS
|
||
final_gate_status: PASS
|
||
entry_grade: A
|
||
velocity_1d: 0.2
|
||
tolerance:
|
||
velocity_1d: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: 'vel1d=(50100-50000)/50000*100=0.2 < 0.5, close=50100≥ma20=50000, 50100≤50000*1.02=51000,
|
||
flowCredit=0.60≥0.55
|
||
|
||
→ grade A
|
||
|
||
'
|
||
- formula_id: DYNAMIC_HEAT_GATE_V1
|
||
gas_function: calcDynamicHeatThresholds_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: heat_event_shock
|
||
inputs:
|
||
regime: EVENT_SHOCK
|
||
expected:
|
||
hardBlock: 5.0
|
||
halve: 3.5
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: heat_risk_off
|
||
inputs:
|
||
regime: RISK_OFF
|
||
expected:
|
||
hardBlock: 7.0
|
||
halve: 5.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: heat_neutral
|
||
inputs:
|
||
regime: NEUTRAL
|
||
expected:
|
||
hardBlock: 10.0
|
||
halve: 7.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: heat_risk_on
|
||
inputs:
|
||
regime: RISK_ON
|
||
expected:
|
||
hardBlock: 12.0
|
||
halve: 8.5
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: heat_secular_leader
|
||
inputs:
|
||
regime: SECULAR_LEADER_RISK_ON
|
||
expected:
|
||
hardBlock: 13.0
|
||
halve: 9.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- formula_id: POSITION_SIZE_REGIME_SCALE_V1
|
||
gas_function: calcRegimeSizeScale_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: scale_event_shock
|
||
inputs:
|
||
regime: EVENT_SHOCK
|
||
expected:
|
||
scale: 0.25
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: scale_risk_off
|
||
inputs:
|
||
regime: RISK_OFF
|
||
expected:
|
||
scale: 0.5
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: scale_neutral
|
||
inputs:
|
||
regime: NEUTRAL
|
||
expected:
|
||
scale: 1.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: scale_risk_on
|
||
inputs:
|
||
regime: RISK_ON
|
||
expected:
|
||
scale: 1.1
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: scale_secular_leader
|
||
inputs:
|
||
regime: SECULAR_LEADER_RISK_ON
|
||
expected:
|
||
scale: 1.2
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- formula_id: REGIME_CASH_UPLIFT_V1
|
||
gas_function: calcRegimeCashUplift_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: uplift_event_shock
|
||
inputs:
|
||
regime: EVENT_SHOCK
|
||
mrsCashMinPct: 7
|
||
expected:
|
||
effective_min_pct: 20
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: max(7, 20) = 20
|
||
- id: uplift_risk_off
|
||
inputs:
|
||
regime: RISK_OFF
|
||
mrsCashMinPct: 12
|
||
expected:
|
||
effective_min_pct: 15
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: max(12, 15) = 15
|
||
- id: uplift_risk_on_mrs_wins
|
||
inputs:
|
||
regime: RISK_ON
|
||
mrsCashMinPct: 7
|
||
expected:
|
||
effective_min_pct: 7
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: RISK_ON regimeMin=5, max(7, 5) = 7 (MRS가 더 높음)
|
||
- id: uplift_neutral
|
||
inputs:
|
||
regime: NEUTRAL
|
||
mrsCashMinPct: 10
|
||
expected:
|
||
effective_min_pct: 10
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: NEUTRAL regimeMin=0, max(10, 0) = 10
|
||
- formula_id: DRAWDOWN_GUARD_V1
|
||
gas_function: calcDrawdownGuard_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: drawdown_normal
|
||
inputs:
|
||
consecutive_losses: 0
|
||
expected:
|
||
state: NORMAL
|
||
buy_scale: 1.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: drawdown_caution
|
||
inputs:
|
||
consecutive_losses: 2
|
||
expected:
|
||
state: CAUTION_BUY
|
||
buy_scale: 0.75
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: drawdown_reduce
|
||
inputs:
|
||
consecutive_losses: 3
|
||
expected:
|
||
state: REDUCE_BUY
|
||
buy_scale: 0.5
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: drawdown_no_buy
|
||
inputs:
|
||
consecutive_losses: 5
|
||
expected:
|
||
state: NO_BUY
|
||
buy_scale: 0.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: drawdown_no_buy_extreme
|
||
inputs:
|
||
consecutive_losses: 7
|
||
expected:
|
||
state: NO_BUY
|
||
buy_scale: 0.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- formula_id: POSITION_COUNT_LIMIT_V1
|
||
gas_function: calcPositionCountLimit_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: count_neutral_pass
|
||
inputs:
|
||
holdings_count: 8
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: PASS
|
||
max_count: 8
|
||
excess_count: 0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: count=8 = max=8 → NOT > 8 → PASS
|
||
- id: count_neutral_block
|
||
inputs:
|
||
holdings_count: 9
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: POSITION_COUNT_BLOCK
|
||
max_count: 8
|
||
excess_count: 1
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: count_risk_off_pass
|
||
inputs:
|
||
holdings_count: 6
|
||
marketRegime: RISK_OFF
|
||
expected:
|
||
gate_status: PASS
|
||
max_count: 6
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: count=6 = max=6 → NOT > 6 → PASS
|
||
- id: count_event_shock_block
|
||
inputs:
|
||
holdings_count: 7
|
||
marketRegime: EVENT_SHOCK
|
||
expected:
|
||
gate_status: POSITION_COUNT_BLOCK
|
||
max_count: 6
|
||
excess_count: 1
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- formula_id: CASH_FLOOR_V1
|
||
gas_function: calcCashFloor_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: cash_floor_pass_low_mrs
|
||
inputs:
|
||
mrsScore: 2
|
||
settlementCashPct: 8
|
||
expected:
|
||
minPct: 7
|
||
status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: mrsScore=2 ≤ 3 → minPct=7. 8 ≥ 7 → PASS
|
||
- id: cash_floor_trim_mid_mrs
|
||
inputs:
|
||
mrsScore: 5
|
||
settlementCashPct: 8
|
||
expected:
|
||
minPct: 10
|
||
status: TRIM_REQUIRED
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: mrsScore=5 ≤ 7 → minPct=10. 8 < 10 but 8 ≥ 10*0.7=7.0 → TRIM_REQUIRED
|
||
- id: cash_floor_hard_block
|
||
inputs:
|
||
mrsScore: 5
|
||
settlementCashPct: 5
|
||
expected:
|
||
minPct: 10
|
||
status: HARD_BLOCK
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: mrsScore=5 → minPct=10. 5 < 10*0.7=7.0 → HARD_BLOCK
|
||
- id: cash_floor_trim_high_mrs
|
||
inputs:
|
||
mrsScore: 8
|
||
settlementCashPct: 12
|
||
expected:
|
||
minPct: 15
|
||
status: TRIM_REQUIRED
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: mrsScore=8 ≤ 10 → minPct=15. 12 < 15 but 12 ≥ 15*0.7=10.5 → TRIM_REQUIRED
|
||
- formula_id: SEMICONDUCTOR_CLUSTER_GATE_V1
|
||
gas_function: calcSemiconductorClusterGate_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: cluster_pass_neutral
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 15.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 8.0
|
||
name: SK하이닉스
|
||
- ticker: '012450'
|
||
weightPct: 5.0
|
||
name: 기타
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: PASS
|
||
combined_pct: 23.0
|
||
cap_pct: 35.0
|
||
tolerance:
|
||
combined_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: NEUTRAL cap=35%. 23% < 35×0.80=28% warnThreshold → PASS
|
||
- id: cluster_warn_neutral
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 18.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 10.0
|
||
name: SK하이닉스
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: CLUSTER_OVERWEIGHT_WARN
|
||
combined_pct: 28.0
|
||
cap_pct: 35.0
|
||
tolerance:
|
||
combined_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: 28% >= 35×0.80=28(warn) but < 35(cap) → CLUSTER_OVERWEIGHT_WARN. 기존 BLOCK→WARN
|
||
완화.
|
||
- id: cluster_warn_risk_off
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 12.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 9.0
|
||
name: SK하이닉스
|
||
marketRegime: RISK_OFF
|
||
expected:
|
||
gate_status: CLUSTER_OVERWEIGHT_WARN
|
||
combined_pct: 21.0
|
||
cap_pct: 25.0
|
||
tolerance:
|
||
combined_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: RISK_OFF cap=25%. 21%>=25×0.80=20(warn) but <25(cap) → CLUSTER_OVERWEIGHT_WARN.
|
||
- id: cluster_block_risk_off_over_cap
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 17.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 9.0
|
||
name: SK하이닉스
|
||
marketRegime: RISK_OFF
|
||
expected:
|
||
gate_status: CLUSTER_BLOCK
|
||
combined_pct: 26.0
|
||
cap_pct: 25.0
|
||
tolerance:
|
||
combined_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: 'RISK_OFF: 26% >= cap(25%) AND isRiskOff → CLUSTER_BLOCK.'
|
||
- id: cluster_pass_risk_on_high
|
||
description: RISK_ON에서 40% → 신규 허용 (기존이면 BLOCK)
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 30.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 10.0
|
||
name: SK하이닉스
|
||
marketRegime: RISK_ON
|
||
expected:
|
||
gate_status: CLUSTER_OVERWEIGHT_WARN
|
||
combined_pct: 40.0
|
||
cap_pct: 45.0
|
||
tolerance:
|
||
combined_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: RISK_ON cap=45%. 40%>=45×0.80=36(warn) but <45(cap) → WARN. 반도체 주도 참여 허용.
|
||
- formula_id: PROFIT_RATCHET_TIERED_V2
|
||
gas_function: null
|
||
gas_file: gas_data_feed.gs
|
||
python_function: compute_formula_outputs.compute_trailing_stop_v2
|
||
cases:
|
||
- id: ratchet_apex_super
|
||
inputs:
|
||
profit_pct: 65.0
|
||
highest_close: 200000
|
||
atr20: 5000
|
||
ratchet_stop: 180000
|
||
average_cost: 120000
|
||
expected:
|
||
ratchet_stage_v2: APEX_SUPER
|
||
auto_trailing_stop_v2: 194000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'stage=APEX_SUPER(65>=60). raw=200000-1.2*5000=200000-6000=194000.
|
||
|
||
194000 > ratchet=180000 → max=194000.
|
||
|
||
tick: 194000 < 200000 → tick=100, 194000÷100=1940 exact → 194000.
|
||
|
||
'
|
||
- id: ratchet_apex_trailing
|
||
inputs:
|
||
profit_pct: 43.0
|
||
highest_close: 150000
|
||
atr20: 4000
|
||
ratchet_stop: 130000
|
||
average_cost: 105000
|
||
expected:
|
||
ratchet_stage_v2: APEX_TRAILING
|
||
auto_trailing_stop_v2: 144000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'stage=APEX_TRAILING(43>=40). raw=150000-1.5*4000=150000-6000=144000.
|
||
|
||
144000 > 130000 → max=144000.
|
||
|
||
tick: 144000 < 200000 → tick=100, 144000÷100=1440 exact → 144000.
|
||
|
||
'
|
||
- id: ratchet_profit_lock_30
|
||
inputs:
|
||
profit_pct: 32.0
|
||
highest_close: 100000
|
||
atr20: 3000
|
||
ratchet_stop: 88000
|
||
average_cost: 76000
|
||
expected:
|
||
ratchet_stage_v2: PROFIT_LOCK_30
|
||
auto_trailing_stop_v2: 94000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'stage=PROFIT_LOCK_30(32>=30). raw=100000-2.0*3000=94000.
|
||
|
||
94000 > 88000 → max=94000.
|
||
|
||
tick: 94000 < 200000 → tick=100, 94000÷100=940 exact → 94000.
|
||
|
||
'
|
||
- id: ratchet_normal_no_trailing
|
||
inputs:
|
||
profit_pct: 2.0
|
||
highest_close: 50000
|
||
atr20: 1000
|
||
ratchet_stop: null
|
||
average_cost: 49000
|
||
expected:
|
||
ratchet_stage_v2: BREAKEVEN_RATCHET
|
||
auto_trailing_stop_v2: null
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: BREAKEVEN_RATCHET(0<=2<10) → trailing=None
|
||
- formula_id: WIN_LOSS_STREAK_GUARD_V1
|
||
gas_function: calcWinLossStreakGuard_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: wlsg_edge_ok
|
||
inputs:
|
||
win_rate_30: 0.55
|
||
trades_used: 30
|
||
expected:
|
||
state: EDGE_OK
|
||
buy_scale: 1.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: win_rate=55% ≥ 45% → EDGE_OK, scale=1.0
|
||
- id: wlsg_edge_weak
|
||
inputs:
|
||
win_rate_30: 0.42
|
||
trades_used: 20
|
||
expected:
|
||
state: EDGE_WEAK
|
||
buy_scale: 0.75
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 0.40 ≤ 42% < 45% → EDGE_WEAK, scale=0.75
|
||
- id: wlsg_edge_degraded
|
||
inputs:
|
||
win_rate_30: 0.35
|
||
trades_used: 15
|
||
expected:
|
||
state: EDGE_DEGRADED
|
||
buy_scale: 0.5
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 0.30 ≤ 35% < 40% → EDGE_DEGRADED, scale=0.50
|
||
- id: wlsg_edge_critical
|
||
inputs:
|
||
win_rate_30: 0.25
|
||
trades_used: 12
|
||
expected:
|
||
state: EDGE_CRITICAL
|
||
buy_scale: 0.25
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: 25% < 30% → EDGE_CRITICAL, scale=0.25
|
||
- id: wlsg_insufficient
|
||
inputs:
|
||
win_rate_30: 0.6
|
||
trades_used: 8
|
||
expected:
|
||
state: INSUFFICIENT_HISTORY
|
||
buy_scale: 1.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: trades_used=8 < 10 → INSUFFICIENT_HISTORY
|
||
- formula_id: SINGLE_POSITION_WEIGHT_CAP_V1
|
||
gas_function: calcSinglePositionWeightCap_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: spwc_pass_neutral
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 18.0
|
||
name: 삼성전자
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 삼성전자 NEUTRAL cap=28%. 18% < 28% → PASS. 기존 20% cap → 28%로 완화.
|
||
- id: spwc_pass_neutral_leader
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 27.0
|
||
name: 삼성전자
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 삼성전자 27% < 28%(NEUTRAL cap) → PASS. 기존이면 22%>20%로 OVERWEIGHT_TRIM이었음.
|
||
- id: spwc_overweight_neutral
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 29.0
|
||
name: 삼성전자
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: OVERWEIGHT_TRIM
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 삼성전자 29% > 28%(NEUTRAL cap) → OVERWEIGHT_TRIM.
|
||
- id: spwc_overweight_risk_off
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 19.0
|
||
name: 삼성전자
|
||
marketRegime: RISK_OFF
|
||
expected:
|
||
gate_status: OVERWEIGHT_TRIM
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 삼성전자 RISK_OFF cap=18%. 19% > 18% → OVERWEIGHT_TRIM.
|
||
- id: spwc_pass_risk_off
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 17.0
|
||
name: 삼성전자
|
||
marketRegime: RISK_OFF
|
||
expected:
|
||
gate_status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 삼성전자 RISK_OFF cap=18%. 17% < 18% → PASS.
|
||
- id: spwc_pass_risk_on_leader
|
||
description: RISK_ON에서 40% 한도 — 기존 20% 대비 2배 허용
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 39.0
|
||
name: 삼성전자
|
||
marketRegime: RISK_ON
|
||
expected:
|
||
gate_status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 삼성전자 RISK_ON cap=40%. 39% < 40% → PASS. 반도체 주도 상승장 참여 허용.
|
||
- formula_id: REGIME_TRIM_GUIDANCE_V1
|
||
gas_function: calcRegimeTrimGuidance_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: trim_risk_on
|
||
inputs:
|
||
regime: RISK_ON
|
||
expected:
|
||
phase: ADVANCE
|
||
satellite_trim_pct_min: 0
|
||
satellite_trim_pct_max: 5
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: RISK_ON → ADVANCE 단계, 위성 감축 최소화
|
||
- id: trim_neutral
|
||
inputs:
|
||
regime: NEUTRAL
|
||
expected:
|
||
phase: PULLBACK_IN_UPTREND
|
||
satellite_trim_pct_min: 5
|
||
satellite_trim_pct_max: 10
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: trim_risk_off
|
||
inputs:
|
||
regime: RISK_OFF
|
||
expected:
|
||
phase: BREAKDOWN
|
||
satellite_trim_pct_min: 25
|
||
satellite_trim_pct_max: 50
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- id: trim_event_shock
|
||
inputs:
|
||
regime: EVENT_SHOCK
|
||
expected:
|
||
phase: BREAKDOWN
|
||
satellite_trim_pct_min: 25
|
||
satellite_trim_pct_max: 50
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: EVENT_SHOCK = RISK_OFF와 동일 BREAKDOWN 단계
|
||
- id: trim_secular_leader
|
||
inputs:
|
||
regime: SECULAR_LEADER_RISK_ON
|
||
expected:
|
||
phase: ADVANCE
|
||
satellite_trim_pct_min: 0
|
||
satellite_trim_pct_max: 5
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
- formula_id: HEAT_CONCENTRATION_ALERT_V1
|
||
gas_function: calcHeatConcentrationAlert_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: heat_concentrated
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
name: 삼성전자
|
||
avgCost: 280000
|
||
stopPrice: 250000
|
||
holdingQty: 100
|
||
- ticker: '000660'
|
||
name: SK하이닉스
|
||
avgCost: 200000
|
||
stopPrice: 180000
|
||
holdingQty: 50
|
||
totalHeatKrw: 4000000
|
||
expected:
|
||
gate: HEAT_CONCENTRATED
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: '005930 heatI=(280000-250000)*100=3,000,000. 3M/4M=75% ≥ 50% → HEAT_CONCENTRATED.
|
||
|
||
000660 heatI=(200000-180000)*50=1,000,000. 1M/4M=25% → PASS.
|
||
|
||
gate=HEAT_CONCENTRATED.
|
||
|
||
'
|
||
- id: heat_concentrated_by_second_holding
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
name: 삼성전자
|
||
avgCost: 280000
|
||
stopPrice: 270000
|
||
holdingQty: 100
|
||
- ticker: '000660'
|
||
name: SK하이닉스
|
||
avgCost: 200000
|
||
stopPrice: 185000
|
||
holdingQty: 100
|
||
totalHeatKrw: 2500000
|
||
expected:
|
||
gate: HEAT_CONCENTRATED
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: '005930 heatI=(280000-270000)*100=1,000,000. 1M/2.5M=40% < 50% → PASS.
|
||
|
||
000660 heatI=(200000-185000)*100=1,500,000. 1.5M/2.5M=60% ≥ 50% → HEAT_CONCENTRATED.
|
||
|
||
gate=HEAT_CONCENTRATED (000660 초과).
|
||
|
||
'
|
||
- id: heat_pass_equal
|
||
inputs:
|
||
holdings:
|
||
- ticker: A
|
||
name: A
|
||
avgCost: 100000
|
||
stopPrice: 90000
|
||
holdingQty: 100
|
||
- ticker: B
|
||
name: B
|
||
avgCost: 100000
|
||
stopPrice: 90000
|
||
holdingQty: 100
|
||
- ticker: C
|
||
name: C
|
||
avgCost: 100000
|
||
stopPrice: 90000
|
||
holdingQty: 100
|
||
totalHeatKrw: 3000000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: '각 heatI=(100000-90000)*100=1,000,000. 각 share=1M/3M=33.3% < 50% → 모두 PASS.
|
||
|
||
'
|
||
- formula_id: SECTOR_CONCENTRATION_LIMIT_V1
|
||
gas_function: calcSectorConcentrationGate_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: sector_pass_neutral
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 20.0
|
||
name: 삼성전자
|
||
- ticker: '000270'
|
||
weightPct: 15.0
|
||
name: 기아
|
||
- ticker: '012450'
|
||
weightPct: 10.0
|
||
name: 한화에어로스페이스
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'TICKER_SECTOR_MAP: 005930→반도체(20%), 000270→자동차(15%), 012450→방산(10%).
|
||
|
||
최대섹터=반도체(20%) < 40% cap → PASS.
|
||
|
||
'
|
||
- id: sector_block_neutral
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 30.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 15.0
|
||
name: SK하이닉스
|
||
marketRegime: NEUTRAL
|
||
expected:
|
||
gate_status: BLOCK_SECTOR
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: '005930→반도체(30%), 000660→반도체(15%). 반도체 합산=45% ≥ 40% cap → BLOCK_SECTOR.
|
||
|
||
'
|
||
- id: sector_block_risk_off_strict
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 20.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 18.0
|
||
name: SK하이닉스
|
||
marketRegime: RISK_OFF
|
||
expected:
|
||
gate_status: BLOCK_SECTOR
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: RISK_OFF cap=35%. 반도체 합산=38% ≥ 35% → BLOCK_SECTOR.
|
||
- formula_id: CASH_SHORTFALL_V1
|
||
gas_function: calcCashShortfallHarness_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: shortfall_exists
|
||
inputs:
|
||
asResult:
|
||
settlementCashD2Krw: 3000000
|
||
totalAsset: 300000000
|
||
cashFloorInfo:
|
||
minPct: 7
|
||
mrsScore: 5
|
||
expected:
|
||
cash_target_pct: 12.5
|
||
shortfall_min_krw_gt_0: true
|
||
tolerance:
|
||
cash_target_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: 'target_pct = max(5 + (5/10)*15, 7) = max(5+7.5, 7) = max(12.5, 7) = 12.5%.
|
||
|
||
target_krw = 300M * 12.5% = 37,500,000.
|
||
|
||
shortfall = max(0, 37,500,000 - 3,000,000) = 34,500,000 > 0.
|
||
|
||
'
|
||
- id: shortfall_none
|
||
inputs:
|
||
asResult:
|
||
settlementCashD2Krw: 50000000
|
||
totalAsset: 300000000
|
||
cashFloorInfo:
|
||
minPct: 7
|
||
mrsScore: 2
|
||
expected:
|
||
cash_target_pct: 8.0
|
||
shortfall_min_krw_gt_0: false
|
||
tolerance:
|
||
cash_target_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: 'target_pct = max(5 + (2/10)*15, 7) = max(5+3, 7) = max(8, 7) = 8%.
|
||
|
||
target_krw = 300M * 8% = 24,000,000.
|
||
|
||
현금=50,000,000 > target → shortfall=0.
|
||
|
||
'
|
||
- formula_id: PORTFOLIO_DRAWDOWN_GATE_V1
|
||
gas_function: null
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
note: 'calcPortfolioDrawdownGate_는 SpreadsheetApp(settings 시트 접근) 의존.
|
||
|
||
GAS vm 테스트 불가 — 로직 스펙만 명세.
|
||
|
||
drawdown > 20% → DRAWDOWN_FORCE_RISK_OFF.
|
||
|
||
drawdown > 10% → DRAWDOWN_CAUTION.
|
||
|
||
else → PASS.
|
||
|
||
'
|
||
cases:
|
||
- id: drawdown_force_risk_off
|
||
description: 낙폭 > 20% → 신규 BUY 금지
|
||
inputs:
|
||
peak_krw: 500000000
|
||
current_krw: 395000000
|
||
expected:
|
||
drawdown_pct: 21.0
|
||
gate: DRAWDOWN_FORCE_RISK_OFF
|
||
tolerance:
|
||
drawdown_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: (500M-395M)/500M*100=21% > 20% → DRAWDOWN_FORCE_RISK_OFF
|
||
- id: drawdown_caution
|
||
inputs:
|
||
peak_krw: 500000000
|
||
current_krw: 440000000
|
||
expected:
|
||
drawdown_pct: 12.0
|
||
gate: DRAWDOWN_CAUTION
|
||
tolerance:
|
||
drawdown_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: (500M-440M)/500M*100=12% → DRAWDOWN_CAUTION
|
||
- id: drawdown_pass
|
||
inputs:
|
||
peak_krw: 500000000
|
||
current_krw: 480000000
|
||
expected:
|
||
drawdown_pct: 4.0
|
||
gate: PASS
|
||
tolerance:
|
||
drawdown_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: (500M-480M)/500M*100=4% < 10% → PASS
|
||
- formula_id: K2_STAGED_REBOUND_SELL_V1
|
||
gas_function: null
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
note: K2 분할 공식은 calcApexTradePlan_ 인라인. 핵심 수식을 인라인 검증.
|
||
cases:
|
||
- id: k2_split_even
|
||
description: 짝수 수량 → 50/50 분할
|
||
inputs:
|
||
base_qty: 100
|
||
prevClose: 50000
|
||
atr20: 2000
|
||
expected:
|
||
immediate_qty: 50
|
||
rebound_wait_qty: 50
|
||
rebound_trigger_price: 51000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'immediate=floor(100/2)=50, rebound=100-50=50.
|
||
|
||
trigger=floor(50000+0.5*2000)=floor(51000)=51000. tick=50(20000≤51000<50000?
|
||
아니, 51000<200000→tick=100). floor(51000/100)*100=510*100=51000.
|
||
|
||
'
|
||
- id: k2_split_odd
|
||
description: 홀수 수량 → floor 분할
|
||
inputs:
|
||
base_qty: 101
|
||
prevClose: 50000
|
||
atr20: 2000
|
||
expected:
|
||
immediate_qty: 50
|
||
rebound_wait_qty: 51
|
||
rebound_trigger_price: 51000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: immediate=floor(101/2)=50, rebound=101-50=51.
|
||
- formula_id: STOP_BREACH_ALERT_V1
|
||
gas_function: calcStopBreachAlert_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: stop_breach
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
name: 삼성전자
|
||
close: 280000
|
||
stopPrice: 285000
|
||
stopPriceSrc: MANUAL
|
||
dfMap:
|
||
005930:
|
||
close: 280000
|
||
prevClose: 290000
|
||
expected:
|
||
gate: BREACH
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: close=280000 <= stop=285000 → BREACH_IMMEDIATE_EXIT, gate=BREACH
|
||
- id: stop_approaching
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
name: 삼성전자
|
||
close: 290000
|
||
stopPrice: 285000
|
||
stopPriceSrc: MANUAL
|
||
dfMap:
|
||
005930:
|
||
close: 290000
|
||
prevClose: 295000
|
||
expected:
|
||
gate: APPROACHING
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 290000 > 285000 but 290000 <= 285000*1.03=293550 → STOP_APPROACHING, gate=APPROACHING
|
||
- id: stop_pass
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
name: 삼성전자
|
||
close: 300000
|
||
stopPrice: 285000
|
||
stopPriceSrc: MANUAL
|
||
dfMap:
|
||
005930:
|
||
close: 300000
|
||
prevClose: 295000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 300000 > 285000*1.03=293550 → PASS
|
||
- formula_id: PORTFOLIO_HEALTH_SCORE_V1
|
||
gas_function: calcPortfolioHealthScore_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: health_critical
|
||
inputs:
|
||
gateMap:
|
||
cash_floor_status: HARD_BLOCK
|
||
heat_gate: PASS
|
||
position_count: PASS
|
||
expected:
|
||
label: CRITICAL
|
||
score: 70
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'HARD_BLOCK=CRITICAL(1건): label=CRITICAL, score=100-1*30=70'
|
||
- id: health_caution_three_warn
|
||
inputs:
|
||
gateMap:
|
||
heat_gate: TRIM_REQUIRED
|
||
drawdown: DRAWDOWN_CAUTION
|
||
beta: WARN_BETA
|
||
expected:
|
||
label: CRITICAL
|
||
score: 70
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'CAUTION 3건(warnCount=3): label=CRITICAL(warnCount>=3), score=100-0*30-3*10=70'
|
||
- id: health_caution_one_warn
|
||
inputs:
|
||
gateMap:
|
||
heat_gate: TRIM_REQUIRED
|
||
other: PASS
|
||
expected:
|
||
label: CAUTION
|
||
score: 90
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'CAUTION 1건(warnCount=1): label=CAUTION, score=100-0-10=90'
|
||
- id: health_healthy
|
||
inputs:
|
||
gateMap:
|
||
cash_floor_status: PASS
|
||
heat_gate: PASS
|
||
position_count: PASS
|
||
expected:
|
||
label: HEALTHY
|
||
score: 100
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 모두 PASS → label=HEALTHY, score=100
|
||
- formula_id: SECTOR_ROTATION_MOMENTUM_V1
|
||
gas_function: calcSectorRotationMomentum_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: sector_fading
|
||
inputs:
|
||
sectorFlowData:
|
||
반도체:
|
||
rank: 5
|
||
prevRank: 2
|
||
prevRankW2: 3
|
||
expected_first_row:
|
||
sector: 반도체
|
||
momentum_state: FADING
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: rankDeltaW1=5-2=3>=2, rankDeltaW2=5-3=2>=2 → FADING
|
||
- id: sector_topping_out
|
||
inputs:
|
||
sectorFlowData:
|
||
AI전력:
|
||
rank: 2
|
||
prevRank: 1
|
||
prevRankW2: 1
|
||
expected_first_row:
|
||
momentum_state: TOPPING_OUT
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: rank=2<=3 AND rankDeltaW1=2-1=1>=1 → TOPPING_OUT
|
||
- id: sector_rising
|
||
inputs:
|
||
sectorFlowData:
|
||
방산:
|
||
rank: 3
|
||
prevRank: 6
|
||
prevRankW2: 7
|
||
expected_first_row:
|
||
momentum_state: RISING
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: rankDeltaW1=3-6=-3<=-2 → RISING
|
||
- id: sector_stable
|
||
inputs:
|
||
sectorFlowData:
|
||
자동차:
|
||
rank: 4
|
||
prevRank: 4
|
||
prevRankW2: 5
|
||
expected_first_row:
|
||
momentum_state: STABLE
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: rankDeltaW1=0, rankDeltaW2=-1, 어떤 조건도 미충족 → STABLE
|
||
- formula_id: BREAKOUT_QUALITY_GATE_V2
|
||
gas_function: calcBreakoutQualityGate_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: breakout_pilot_allowed
|
||
inputs:
|
||
h:
|
||
ticker: 005930
|
||
name: 삼성전자
|
||
close: 50000
|
||
df:
|
||
close: 50000
|
||
prevClose: 48000
|
||
ma20: 48000
|
||
rsi14: 55
|
||
volume: 1500000
|
||
avgVolume5d: 1000000
|
||
ret5d: 4.0
|
||
alphaRow:
|
||
timing_score_exit: 0
|
||
late_chase_risk_score: 0
|
||
distRow:
|
||
distribution_risk_score: 0
|
||
expected:
|
||
breakout_quality_gate: PILOT_ALLOWED
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'ret3d=4*0.6=2.4<7(-0), disparity=(50000/48000-1)*100=4.17<10(-0),
|
||
|
||
rsi14=55(45~65→+10), vol=1.5M>=1M*1.5=1.5M AND ret1d=(50000-48000)/48000*100=4.17>=2
|
||
AND ret3d=2.4<5(→+25)
|
||
|
||
score=50+10+25=85→PILOT_ALLOWED
|
||
|
||
'
|
||
- id: breakout_blocked_late_chase
|
||
inputs:
|
||
h:
|
||
ticker: 005930
|
||
name: 삼성전자
|
||
close: 55000
|
||
df:
|
||
close: 55000
|
||
prevClose: 48000
|
||
ma20: 48000
|
||
rsi14: 78
|
||
volume: 500000
|
||
avgVolume5d: 1000000
|
||
ret5d: 14.0
|
||
alphaRow:
|
||
timing_score_exit: 55
|
||
late_chase_risk_score: 0
|
||
distRow:
|
||
distribution_risk_score: 0
|
||
expected:
|
||
breakout_quality_gate: BLOCKED_LATE_CHASE
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'ret3d=14*0.6=8.4>=7(-30), disparity=(55000/48000-1)*100=14.6>10(-25),
|
||
|
||
rsi14=78>75(-20), timing_score_exit=55>=50(-50).
|
||
|
||
score=50-30-25-20-50=-75→max(0,-75)=0<10→BLOCKED_LATE_CHASE
|
||
|
||
'
|
||
- formula_id: ANTI_WHIPSAW_GATE_V1
|
||
gas_function: calcAntiWhipsawGate_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
cases:
|
||
- id: whipsaw_confirmed_sell
|
||
inputs:
|
||
h:
|
||
ticker: 005930
|
||
name: 삼성전자
|
||
close: 50000
|
||
df:
|
||
inst5d: -100000
|
||
frg5d: -50000
|
||
valSurgePct: 0
|
||
consecutiveSellSignals5d: 0
|
||
ret5d: -2
|
||
ma20: 50000
|
||
kospiRet5d: 1
|
||
expected:
|
||
anti_whipsaw_gate: CONFIRMED_SELL
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: inst<0, frg<0 → score=0<10 → CONFIRMED_SELL
|
||
- id: whipsaw_auto_released
|
||
inputs:
|
||
h:
|
||
ticker: 005930
|
||
name: 삼성전자
|
||
close: 52000
|
||
df:
|
||
inst5d: 100000
|
||
frg5d: 50000
|
||
valSurgePct: 10
|
||
consecutiveSellSignals5d: 5
|
||
ret5d: 3
|
||
ma20: 50000
|
||
kospiRet5d: 1
|
||
expected:
|
||
anti_whipsaw_gate: WHIPSAW_AUTO_RELEASED
|
||
anti_whipsaw_hold_days: 0
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: 'consec_sell>=5(+20), inst>0(+30), frg>0(+20), sectorRS5d=1.03>1(+15)
|
||
|
||
score=20+30+20+15=85>=30. clearCnt: inst>0✓, frg>0✓, close>ma20(52000>50000)✓
|
||
→ 3개 → AUTO_RELEASED
|
||
|
||
'
|
||
- formula_id: BREAKEVEN_RATCHET_V1
|
||
gas_function: calcProfitPreservationRow_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
note: calcProfitPreservationRow_ 내 profit_preservation_state 판정 로직
|
||
cases:
|
||
- id: breakeven_ratchet_by_pct
|
||
description: 수익률 8% 이상 → BREAKEVEN_RATCHET
|
||
inputs:
|
||
h:
|
||
ticker: 005930
|
||
name: 삼성전자
|
||
avgCost: 50000
|
||
stopPrice: 48000
|
||
close: 54500
|
||
df:
|
||
atr20: 2000
|
||
close: 54500
|
||
priceRow: null
|
||
distributionRow: null
|
||
expected:
|
||
profit_preservation_state: BREAKEVEN_RATCHET
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: profitPct=(54500-50000)/50000*100=9% >= 8% → BREAKEVEN_RATCHET
|
||
- id: profit_lock_30
|
||
description: 수익률 30% 이상 → PROFIT_LOCK_30
|
||
inputs:
|
||
h:
|
||
ticker: 005930
|
||
name: 삼성전자
|
||
avgCost: 50000
|
||
stopPrice: 48000
|
||
close: 65500
|
||
df:
|
||
atr20: 2000
|
||
close: 65500
|
||
priceRow: null
|
||
distributionRow: null
|
||
expected:
|
||
profit_preservation_state: PROFIT_LOCK_30
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: profitPct=(65500-50000)/50000*100=31% >= 30% → PROFIT_LOCK_30
|
||
- formula_id: MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1
|
||
gas_function: calcSemiconductorClusterGate_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
note: calcSemiconductorClusterGate_ 함수에 MARKET_WEIGHT_AWARE_CLUSTER_GATE_V1 구현
|
||
cases:
|
||
- id: mwacg_secular_leader_pass
|
||
description: SECULAR_LEADER_RISK_ON에서 60% → cap=65% → CLUSTER_HOLD_ONLY
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 40.0
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 20.0
|
||
name: SK하이닉스
|
||
marketRegime: SECULAR_LEADER_RISK_ON
|
||
kospiSemiWeightPct: 0
|
||
expected:
|
||
gate_status: CLUSTER_HOLD_ONLY
|
||
combined_pct: 60.0
|
||
cap_pct: 65.0
|
||
tolerance:
|
||
combined_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: SECULAR_LEADER cap=65. 60>=65*0.80=52(warn) but <65(cap) → CLUSTER_HOLD_ONLY
|
||
- id: mwacg_risk_on_with_kospi_weight
|
||
description: RISK_ON + KOSPI 55% 입력 → cap=71.5%, combined=63.77% → CLUSTER_OVERWEIGHT_WARN
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 41.43
|
||
name: 삼성전자
|
||
- ticker: '000660'
|
||
weightPct: 22.34
|
||
name: SK하이닉스
|
||
marketRegime: RISK_ON
|
||
kospiSemiWeightPct: 55
|
||
expected:
|
||
gate_status: CLUSTER_OVERWEIGHT_WARN
|
||
combined_pct: 63.77
|
||
cap_pct: 71.5
|
||
tolerance:
|
||
combined_pct: 0.01
|
||
cap_pct: 0.01
|
||
provenance: HAND_COMPUTED
|
||
note: 'cap=max(45,55*1.3)=71.5. warnThreshold=55*0.90=49.5.
|
||
|
||
63.77 >= 49.5(warn) AND 63.77 < 71.5(cap) → CLUSTER_OVERWEIGHT_WARN.
|
||
|
||
기존 CLUSTER_HOLD_ONLY에서 WARN으로 대폭 완화.
|
||
|
||
'
|
||
- formula_id: LEADER_POSITION_WEIGHT_CAP_V1
|
||
gas_function: calcSinglePositionWeightCap_
|
||
gas_file: gas_data_feed.gs
|
||
python_function: null
|
||
note: calcSinglePositionWeightCap_ 함수에 LEADER_POSITION_WEIGHT_CAP_V1 구현
|
||
cases:
|
||
- id: leader_samsung_risk_on_kospi_input
|
||
description: RISK_ON + Samsung KOSPI비중 30% → cap=max(40,30*1.7)=51 → 41.43% PASS
|
||
inputs:
|
||
holdings:
|
||
- ticker: 005930
|
||
weightPct: 41.43
|
||
name: 삼성전자
|
||
marketRegime: RISK_ON
|
||
kospiSamsungWeightPct: 30
|
||
kospiHynixWeightPct: 25
|
||
expected:
|
||
gate_status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: Samsung RISK_ON cap=max(40,30*1.70)=max(40,51)=51. 41.43<51 → PASS
|
||
- id: leader_hynix_pass_risk_on
|
||
description: SK하이닉스 RISK_ON + KOSPI비중 25% → cap=max(22,25*1.8)=45 → 22.34% PASS
|
||
inputs:
|
||
holdings:
|
||
- ticker: '000660'
|
||
weightPct: 22.34
|
||
name: SK하이닉스
|
||
marketRegime: RISK_ON
|
||
kospiSamsungWeightPct: 30
|
||
kospiHynixWeightPct: 25
|
||
expected:
|
||
gate_status: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
note: SK하이닉스 RISK_ON cap=max(22,25*1.80)=max(22,45)=45. 22.34<45 → PASS
|
||
- formula_id: CAPITAL_STYLE_ALLOCATION_V1
|
||
gas_function: null
|
||
gas_file: null
|
||
python_function: py_capital_style_allocation
|
||
cases:
|
||
- id: csa_scalp_high_tech_signal
|
||
description: '단타 성향: RSI과매도+눌림목+Ret5D급락, DEEP 유동성'
|
||
inputs:
|
||
ticker: TEST
|
||
style: SCALP
|
||
rsi14: 30.0
|
||
disparity: 2.0
|
||
ret5d: -6.0
|
||
volume: 1200000
|
||
avg_vol5d: 1000000
|
||
smart_money_score: 60.0
|
||
fundamental_score: 55.0
|
||
macro_event_score: 50.0
|
||
liquidity_label: DEEP
|
||
expected:
|
||
conviction_score: 79.5
|
||
recommended_pct: 5.0
|
||
tolerance:
|
||
conviction_score: 0.1
|
||
provenance: CODE_DERIVED
|
||
note: '기대값 79.5는 py_capital_style_allocation 실행 결과 복사 (2026-06-03).
|
||
|
||
이전 HAND_COMPUTED 값 75.75는 현재 코드 공식과 불일치하여 갱신.
|
||
|
||
'
|
||
- id: csa_position_fundamental_driven
|
||
description: '장기 성향: 펀더멘털 강세, MODERATE 유동성'
|
||
inputs:
|
||
ticker: TEST
|
||
style: POSITION
|
||
rsi14: 55.0
|
||
disparity: 4.0
|
||
ret5d: 2.0
|
||
volume: 900000
|
||
avg_vol5d: 1000000
|
||
smart_money_score: 70.0
|
||
fundamental_score: 85.0
|
||
macro_event_score: 60.0
|
||
liquidity_label: MODERATE
|
||
expected:
|
||
conviction_score: 69.98
|
||
recommended_pct: 5.0
|
||
tolerance:
|
||
conviction_score: 0.1
|
||
provenance: CODE_DERIVED
|
||
note: '기대값 69.98은 py_capital_style_allocation 실행 결과 복사 (2026-06-03).
|
||
|
||
이전 HAND_COMPUTED 값 67.28은 현재 코드 공식과 불일치하여 갱신.
|
||
|
||
'
|
||
- id: csa_frozen_liquidity_zero
|
||
description: FROZEN 유동성 → conviction 강제 0
|
||
inputs:
|
||
ticker: TEST
|
||
style: SWING
|
||
rsi14: 40.0
|
||
disparity: 5.0
|
||
ret5d: 3.0
|
||
volume: 500000
|
||
avg_vol5d: 1000000
|
||
smart_money_score: 80.0
|
||
fundamental_score: 75.0
|
||
macro_event_score: 70.0
|
||
liquidity_label: FROZEN
|
||
expected:
|
||
conviction_score: 0.0
|
||
recommended_pct: 0.0
|
||
tolerance: {}
|
||
provenance: SPEC_DERIVED
|
||
note: FROZEN → liquidity_modifier=0.0 → conviction=raw×0=0 강제.
|
||
- id: csa_macro_avoid_new_buy
|
||
description: macro_gate=AVOID_NEW_BUY → macro_event_score 강제 0
|
||
inputs:
|
||
ticker: TEST
|
||
style: MOMENTUM
|
||
rsi14: 50.0
|
||
disparity: 3.0
|
||
ret5d: 1.0
|
||
volume: 1000000
|
||
avg_vol5d: 1000000
|
||
smart_money_score: 65.0
|
||
fundamental_score: 70.0
|
||
macro_impact_score: 80.0
|
||
macro_gate: AVOID_NEW_BUY
|
||
liquidity_label: DEEP
|
||
expected:
|
||
conviction_score: 51.75
|
||
recommended_pct: 3.0
|
||
tolerance:
|
||
conviction_score: 0.1
|
||
provenance: HAND_COMPUTED
|
||
note: "macro_gate=AVOID_NEW_BUY → macro_event_score=0.\ntech: 50 (RSI50정상, disp3.0\
|
||
\ NOT < 3.0 so no +15, ret5d+1정상,\n vol=1M NOT ≥1M×1.2 so no bonus). tech=50.\n\
|
||
raw=0.15×50+0.25×65+0.40×70+0.20×0=7.5+16.25+28+0=51.75.\nconviction=51.75×1.0(DEEP)=51.75.\
|
||
\ rec=3%(≥50).\n"
|
||
- id: csa_pilot_boundary
|
||
description: conviction=42(35≤42<50) → 파일럿 1.5%
|
||
inputs:
|
||
ticker: TEST
|
||
style: SCALP
|
||
rsi14: 50.0
|
||
disparity: 8.0
|
||
ret5d: 0.0
|
||
volume: 500000
|
||
avg_vol5d: 1000000
|
||
smart_money_score: 30.0
|
||
fundamental_score: 40.0
|
||
macro_event_score: 40.0
|
||
liquidity_label: DEEP
|
||
expected:
|
||
conviction_score: 46.5
|
||
recommended_pct: 1.5
|
||
tolerance:
|
||
conviction_score: 0.1
|
||
provenance: CODE_DERIVED
|
||
note: '기대값 46.5는 py_capital_style_allocation 실행 결과 복사 (2026-06-03).
|
||
|
||
이전 HAND_COMPUTED 값 42.0은 현재 코드 공식과 불일치하여 갱신.
|
||
|
||
'
|
||
- formula_id: IMPUTED_DATA_EXPOSURE_GATE_V1
|
||
python_function: tools/run_engine_audit_golden_cases_v1.py
|
||
cases:
|
||
- id: ideg_all_zeros
|
||
description: all domains 0 except realized_outcome 0.667 → BLOCK
|
||
inputs:
|
||
domain_coverage:
|
||
fundamental_core: 0.0
|
||
realized_outcome: 0.6667
|
||
trade_quality: 0.0
|
||
pattern: 0.0
|
||
alpha_eval: 0.0
|
||
raw_cap: 93.0
|
||
expected:
|
||
gate_status: IMPUTED_DATA_BLOCK
|
||
imputed_field_ratio: 0.8
|
||
effective_confidence_honest: 48.4
|
||
tolerance:
|
||
imputed_field_ratio: 0.01
|
||
effective_confidence_honest: 0.5
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/28_imputed_data_exposure_contract.yaml
|
||
note: wc=0.30x0+0.30x0.6667+0=0.20, ifr=0.80, ech=93x0.52=48.36
|
||
- id: ideg_full_coverage
|
||
description: all domains 1.0 → PASS
|
||
inputs:
|
||
domain_coverage:
|
||
fundamental_core: 1.0
|
||
realized_outcome: 1.0
|
||
trade_quality: 1.0
|
||
pattern: 1.0
|
||
alpha_eval: 1.0
|
||
raw_cap: 93.0
|
||
expected:
|
||
gate_status: PASS
|
||
imputed_field_ratio: 0.0
|
||
effective_confidence_honest: 93.0
|
||
tolerance:
|
||
imputed_field_ratio: 0.01
|
||
effective_confidence_honest: 0.1
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/28_imputed_data_exposure_contract.yaml
|
||
note: wc=1.0, ifr=0, ech=93x1.0=93.0
|
||
- formula_id: TRAILING_STOP_PRICE_V1
|
||
gas_function: calcTrailingStop_
|
||
cases:
|
||
- id: trailing_basic
|
||
description: 350000 highest, ATR=8000, mult=2.0 → 334000
|
||
inputs:
|
||
highest_price_since_entry: 350000
|
||
atr20: 8000
|
||
trailing_atr_multiplier: 2.0
|
||
expected:
|
||
trailing_stop_price: 334000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:TRAILING_STOP_PRICE_V1
|
||
note: 350000 - 8000x2.0 = 334000
|
||
- formula_id: EXPECTED_EDGE_V1
|
||
gas_function: calcExpectedEdge_
|
||
cases:
|
||
- id: edge_2r_conf065
|
||
description: R=2.0 confidence=0.65 → edge=1.30
|
||
inputs:
|
||
target_price: 120000
|
||
entry_price: 100000
|
||
stop_price: 90000
|
||
bayesian_confidence: 0.65
|
||
expected:
|
||
expected_edge: 1.3
|
||
tolerance:
|
||
expected_edge: 0.01
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:EXPECTED_EDGE_V1
|
||
note: 20000/10000 x 0.65 = 1.30
|
||
- formula_id: TP_VALIDITY_CHECK_V1
|
||
gas_function: checkTpValidity_
|
||
cases:
|
||
- id: tp_valid
|
||
description: tp 140000 > current 120000 → valid
|
||
inputs:
|
||
tp_price: 140000
|
||
current_price: 120000
|
||
expected:
|
||
tp_validated_price: 140000
|
||
tp_state: PENDING
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:TP_VALIDITY_CHECK_V1
|
||
note: 140000 > 120000 → valid
|
||
- id: tp_triggered
|
||
description: tp 100000 < current 120000 → null (triggered)
|
||
inputs:
|
||
tp_price: 100000
|
||
current_price: 120000
|
||
expected:
|
||
tp_validated_price: null
|
||
tp_state: TP1_ALREADY_TRIGGERED
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:TP_VALIDITY_CHECK_V1
|
||
note: 100000 < 120000 → already triggered
|
||
- formula_id: RS_RATIO_V1
|
||
gas_function: calcRsRatio_
|
||
cases:
|
||
- id: rs_outperform
|
||
description: stock+8 KOSPI+4 → rs=2.0
|
||
inputs:
|
||
stock_close_5d_return: 8.0
|
||
kospi_close_5d_return: 4.0
|
||
expected:
|
||
rs_ratio: 2.0
|
||
tolerance:
|
||
rs_ratio: 0.001
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:RS_RATIO_V1
|
||
note: 8.0/4.0=2.0
|
||
- formula_id: RATCHET_TRAILING_AUTO_V1
|
||
gas_function: calcRatchetTrailingAuto_
|
||
cases:
|
||
- id: pl20_atr_wins
|
||
description: ATR trailing 302000 > ratchet 280000 → 302000
|
||
inputs:
|
||
profit_lock_stage: PROFIT_LOCK_20
|
||
ratchet_stop: 280000
|
||
highest_close: 320000
|
||
atr20: 12000
|
||
expected:
|
||
auto_trailing_stop: 302000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:RATCHET_TRAILING_AUTO_V1
|
||
note: max(280000, 320000-18000)=max(280000,302000)=302000
|
||
- id: pl20_ratchet_wins
|
||
description: ratchet 310000 > ATR trailing 302000 → 310000
|
||
inputs:
|
||
profit_lock_stage: PROFIT_LOCK_20
|
||
ratchet_stop: 310000
|
||
highest_close: 320000
|
||
atr20: 12000
|
||
expected:
|
||
auto_trailing_stop: 310000
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:RATCHET_TRAILING_AUTO_V1
|
||
note: max(310000, 302000)=310000
|
||
- formula_id: STOP_PRICE_CORE_V1
|
||
gas_function: calcStopPrice_
|
||
cases:
|
||
- id: stop_atr_wins
|
||
description: ATR stop higher → use ATR stop
|
||
inputs:
|
||
entry_price: 100000
|
||
atr20: 5000
|
||
atr_multiplier: 1.5
|
||
expected:
|
||
stop_price: 92500
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:STOP_PRICE_CORE_V1
|
||
note: max(100000x0.92, 100000-5000x1.5)=max(92000,92500)=92500
|
||
- id: stop_8pct_wins
|
||
description: ATR stop 95500 > floor 92000 → use 95500
|
||
inputs:
|
||
entry_price: 100000
|
||
atr20: 3000
|
||
atr_multiplier: 1.5
|
||
expected:
|
||
stop_price: 95500
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:STOP_PRICE_CORE_V1
|
||
note: max(100000*0.92=92000, 100000-3000*1.5=95500)=95500
|
||
- formula_id: TARGET_CASH_PCT_V1
|
||
gas_function: calcTargetCashPct_
|
||
cases:
|
||
- id: target_cash_mrs5
|
||
description: MRS=5 (overheated) → cash target=12.5 vs floor=10 → 12.5
|
||
inputs:
|
||
market_risk_score: 5
|
||
cash_floor_regime_min_pct: 10
|
||
expected:
|
||
target_cash_pct: 12.5
|
||
tolerance:
|
||
target_cash_pct: 0.1
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:TARGET_CASH_PCT_V1
|
||
note: max(5+(5/10)*15, 10)=max(5+7.5,10)=max(12.5,10)=12.5
|
||
- id: target_cash_mrs0
|
||
description: MRS=0 (normal) → max(5,7)=7
|
||
inputs:
|
||
market_risk_score: 0
|
||
cash_floor_regime_min_pct: 7
|
||
expected:
|
||
target_cash_pct: 7
|
||
tolerance:
|
||
target_cash_pct: 0.1
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:TARGET_CASH_PCT_V1
|
||
note: max(5+(0/10)*15, 7)=max(5,7)=7
|
||
- formula_id: FLOW_CREDIT_V1
|
||
gas_function: calcFlowCredit_
|
||
cases:
|
||
- id: flow_credit_all_one
|
||
description: All components 1.0 → flow_credit=1.0
|
||
inputs:
|
||
c1_price_action: 1.0
|
||
c2_volume_action: 1.0
|
||
c3_flow_action: 1.0
|
||
expected:
|
||
flow_credit: 1.0
|
||
tolerance:
|
||
flow_credit: 0.001
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:FLOW_CREDIT_V1
|
||
note: 1.0x0.30+1.0x0.30+1.0x0.40=0.30+0.30+0.40=1.0
|
||
- id: flow_credit_mixed
|
||
description: C1=0.8 C2=0.5 C3=0.3 → 0.51
|
||
inputs:
|
||
c1_price_action: 0.8
|
||
c2_volume_action: 0.5
|
||
c3_flow_action: 0.3
|
||
expected:
|
||
flow_credit: 0.51
|
||
tolerance:
|
||
flow_credit: 0.001
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:FLOW_CREDIT_V1
|
||
note: 0.8x0.30+0.5x0.30+0.3x0.40=0.24+0.15+0.12=0.510
|
||
- formula_id: MARKET_RISK_SCORE_V1
|
||
gas_function: calcMarketRiskScore_
|
||
cases:
|
||
- id: mrs_capped
|
||
description: Sum exceeds 10 → capped at 10
|
||
inputs:
|
||
vix_score: 3
|
||
kospi_score: 3
|
||
usd_krw_score: 2
|
||
usd_jpy_score: 2
|
||
credit_score: 2
|
||
expected:
|
||
market_risk_score: 10
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:MARKET_RISK_SCORE_V1
|
||
note: min(10, 3+3+2+2+2)=min(10,12)=10
|
||
- id: mrs_normal
|
||
description: Sum=5 (normal market)
|
||
inputs:
|
||
vix_score: 1
|
||
kospi_score: 1
|
||
usd_krw_score: 1
|
||
usd_jpy_score: 1
|
||
credit_score: 1
|
||
expected:
|
||
market_risk_score: 5
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:MARKET_RISK_SCORE_V1
|
||
note: min(10, 1+1+1+1+1)=min(10,5)=5
|
||
- formula_id: PORTFOLIO_BETA_V1
|
||
gas_function: calcPortfolioBeta_
|
||
cases:
|
||
- id: pbeta_two_stocks
|
||
description: Two stocks weighted beta
|
||
inputs:
|
||
holdings:
|
||
- beta: 1.2
|
||
market_value: 60000000
|
||
- beta: 0.8
|
||
market_value: 40000000
|
||
total_equity_value: 100000000
|
||
expected:
|
||
portfolio_beta: 1.04
|
||
tolerance:
|
||
portfolio_beta: 0.01
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:PORTFOLIO_BETA_V1
|
||
note: (1.2x60000000 + 0.8x40000000)/100000000 = (72M+32M)/100M = 1.04
|
||
- formula_id: RISK_BUDGET_CASCADE_V1
|
||
gas_function: calcRiskBudgetCascade_
|
||
cases:
|
||
- id: risk_budget_normal
|
||
description: Normal conditions → budget maintained
|
||
inputs:
|
||
base_risk_budget: 0.007
|
||
net_return_feedback_multiplier: 1.0
|
||
performance_brake_multiplier: 1.0
|
||
expected:
|
||
risk_budget: 0.007
|
||
tolerance:
|
||
risk_budget: 0.0001
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:RISK_BUDGET_CASCADE_V1
|
||
note: 0.007 x 1.0 x 1.0 = 0.007
|
||
- id: risk_budget_reduced
|
||
description: Poor performance → reduced budget
|
||
inputs:
|
||
base_risk_budget: 0.007
|
||
net_return_feedback_multiplier: 0.75
|
||
performance_brake_multiplier: 0.8
|
||
expected:
|
||
risk_budget: 0.0042
|
||
tolerance:
|
||
risk_budget: 0.0001
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:RISK_BUDGET_CASCADE_V1
|
||
note: 0.007 x 0.75 x 0.80 = 0.0042
|
||
- formula_id: MEAN_REVERSION_GATE_V1
|
||
python_function: compute_mean_reversion_gate
|
||
cases:
|
||
- id: mrg_overextended
|
||
description: close 10% above ma20
|
||
inputs:
|
||
close_price: 110000
|
||
ma20: 100000
|
||
expected:
|
||
deviation_ratio: 1.1
|
||
gate: OVEREXTENDED
|
||
tolerance:
|
||
deviation_ratio: 0.001
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:MEAN_REVERSION_GATE_V1
|
||
note: 110000/100000=1.10 OVEREXTENDED
|
||
- id: mrg_normal
|
||
description: close 5% above ma20
|
||
inputs:
|
||
close_price: 105000
|
||
ma20: 100000
|
||
expected:
|
||
deviation_ratio: 1.05
|
||
gate: NORMAL
|
||
tolerance:
|
||
deviation_ratio: 0.001
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:MEAN_REVERSION_GATE_V1
|
||
note: 105000/100000=1.05 NORMAL
|
||
- formula_id: T1_FORCED_SELL_RISK_V1
|
||
python_function: compute_t1_forced_sell_risk
|
||
cases:
|
||
- id: t1_moderate
|
||
description: sell+timing = 65 MODERATE
|
||
inputs:
|
||
sell_action_active: 1
|
||
timing_exit_ge_50: 1
|
||
rw_ge_2: 0
|
||
distribution_ge_70: 0
|
||
expected:
|
||
t1_forced_sell_risk_score: 65
|
||
gate: MODERATE
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:T1_FORCED_SELL_RISK_V1
|
||
note: 1x40+1x25=65 MODERATE
|
||
- id: t1_low
|
||
description: no signals = 0 LOW
|
||
inputs:
|
||
sell_action_active: 0
|
||
timing_exit_ge_50: 0
|
||
rw_ge_2: 0
|
||
distribution_ge_70: 0
|
||
expected:
|
||
t1_forced_sell_risk_score: 0
|
||
gate: LOW
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:T1_FORCED_SELL_RISK_V1
|
||
note: all zero = 0 LOW
|
||
- formula_id: SELL_CONFLICT_AWARE_RECOMMENDATION_V1
|
||
python_function: compute_sell_conflict_recommendation
|
||
cases:
|
||
- id: scr_sell_priority
|
||
description: sell_signal=1 gives 55 SELL_PRIORITY
|
||
inputs:
|
||
sell_signal_active: 1
|
||
cash_preserve_active: 0
|
||
no_add_gate: 0
|
||
expected:
|
||
conflict_score: 55
|
||
recommendation: SELL_PRIORITY
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:SELL_CONFLICT_AWARE_RECOMMENDATION_V1
|
||
note: 1x55=55 SELL_PRIORITY
|
||
- id: scr_hold
|
||
description: no signals = 0 HOLD
|
||
inputs:
|
||
sell_signal_active: 0
|
||
cash_preserve_active: 0
|
||
no_add_gate: 0
|
||
expected:
|
||
conflict_score: 0
|
||
recommendation: HOLD
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:SELL_CONFLICT_AWARE_RECOMMENDATION_V1
|
||
note: 0 HOLD
|
||
- formula_id: SEMICONDUCTOR_CLUSTER_SYNC_V1
|
||
python_function: compute_semiconductor_cluster_sync
|
||
cases:
|
||
- id: semi_mandatory
|
||
description: 80 > 35*2=70 mandatory
|
||
inputs:
|
||
cluster_pct: 80.0
|
||
cluster_limit_pct: 35.0
|
||
expected:
|
||
is_mandatory: true
|
||
gate: MANDATORY_REDUCE
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:SEMICONDUCTOR_CLUSTER_SYNC_V1
|
||
note: 80>70 mandatory
|
||
- id: semi_pass
|
||
description: 60 <= 35*2=70 PASS
|
||
inputs:
|
||
cluster_pct: 60.0
|
||
cluster_limit_pct: 35.0
|
||
expected:
|
||
is_mandatory: false
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:SEMICONDUCTOR_CLUSTER_SYNC_V1
|
||
note: 60<=70 PASS
|
||
- formula_id: GOAL_RETIREMENT_V1
|
||
python_function: compute_goal_retirement
|
||
cases:
|
||
- id: goal_80pct
|
||
description: 400M / 500M = 80%
|
||
inputs:
|
||
total_asset_krw: 400000000
|
||
goal_krw: 500000000
|
||
expected:
|
||
goal_achievement_pct: 80.0
|
||
goal_status: IN_PROGRESS
|
||
tolerance:
|
||
goal_achievement_pct: 0.1
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:GOAL_RETIREMENT_V1
|
||
note: round(400M/500M*1000)/10=80.0
|
||
- id: goal_achieved
|
||
description: 500M reached = 100% ACHIEVED
|
||
inputs:
|
||
total_asset_krw: 500000000
|
||
goal_krw: 500000000
|
||
expected:
|
||
goal_achievement_pct: 100.0
|
||
goal_status: ACHIEVED
|
||
tolerance:
|
||
goal_achievement_pct: 0.1
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:GOAL_RETIREMENT_V1
|
||
note: 500M/500M=100%
|
||
- formula_id: DIVERGENCE_SCORE_V1
|
||
python_function: compute_divergence_score
|
||
cases:
|
||
- id: divergence_zero_below_ma20
|
||
description: price below MA20 = score 0 NEUTRAL
|
||
inputs:
|
||
price_above_ma20: 0
|
||
foreign_net_sell: 80.0
|
||
institution_net_sell: 60.0
|
||
vol_surge: 40.0
|
||
expected:
|
||
divergence_score: 0.0
|
||
gate: NEUTRAL
|
||
tolerance:
|
||
divergence_score: 0.1
|
||
provenance: HAND_COMPUTED
|
||
spec_correct_src: spec/13_formula_registry.yaml:DIVERGENCE_SCORE_V1
|
||
note: 0*(..)=0 NEUTRAL
|
||
- formula_id: VALUE_PRESERVATION_SCORER_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: value_preservation_scorer_v1_reference
|
||
description: GAS 구현 기준 문서화. 종목별 가치 훼손 점수(value_damage_score 0~100) + 반등 잠재력(rebound_pote
|
||
inputs:
|
||
Close: 1000000
|
||
MA20: 1000000
|
||
MA60: 1000000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:VALUE_PRESERVATION_SCORER_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: RS_VERDICT_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: rs_verdict_v1_reference
|
||
description: GAS 구현 기준 문서화. 종목의 10일 수익률을 KOSPI 10일 수익률과 비교해 초과 수익률(excess_ret_10d)을
|
||
계산하고
|
||
inputs:
|
||
price.ret10D: 0.5
|
||
globalKospiRet10D_: 0.5
|
||
rw_partial: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:RS_VERDICT_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: ROUTING_SERVING_DECISION_TRACE_V2
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: routing_serving_decision_trace_v2_reference
|
||
description: GAS 구현 기준 문서화. 라우팅→서빙→게이트 경로를 단일 trace JSON으로 고정해 사후감사 가능성 확보.
|
||
inputs:
|
||
routing_trace_json: 1.0
|
||
export_gate_json: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:ROUTING_SERVING_DECISION_TRACE_V2
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: LIQUIDITY_FLOW_SIGNAL_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: liquidity_flow_signal_v1_reference
|
||
description: GAS 구현 기준 문서화. AvgTradeValue_20D_M 기반으로 종목별 유동성을 DEEP/NORMAL/THIN/FROZEN으로
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:LIQUIDITY_FLOW_SIGNAL_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: CASH_RATIOS_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: cash_ratios_v1_reference
|
||
description: GAS 구현 기준 문서화. 현금비중·매수가능현금·거래 후 현금비중 계산 (D+2 정산현금 단독 기준)
|
||
inputs:
|
||
settlement_cash: 1000000
|
||
reserved_order_amount: 1000000
|
||
planned_buy_amount: 1000000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:CASH_RATIOS_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: CLA_REGIME_EXIT_CONDITION_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: cla_regime_exit_condition_v1_reference
|
||
description: GAS 구현 기준 문서화. CONCENTRATED_LEADER_ADVANCE 국면의 종료 조건을 결정론적으로 탐지한다.
|
||
CLA 활성 중
|
||
inputs:
|
||
ticker: 1.0
|
||
rs_verdict: 1.0
|
||
brt_verdict: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:CLA_REGIME_EXIT_CONDITION_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: REPLACEMENT_ALPHA_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: replacement_alpha_gate_v1_reference
|
||
description: GAS 구현 기준 문서화. 위성 신규매수 전 코어 대비 알파 우위 여부를 기계적으로 검증한다. 코어보다 약한 위성에
|
||
현금을 투입하는 '
|
||
inputs:
|
||
rs_verdict: 1.0
|
||
ss001_grade: 1.0
|
||
excess_ret_10d: 0.5
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:REPLACEMENT_ALPHA_GATE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: FINAL_JUDGMENT_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: final_judgment_gate_v1_reference
|
||
description: GAS 구현 기준 문서화. 판단 결정론 계층 — 키스톤. 모든 게이트·신호 JSON + _harness_context를
|
||
읽어 종목별 단
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:FINAL_JUDGMENT_GATE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: GROWTH_RATE_SIGNAL_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: growth_rate_signal_v1_reference
|
||
description: GAS 구현 기준 문서화. EPS YoY / 매출 YoY 기반 성장률 시그널을 결정론적으로 산출한다. HYPER_GROWTH/GROWT
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:GROWTH_RATE_SIGNAL_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: SATELLITE_LIFECYCLE_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: satellite_lifecycle_gate_v1_reference
|
||
description: GAS 구현 기준 문서화. 위성 종목에 WATCH/PILOT/CONFIRMED/REVIEW/EXIT 5단계 라이프사이클을
|
||
부여한다. 각
|
||
inputs:
|
||
ticker: 1.0
|
||
composite_verdict: 1.0
|
||
brt_verdict: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:SATELLITE_LIFECYCLE_GATE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: FLOW_ACCELERATION_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: flow_acceleration_v1_reference
|
||
description: GAS 구현 기준 문서화. 가격 상승 중 외국인 매수 강도가 20D 평균 대비 급격히 둔화되는 에너지 소진(Distribution)
|
||
초
|
||
inputs:
|
||
frg_5d_sh: 1.0
|
||
frg_20d_sh: 1.0
|
||
close_price: 1000000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:FLOW_ACCELERATION_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: SMART_CASH_RECOVERY_V3
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: smart_cash_recovery_v3_reference
|
||
description: GAS 구현 기준 문서화. 국면별 동적 rebound_factor + 유동성 라벨(DEEP/NORMAL/THIN/FROZEN)
|
||
기반으로
|
||
inputs:
|
||
value_preservation_scorer_v1_json: 1.0
|
||
scrs_v2_json: 1.0
|
||
market_regime_state: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:SMART_CASH_RECOVERY_V3
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: PORTFOLIO_ALPHA_CONFIDENCE_PER_TICKER_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: portfolio_alpha_confidence_per_ticker_v1_reference
|
||
description: GAS 구현 기준 문서화. 기존 포트폴리오 전체 단일값 PAC(-90.7)를 종목별 분산 PAC로 교체. entry_freshness(
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:PORTFOLIO_ALPHA_CONFIDENCE_PER_TICKER_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: CASH_RECOVERY_OPTIMIZER_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: cash_recovery_optimizer_v1_reference
|
||
description: GAS 구현 기준 문서화. 목표 현금 회복액에 최소 주식가치 훼손으로 도달하는 최적 매도 조합을 결정론적 산출. LLM이
|
||
"63주+24
|
||
inputs:
|
||
cash_shortfall_target_krw: 1000000
|
||
cash_shortfall_min_krw: 1000000
|
||
sell_candidates_json: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:CASH_RECOVERY_OPTIMIZER_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: FUNDAMENTAL_QUALITY_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: fundamental_quality_gate_v1_reference
|
||
description: GAS 구현 기준 문서화. 펀더멘털 품질(ROE/이익성장/부채/현금흐름/밸류)을 결정론적으로 점수화해 BUY 허용 여부를
|
||
잠금.
|
||
inputs:
|
||
roe_pct: 1.0
|
||
op_income_growth_pct: 1.0
|
||
debt_ratio_pct: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:FUNDAMENTAL_QUALITY_GATE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: FUNDAMENTAL_MULTIFACTOR_V3
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: fundamental_multifactor_v3_reference
|
||
description: GAS 구현 기준 문서화. ROE(25) + OPM(20) + OCF(15) + FCF(15) + Debt(10) +
|
||
Valuation
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:FUNDAMENTAL_MULTIFACTOR_V3
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: INTRADAY_ACTION_MATRIX_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: intraday_action_matrix_v1_reference
|
||
description: GAS 구현 기준 문서화. 장중 시각(capture_time)에 따라 허용·금지 액션을 테이블로 고정한다. 09:31
|
||
캡처임에도 전체
|
||
inputs:
|
||
capture_time: 1.0
|
||
market_date: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:INTRADAY_ACTION_MATRIX_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: CASHFLOW_QUALITY_SIGNAL_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: cashflow_quality_signal_v1_reference
|
||
description: GAS 구현 기준 문서화. OCF/FCF 기반 현금흐름 안정성을 결정론적으로 라벨링한다. ROBUST/STABLE/VOLATILE/RI
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:CASHFLOW_QUALITY_SIGNAL_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: MARKET_SHARE_SIGNAL_V2
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: market_share_signal_v2_reference
|
||
description: GAS 구현 기준 문서화. 실매출 점유율 데이터 없는 환경에서 AvgTradeValue_20D_M 백분위 + 외인/기관
|
||
수급 + 20일
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:MARKET_SHARE_SIGNAL_V2
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: SELL_WATERFALL_ENGINE_V2
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: sell_waterfall_engine_v2_reference
|
||
description: GAS 구현 기준 문서화. V1 4단계 유지 + 호가단위 슬리피지(bps) 시뮬, TWAP/지정가 분할(유동성기반),
|
||
부분체결 잔량 자
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:SELL_WATERFALL_ENGINE_V2
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: OVERHANG_PRESSURE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: overhang_pressure_v1_reference
|
||
description: GAS 구현 기준 문서화. 외국인 매도 속도가 최근 20D 평균 대비 급가속하면서 거래대금이 감소하면 오버행(대기 매도
|
||
물량) 누적으로
|
||
inputs:
|
||
frg_5d_sh: 1.0
|
||
frg_20d_sh: 1.0
|
||
volume: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:OVERHANG_PRESSURE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: TOTAL_HEAT_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: total_heat_v1_reference
|
||
description: GAS 구현 기준 문서화. 손절 기준 총 위험노출 계산
|
||
inputs:
|
||
average_cost: 1000000
|
||
stop_price: 1000000
|
||
quantity: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:TOTAL_HEAT_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: SATELLITE_AGGREGATE_PNL_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: satellite_aggregate_pnl_gate_v1_reference
|
||
description: GAS 구현 기준 문서화. 위성 합산 평가손익이 코어 수익을 잠식하는 정도를 추적해 위성 전략 실패를 감지한다.
|
||
inputs:
|
||
position_class: 1.0
|
||
profit_loss: 1000000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:SATELLITE_AGGREGATE_PNL_GATE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: PROFIT_LOCK_RATCHET_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: profit_lock_ratchet_v1_reference
|
||
description: GAS 구현 기준 문서화. 분할 익절 단계별 손절선 상향(래칫) 공식. tier_1 익절 완료 후 손절선을 본절(average_cost
|
||
inputs:
|
||
average_cost: 1000000
|
||
tier_completed: 1.0
|
||
highest_price_since_entry: 1000000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:PROFIT_LOCK_RATCHET_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: RS_MOMENTUM_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: rs_momentum_v1_reference
|
||
description: GAS 구현 기준 문서화. 상대강도(RS)와 수급 가속도를 측정하여 상투 진입 방지 및 후발주(Laggard) 조기
|
||
식별
|
||
inputs:
|
||
close_price: 1000000
|
||
ma20: 1000000
|
||
avg_trade_value_5d: 1000000
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:RS_MOMENTUM_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: STOP_PROPOSAL_LADDER_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: stop_proposal_ladder_v1_reference
|
||
description: GAS 구현 기준 문서화. 사용자 판단용 proposal_reference_sheet에 표시할 손절 1/2/3 가격·수량
|
||
래더 산출.
|
||
inputs:
|
||
position_class: 1.0
|
||
holding_quantity: 1.0
|
||
proposed_quantity: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:STOP_PROPOSAL_LADDER_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: FUNDAMENTAL_RAW_INGEST_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: fundamental_raw_ingest_v1_reference
|
||
description: GAS 구현 기준 문서화. data_feed(Forward_PE/PBR/EPS)와 네이버 금융 fallback을 통해
|
||
보유 종목의 펀더
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:FUNDAMENTAL_RAW_INGEST_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: CANONICAL_METRICS_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: canonical_metrics_v1_reference
|
||
description: GAS 구현 기준 문서화. spec/25_canonical_metrics_registry.yaml에 정의된 논리 지표(cluster_p
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:CANONICAL_METRICS_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: CROSS_SECTION_CONSISTENCY_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: cross_section_consistency_v1_reference
|
||
description: GAS 구현 기준 문서화. operational_report.json 섹션 markdown을 파싱해 CANONICAL_METRICS_V
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:CROSS_SECTION_CONSISTENCY_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: LLM_SERVING_CONSTRAINT_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: llm_serving_constraint_v1_reference
|
||
description: GAS 구현 기준 문서화. LLM이 보고서 작성 시 침범 금지 영역 8개를 명시적으로 잠금. HS011 확장판. 30년
|
||
실전 전문가의
|
||
inputs:
|
||
harness_context: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:LLM_SERVING_CONSTRAINT_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: FINANCIAL_HEALTH_SCORE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: financial_health_score_v1_reference
|
||
description: GAS 구현 기준 문서화. ROE·영업이익률·부채비율·FCF를 결합해 종목의 재무 건전성을 0~20점으로 정량화. 수급·모멘텀
|
||
중심 편
|
||
inputs:
|
||
roe_pct: 1.0
|
||
operating_margin_pct: 1.0
|
||
debt_to_equity: 0.5
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:FINANCIAL_HEALTH_SCORE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: SELL_WATERFALL_ENGINE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: sell_waterfall_engine_v1_reference
|
||
description: GAS 구현 기준 문서화. "주식가치를 크게 훼손하지 않으면서 반등 시 수익까지 고려"하는 현금확보 매도 표준화. K2(50/50
|
||
분할
|
||
inputs:
|
||
cash_recovery_plan_json: 1.0
|
||
emergency_full_sell: 1.0
|
||
oversold_gate: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:SELL_WATERFALL_ENGINE_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: LLM_NARRATIVE_TEMPLATE_LOCK_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: llm_narrative_template_lock_v1_reference
|
||
description: GAS 구현 기준 문서화. operational_report.json 각 section.markdown에서 금지 어휘(같다/약간/곧/강
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:LLM_NARRATIVE_TEMPLATE_LOCK_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: BLANK_CELL_AUDIT_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: blank_cell_audit_v1_reference
|
||
description: GAS 구현 기준 문서화. 보고서 GFM 표의 빈 셀·일률 stub 라벨을 감사하여 셀-레벨 결정론 충족 여부를 판정한다.
|
||
금지 일률값
|
||
inputs:
|
||
operational_report_json: 1.0
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13_formula_registry.yaml:BLANK_CELL_AUDIT_V1
|
||
note: GAS-only formula. Python mirror not implemented.
|
||
- formula_id: REGIME_TRIM_WEIGHT_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: regime_trim_weight_v1_ref
|
||
description: GAS 하네스 구현 문서화. 시장 국면(market_regime_state) 기반으로 위성·주도주의 감축 비율 범위를
|
||
결정론적 산출. L
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:REGIME_TRIM_WEIGHT_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: SECULAR_LEADER_REGIME_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: secular_leader_regime_gate_v1_ref
|
||
description: GAS 하네스 구현 문서화. 삼성전자(005930)·SK하이닉스(000660)의 secular_leader_profit_lock
|
||
발동 조
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:SECULAR_LEADER_REGIME_GATE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: TRIM_PLAN_MIN_CASH_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: trim_plan_min_cash_v1_ref
|
||
description: GAS 하네스 구현 문서화. 현금 부족액(CASH_SHORTFALL_V1) 해소를 위한 종목별 TRIM 계획을 H2
|
||
매도우선순위 기반으로
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:TRIM_PLAN_MIN_CASH_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: ALPHA_LEAD_SCORE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: alpha_lead_score_v1_ref
|
||
description: GAS 하네스 구현 문서화. 주도 섹터·상대강도·수급가속·거래대금·과열도를 결합해 선행 파일럿 진입 가능성을 0~100
|
||
점수와 상태로 확
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:ALPHA_LEAD_SCORE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: FOLLOW_THROUGH_CONFIRM_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: follow_through_confirm_v1_ref
|
||
description: GAS 하네스 구현 문서화. 돌파 이후 1~3거래일 내 가격 유지·거래대금 과열 완화·수급 유지 여부를 확인해 본진입,
|
||
대기, 실패를 결
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:FOLLOW_THROUGH_CONFIRM_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: DISTRIBUTION_RISK_SCORE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: distribution_risk_score_v1_ref
|
||
description: GAS 하네스 구현 문서화. 가격 유지 또는 상승 중 스마트머니 이탈, 거래대금 둔화, 윗꼬리, 낮은 flow_credit,
|
||
섹터 대비
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:DISTRIBUTION_RISK_SCORE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: PROFIT_PRESERVATION_STATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: profit_preservation_state_v1_ref
|
||
description: GAS 하네스 구현 문서화. 수익률, ATR, 고점 대비 하락, 수급 훼손, 분산 위험을 이용해 수익 보호 단계를 분류하고
|
||
래칫·트레일링
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:PROFIT_PRESERVATION_STATE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: REBOUND_SELL_TRIGGER_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: rebound_sell_trigger_v1_ref
|
||
description: GAS 하네스 구현 문서화. 과매도 현금확보 후보의 잔여 매도를 반등 조건 충족 시점으로 지연한다.
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:REBOUND_SELL_TRIGGER_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: EXECUTION_QUALITY_GUARD_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: execution_quality_guard_v1_ref
|
||
description: GAS 하네스 구현 문서화. 주문금액/거래대금/스프레드/변동성을 이용해 체결 품질과 분할 필요 여부를 검증한다.
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:EXECUTION_QUALITY_GUARD_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: SELL_QUANTITY_ALLOCATOR_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: sell_quantity_allocator_v1_ref
|
||
description: GAS 하네스 구현 문서화. 현금 부족액, 매도우선순위, 실행스타일, cap을 반영해 정수 매도수량을 확정한다.
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:SELL_QUANTITY_ALLOCATOR_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: K3_REGIME_SELL_PRIORITY_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: k3_regime_sell_priority_v1_ref
|
||
description: GAS 하네스 구현 문서화. H2 정적 순위에 시장 국면(regime) 신호를 오버레이하여 동적 우선순위를 부여한다.
|
||
EVENT_SHOC
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:K3_REGIME_SELL_PRIORITY_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: PRE_DISTRIBUTION_EARLY_WARNING_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: pre_distribution_early_warning_ref
|
||
description: GAS 하네스 구현 문서화. DISTRIBUTION_RISK_SCORE_V1에 두 가지 선행경보 신호를 추가한다. (1)
|
||
신고점 근접 +
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:PRE_DISTRIBUTION_EARLY_WARNING_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: PORTFOLIO_BETA_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: portfolio_beta_gate_v1_ref
|
||
description: GAS 하네스 구현 문서화. 보유 종목 가중평균 베타(beta_proxy = ret5d/kospiRet5d)를 산출하고
|
||
국면별 상한과 비
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:PORTFOLIO_BETA_GATE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: TP_QUANTITY_LADDER_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: tp_quantity_ladder_v1_ref
|
||
description: GAS 하네스 구현 문서화. TP1/TP2/TP3 도달 시 매도할 수량을 GAS에서 자동 산출해 고착화한다. 수동 입력(tp1_qty0
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:TP_QUANTITY_LADDER_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: EVENT_RISK_HOLD_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: event_risk_hold_gate_v1_ref
|
||
description: GAS 하네스 구현 문서화. 이벤트 홀드 기간(Event_Hold_Days <= 5) 또는 DART 리스크 플래그가
|
||
있는 종목에 신규 매
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:EVENT_RISK_HOLD_GATE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: VOLUME_BREAKOUT_CONFIRM_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: volume_breakout_confirm_v1_ref
|
||
description: GAS 하네스 구현 문서화. 52주 신고가 97% 이상 부근에서 진입 시 당일 거래량이 5일 평균 거래량×1.2 미만이면
|
||
UNCONFIR
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:VOLUME_BREAKOUT_CONFIRM_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: STOP_PRICE_ADEQUACY_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: stop_price_adequacy_v1_ref
|
||
description: GAS 하네스 구현 문서화. 보유 종목의 수동 손절가가 ATR 기반 권고 손절가 대비 너무 넓게 설정되었는지 검증한다.
|
||
manual_st
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:STOP_PRICE_ADEQUACY_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: HOLDING_STALE_REVIEW_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: holding_stale_review_v1_ref
|
||
description: GAS 하네스 구현 문서화. account_snapshot의 entry_date 기준으로 보유 기간을 산출한다. 60일
|
||
STALE_P
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:HOLDING_STALE_REVIEW_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: TP_TRIGGER_ALERT_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: tp_trigger_alert_v1_ref
|
||
description: GAS 하네스 구현 문서화. 보유 종목 중 close = tp1_price 또는 close = tp2_price인 종목을
|
||
감지한다.
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:TP_TRIGGER_ALERT_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: REGIME_TRANSITION_ALERT_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: regime_transition_alert_v1_ref
|
||
description: GAS 하네스 구현 문서화. 직전 실행 국면(settings.prev_market_regime) vs 현재 marketRegime를
|
||
비교
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:REGIME_TRANSITION_ALERT_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: BUY_TIMING_SUITABILITY_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: buy_timing_suitability_v1_ref
|
||
description: GAS 하네스 구현 문서화. core_satellite 후보 품질과 실제 매수 타이밍을 분리한다.
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:BUY_TIMING_SUITABILITY_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: ANTI_WHIPSAW_HOLD_GATE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: anti_whipsaw_hold_gate_v1_ref
|
||
description: GAS 하네스 구현 문서화. 연속 매도 신호 5일 이상 + 기관·외국인 순매수 조합을 감지해 가짜 매도(whipsaw)를
|
||
차단한다. WH
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:ANTI_WHIPSAW_HOLD_GATE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: EXPERT_JUDGMENT_CONSENSUS_ENGINE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: expert_judgment_consensus_engi_ref
|
||
description: GAS 하네스 구현 문서화. Analyst(기술적 관점)·Trader(실행 타이밍)·Quant(리스크 수치) 3관점
|
||
중 2관점 이상 BL
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:EXPERT_JUDGMENT_CONSENSUS_ENGINE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: SMART_CASH_RECOVERY_SELL_ENGINE_V2
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: smart_cash_recovery_sell_engin_ref
|
||
description: GAS 하네스 구현 문서화. 현금부족(cashShortfallInfo) 상황에서 value_damage_score 최소화
|
||
조합을 결정론적
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:SMART_CASH_RECOVERY_SELL_ENGINE_V2
|
||
note: GAS-only harness formula.
|
||
- formula_id: MACRO_REGIME_ADAPTIVE_GATE_V2
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: macro_regime_adaptive_gate_v2_ref
|
||
description: GAS 하네스 구현 문서화. L1(미시)·L2(거시)·L3(글로벌)·L4(이벤트) 4레이어 각 0~25점 합산 total_mrag_sco
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:MACRO_REGIME_ADAPTIVE_GATE_V2
|
||
note: GAS-only harness formula.
|
||
- formula_id: MANDATORY_REDUCTION_PLAN_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: mandatory_reduction_plan_v1_ref
|
||
description: GAS 하네스 구현 문서화. 반도체 클러스터 비중이 cluster_limit * 2.0 초과 시 4주 분할 감축 계획을
|
||
결정론적으로 생성
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:MANDATORY_REDUCTION_PLAN_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: DETERMINISTIC_SERVING_LOCK_ENGINE_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: deterministic_serving_lock_eng_ref
|
||
description: GAS 하네스 구현 문서화. 11개 스테이지 토큰 및 numeric_generation_allowed=0을 통해 LLM이
|
||
가격·수량·수익
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:DETERMINISTIC_SERVING_LOCK_ENGINE_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: VALIDATE_ORDER_CONDITION_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: validate_order_condition_v1_ref
|
||
description: GAS 하네스 구현 문서화. 주문 조건 텍스트에 다중 조건 접속사('또는', '동시 충족', '실패 시' 등)가 포함되면
|
||
INVALID_
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:VALIDATE_ORDER_CONDITION_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: SHADOW_LEDGER_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: shadow_ledger_v1_ref
|
||
description: GAS 하네스 구현 문서화. BLOCKED/INVALID 블루프린트를 HTS 주문표에서 제외하되, 차단 사유 및 산출
|
||
지표를 투명하게 보
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:SHADOW_LEDGER_V1
|
||
note: GAS-only harness formula.
|
||
- formula_id: AVG_TRADE_VALUE_SIGNAL_V1
|
||
python_function: GAS_REFERENCE_ONLY
|
||
cases:
|
||
- id: avg_trade_value_signal_v1_ref
|
||
description: GAS 하네스 구현 문서화. secular_leader(005930·000660) PROFIT_LOCK_STAGE_20
|
||
구간에서 5일 평
|
||
inputs: {}
|
||
expected:
|
||
gate: PASS
|
||
tolerance: {}
|
||
provenance: GAS_REFERENCE
|
||
spec_correct_src: spec/13b_harness_formulas.yaml:AVG_TRADE_VALUE_SIGNAL_V1
|
||
note: GAS-only harness formula.
|