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>
1547 lines
53 KiB
YAML
1547 lines
53 KiB
YAML
schema_version: formula_domain.v1
|
||
source: C:\Temp\data_feed\spec\13_formula_registry.yaml
|
||
domain: exit
|
||
formulas:
|
||
STOP_PRICE_CORE_V1:
|
||
purpose: 코어 포지션 HTS 입력용 손절가 계산
|
||
inputs:
|
||
- field: entry_price
|
||
unit: KRW_per_share
|
||
- field: atr20
|
||
unit: KRW_per_share
|
||
- field: current_price
|
||
unit: KRW_per_share
|
||
derived_fields:
|
||
atr20_pct: atr20 / current_price * 100
|
||
atr_multiplier: 2.0 if atr20_pct >= 8 else 1.5
|
||
expression: max(entry_price * 0.92, entry_price - atr20 * atr_multiplier)
|
||
output:
|
||
field: stop_price
|
||
unit: KRW_per_share
|
||
missing_policy:
|
||
atr20: entry_price * 0.92 with DATA_MISSING tag
|
||
entry_price: NO_STOP_PRICE
|
||
canonical_ref: spec/exit/stop_loss.yaml:stop_loss.core
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- entry_price
|
||
- atr20
|
||
- current_price
|
||
output_fields:
|
||
- stop_price
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
STOP_PROPOSAL_LADDER_V1:
|
||
purpose: '사용자 판단용 proposal_reference_sheet에 표시할 손절 1/2/3 가격·수량 래더 산출. HTS 즉시 주문표가
|
||
아니라 제안표 전용이며, 기존 손절 규칙과 profit preservation 결과만 사용한다.
|
||
|
||
'
|
||
inputs:
|
||
- field: position_class
|
||
unit: enum [core, satellite]
|
||
- field: holding_quantity
|
||
unit: shares
|
||
optional: true
|
||
- field: proposed_quantity
|
||
unit: shares
|
||
optional: true
|
||
- field: stop_price
|
||
unit: KRW_per_share
|
||
- field: profit_lock_stage
|
||
unit: enum
|
||
optional: true
|
||
- field: protected_stop_price
|
||
unit: KRW_per_share
|
||
optional: true
|
||
- field: auto_trailing_stop
|
||
unit: KRW_per_share
|
||
optional: true
|
||
- field: tp3_qty
|
||
unit: shares
|
||
optional: true
|
||
derived_fields:
|
||
base_stop_quantity: holding_quantity 우선, 없으면 proposed_quantity
|
||
rules:
|
||
stop1:
|
||
price_expression: stop_price
|
||
quantity_expression: core=floor(max(1, base_stop_quantity*0.50)), satellite=floor(max(1,
|
||
base_stop_quantity*0.70))
|
||
rationale: spec/exit/stop_loss.yaml core/satellite quantity_rule의 1차 손절
|
||
stop2:
|
||
price_expression: stop_price
|
||
quantity_expression: max(base_stop_quantity - stop1_quantity, 0)
|
||
rationale: 종가 회복 실패 시 잔여 청산
|
||
stop3:
|
||
price_expression: auto_trailing_stop 우선, 없으면 protected_stop_price
|
||
quantity_expression: tp3_qty 우선, 없으면 base_stop_quantity - tp1_quantity - tp2_quantity
|
||
activation: profit_lock_stage != NORMAL 또는 auto_trailing_stop 존재
|
||
rationale: 수익보전 구간 러너 보호 스탑
|
||
output:
|
||
field: proposal_stop_ladder
|
||
unit: object
|
||
missing_policy:
|
||
stop_price: NO_STOP_LADDER
|
||
holding_quantity: proposed_quantity fallback
|
||
protected_stop_price: stop3는 비움
|
||
prohibition:
|
||
- stop2/stop3를 차트 패턴이나 심리적 가격으로 임의 산출 금지
|
||
- stop3 활성 근거가 없으면 null 유지
|
||
canonical_ref: spec/00_execution_contract.yaml:proposal_policy.proposal_stop_ladder_selection
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- position_class
|
||
- holding_quantity
|
||
- proposed_quantity
|
||
- stop_price
|
||
- profit_lock_stage
|
||
- protected_stop_price
|
||
- auto_trailing_stop
|
||
- tp3_qty
|
||
output_fields:
|
||
- proposal_stop_ladder
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
TRAILING_STOP_PRICE_V1:
|
||
purpose: 고점 대비 ATR 기반 trailing stop 가격 계산
|
||
inputs:
|
||
- field: highest_price_since_entry
|
||
unit: KRW_per_share
|
||
- field: atr20
|
||
unit: KRW_per_share
|
||
- field: trailing_atr_multiplier
|
||
unit: ratio
|
||
default: 1.5
|
||
expression: highest_price_since_entry - atr20 * trailing_atr_multiplier
|
||
output:
|
||
field: trailing_stop_price
|
||
unit: KRW_per_share
|
||
missing_policy:
|
||
highest_price_since_entry: NO_TRAILING_PRICE
|
||
atr20: NO_TRAILING_PRICE
|
||
canonical_ref: spec/exit/take_profit.yaml:take_profit.trailing_stop
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- highest_price_since_entry
|
||
- atr20
|
||
- trailing_atr_multiplier
|
||
output_fields:
|
||
- trailing_stop_price
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
ABSOLUTE_RISK_STOP_V1:
|
||
purpose: 절대 리스크 손절가와 청산 수량을 산출하는 taxonomy wrapper
|
||
inputs:
|
||
- field: holdings
|
||
unit: object[]
|
||
- field: df_map
|
||
unit: object
|
||
output:
|
||
field: absolute_risk_stop_rows
|
||
unit: object[]
|
||
canonical_ref: spec/exit/stop_loss.yaml:stop_loss.core
|
||
note: stop_loss.core/satellite 및 stop_adequacy 결과를 묶는 wrapper
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- holdings
|
||
- df_map
|
||
output_fields:
|
||
- absolute_risk_stop_rows
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
RELATIVE_UNDERPERF_ALERT_V1:
|
||
purpose: 상대성과 약화 경보를 산출하는 taxonomy wrapper
|
||
inputs:
|
||
- field: holdings
|
||
unit: object[]
|
||
- field: df_map
|
||
unit: object
|
||
- field: kospi_ret20d
|
||
unit: pct
|
||
optional: true
|
||
output:
|
||
field: relative_underperf_alert
|
||
unit: object
|
||
canonical_ref: spec/exit/stop_loss.yaml:stop_loss.relative_weakness_exit
|
||
note: calcRelativeStopSignal_의 하위 wrapper
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- holdings
|
||
- df_map
|
||
- kospi_ret20d
|
||
output_fields:
|
||
- relative_underperf_alert
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
STOP_ACTION_LADDER_V1:
|
||
purpose: 손절/익절/시간손절의 최종 액션 래더를 산출하는 taxonomy wrapper
|
||
inputs:
|
||
- field: context
|
||
unit: object
|
||
output:
|
||
field: stop_action_ladder
|
||
unit: object
|
||
canonical_ref: spec/exit/stop_loss.yaml:stop_loss.sell_signal_priority
|
||
note: calcSellDecision_ / SL003_PRIORITY_MATRIX 결과를 표준화
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- context
|
||
output_fields:
|
||
- stop_action_ladder
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
PROFIT_LOCK_RATCHET_V1:
|
||
purpose: '분할 익절 단계별 손절선 상향(래칫) 공식. tier_1 익절 완료 후 손절선을 본절(average_cost)로 상향하여
|
||
원금을 보호. tier_2 익절 완료 후 trailing stop으로 전환하여 추세 끝단 보유. TAKE_PROFIT_LADDER_V2.action_on_trigger에서
|
||
참조.
|
||
|
||
'
|
||
inputs:
|
||
- field: average_cost
|
||
unit: KRW_per_share
|
||
- field: tier_completed
|
||
unit: enum [tier_1, tier_2]
|
||
- field: highest_price_since_entry
|
||
unit: KRW_per_share
|
||
optional: true
|
||
note: tier_2 완료 후 TRAILING_STOP_PRICE_V1 호출 시 필요
|
||
- field: atr20
|
||
unit: KRW_per_share
|
||
optional: true
|
||
rules:
|
||
tier_1_completed:
|
||
expression: ratchet_stop_price = average_cost
|
||
label: 본절 보호 — 원금 방어선으로 상향
|
||
rationale: tier_1(1.5R) 도달 시 원금 손실 구간 탈출. 손절이 더 이상 손실 없음.
|
||
tier_2_completed:
|
||
expression: ratchet_stop_price = TRAILING_STOP_PRICE_V1 result
|
||
label: trailing stop 전환 — 추세 끝단까지 보유
|
||
rationale: tier_2(3R) 도달 후 잔여는 trailing stop으로 추세 추종.
|
||
output:
|
||
field: ratchet_stop_price
|
||
unit: KRW_per_share
|
||
missing_policy:
|
||
average_cost: NO_RATCHET_PRICE
|
||
atr20: tier_2일 때 TRAILING_STOP_PRICE_V1 미산출. DATA_MISSING 표기 후 본절 유지.
|
||
tier_completed_missing: NO_RATCHET_PRICE — tier 완료 여부 미확인 시 적용 금지
|
||
prohibition:
|
||
- 이 공식 외 임의 레이블(profit_lock_ratchet, 차트 지지선 등)로 보호스탑 생성 금지
|
||
- tier_1 미완료 상태에서 본절 보호선 조기 적용 금지
|
||
- tier_completed 명시 없이 ratchet_stop_price 산출 금지
|
||
canonical_ref: spec/exit/take_profit.yaml:take_profit.tiered_ladder
|
||
version: 2026-05-18_AUDIT_RESPONSE_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- average_cost
|
||
- tier_completed
|
||
- highest_price_since_entry
|
||
- atr20
|
||
output_fields:
|
||
- ratchet_stop_price
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
TAKE_PROFIT_LADDER_V1:
|
||
purpose: 평단·보유수량 기준 3단계 익절 가격과 정수 수량 계산
|
||
inputs:
|
||
- field: average_cost
|
||
unit: KRW_per_share
|
||
- field: quantity
|
||
unit: shares
|
||
- field: position_class
|
||
unit: enum
|
||
output:
|
||
field: take_profit_ladder
|
||
unit: object
|
||
rules:
|
||
core:
|
||
tier_1:
|
||
price_expression: average_cost * 1.15
|
||
quantity_expression: floor(quantity * 0.25)
|
||
tier_2:
|
||
price_expression: average_cost * 1.25
|
||
quantity_expression: floor((quantity - tier_1_quantity) * 0.40)
|
||
tier_3:
|
||
price_expression: TRAILING_STOP_PRICE_V1
|
||
quantity_expression: quantity - tier_1_quantity - tier_2_quantity
|
||
satellite:
|
||
tier_1:
|
||
price_expression: average_cost * 1.10
|
||
quantity_expression: floor(quantity * 0.50)
|
||
tier_2:
|
||
price_expression: average_cost * 1.20
|
||
quantity_expression: floor((quantity - tier_1_quantity) * 0.50)
|
||
tier_3:
|
||
price_expression: TRAILING_STOP_PRICE_V1 or time_stop
|
||
quantity_expression: quantity - tier_1_quantity - tier_2_quantity
|
||
missing_policy:
|
||
average_cost: NO_TAKE_PROFIT_PRICE
|
||
quantity: NO_TAKE_PROFIT_QUANTITY
|
||
canonical_ref: spec/exit/take_profit.yaml:take_profit.tiered_ladder
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- average_cost
|
||
- quantity
|
||
- position_class
|
||
output_fields:
|
||
- take_profit_ladder
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
TAKE_PROFIT_LADDER_V2:
|
||
purpose: '평단·ATR20·보유수량 기준 3단계 익절 가격과 정수 수량 계산. 각 단계 가격 = max(고정% 기준가, ATR R-Multiple
|
||
기준가). 고정% 최저선을 보장하면서도 고변동성 종목은 ATR 기반으로 더 늦게 익절. ATR 미확인 시 TAKE_PROFIT_LADDER_V1(고정%
|
||
전용)으로 자동 fallback.
|
||
|
||
'
|
||
design_rationale: 'R = ATR20 (1일 평균 변동폭 = 1 위험단위). 1.5R 도달 = 손절 리스크(1R)의 1.5배
|
||
수익 → 본절 스탑 상향 근거 확보. 3.0R 도달 = 확실한 수익 구간. 고정% 최저선(코어+15%, 위성+10%) 보장으로 저변동성
|
||
종목이 너무 일찍 익절되는 것을 방지한다.
|
||
|
||
'
|
||
inputs:
|
||
- field: average_cost
|
||
unit: KRW_per_share
|
||
- field: atr20
|
||
unit: KRW_per_share
|
||
optional: true
|
||
- field: quantity
|
||
unit: shares
|
||
- field: position_class
|
||
unit: enum
|
||
derived_fields:
|
||
r_unit: 'atr20 # 1R = ATR20 (1일 평균 변동폭)'
|
||
atr_tier1_price: 'average_cost + atr20 * 1.5 # 1.5R 수익점'
|
||
atr_tier2_price: 'average_cost + atr20 * 3.0 # 3.0R 수익점'
|
||
break_even_trigger: 'atr_tier1_price # 1.5R 도달 시 손절선 → 본절 상향'
|
||
output:
|
||
field: take_profit_ladder_v2
|
||
unit: object
|
||
rules:
|
||
core:
|
||
tier_1:
|
||
price_expression: max(average_cost * 1.15, average_cost + atr20 * 1.5)
|
||
quantity_expression: floor(quantity * 0.25)
|
||
action_on_trigger: 25% 익절 + 손절선 본절(average_cost)로 즉시 상향
|
||
rationale: 1.5R 이상이면 리스크 무위험 상태 전환. 고정% 최저선 +15% 보장.
|
||
tier_2:
|
||
price_expression: max(average_cost * 1.25, average_cost + atr20 * 3.0)
|
||
quantity_expression: floor((quantity - tier_1_quantity) * 0.40)
|
||
action_on_trigger: 40% 추가 익절
|
||
rationale: 3.0R = 확실한 수익 구간. 고정% 최저선 +25% 보장.
|
||
tier_3:
|
||
price_expression: TRAILING_STOP_PRICE_V1
|
||
quantity_expression: quantity - tier_1_quantity - tier_2_quantity
|
||
action_on_trigger: 잔여 전량 trailing으로 추세 끝단까지 보유
|
||
satellite:
|
||
tier_1:
|
||
price_expression: max(average_cost * 1.10, average_cost + atr20 * 1.5)
|
||
quantity_expression: floor(quantity * 0.33)
|
||
action_on_trigger: 33% 익절 + 손절선 본절 상향. 잔여 67% 추세 추종.
|
||
rationale: '위성 50% 즉시 익절(V1)은 단기 익절 편향. V2에서 33%로 조정하여 중장기 추세 추종 원칙에 부합.
|
||
1.5R이면 무위험 상태로 전환 후 보유 연장.
|
||
|
||
'
|
||
tier_2:
|
||
price_expression: max(average_cost * 1.20, average_cost + atr20 * 3.0)
|
||
quantity_expression: floor((quantity - tier_1_quantity) * 0.50)
|
||
action_on_trigger: 50% 추가 익절
|
||
tier_3:
|
||
price_expression: TRAILING_STOP_PRICE_V1 or time_stop
|
||
quantity_expression: quantity - tier_1_quantity - tier_2_quantity
|
||
action_on_trigger: 잔여 전량 trailing or time_stop 청산
|
||
missing_policy:
|
||
atr20: 'TAKE_PROFIT_LADDER_V1 fallback. DATA_MISSING_ATR 태그 출력. fixed_pct 가격만
|
||
산출 (tier_1: +10%/+15%, tier_2: +20%/+25%).
|
||
|
||
'
|
||
average_cost: NO_TAKE_PROFIT_PRICE
|
||
quantity: NO_TAKE_PROFIT_QUANTITY
|
||
output_columns:
|
||
- 계좌
|
||
- 종목명
|
||
- 평단(원)
|
||
- ATR20(원)
|
||
- 1R(%)
|
||
- tier_1_ATR가격
|
||
- tier_1_고정%가격
|
||
- tier_1_최종가격(max)
|
||
- tier_1_수량
|
||
- tier_2_ATR가격
|
||
- tier_2_고정%가격
|
||
- tier_2_최종가격(max)
|
||
- tier_2_수량
|
||
- tier_3_기준가(원)
|
||
- 잔여수량
|
||
canonical_ref: spec/exit/take_profit.yaml:take_profit.tiered_ladder
|
||
version: 2026-05-18_ADVANCED_EXIT_V2
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- average_cost
|
||
- atr20
|
||
- quantity
|
||
- position_class
|
||
output_fields:
|
||
- take_profit_ladder_v2
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
DIVERGENCE_SCORE_V1:
|
||
purpose: '가격이 MA20 위로 상승하는 국면에서 외국인·기관이 동반 이탈하고 flow_credit이 낮으면 개인이 받아주는 취약한
|
||
구조임을 0~1 점수로 계량화. 코스피 상승 중에도 경고가 나와야 하는 핵심 선제 레이더.
|
||
|
||
'
|
||
applicable: 보유 종목 분석 시 항상 실행. 매수/매도 요청 불문.
|
||
inputs:
|
||
- field: close_price
|
||
unit: KRW_per_share
|
||
- field: ma20
|
||
unit: KRW_per_share
|
||
- field: frg_5d_sh
|
||
unit: shares
|
||
- field: inst_5d_sh
|
||
unit: shares
|
||
- field: flow_credit
|
||
unit: ratio_0_1
|
||
note: FLOW_CREDIT_V1 결과
|
||
- field: frg_20d_sh
|
||
unit: shares
|
||
optional: true
|
||
note: 존재 시 추세 확인 가중치 상향
|
||
derived_flags:
|
||
price_above_ma20: 1 if close_price > ma20 else 0
|
||
foreign_net_sell: 1 if frg_5d_sh < 0 else 0
|
||
institution_net_sell: 1 if inst_5d_sh < 0 else 0
|
||
flow_quality_low: 1 if flow_credit < 0.40 else 0
|
||
expression: "divergence_score = price_above_ma20 *\n (foreign_net_sell * 0.40\
|
||
\ + institution_net_sell * 0.30 + flow_quality_low * 0.30)\n"
|
||
output:
|
||
field: divergence_score
|
||
unit: ratio_0_1
|
||
gates:
|
||
- if: divergence_score >= 0.70
|
||
status: DIVERGENCE_ALERT
|
||
note: 20D 동반 이탈 확인 시 임계값 0.60으로 하향
|
||
- if: 0.40 <= divergence_score < 0.70
|
||
status: DIVERGENCE_CAUTION
|
||
- if: divergence_score < 0.40 OR price_above_ma20 == 0
|
||
status: PASS
|
||
missing_policy:
|
||
frg_5d_sh: W1 DATA_MISSING. 레이더 결과 무효.
|
||
inst_5d_sh: foreign_net_sell만 사용 (inst 가중치 0 처리)
|
||
flow_credit: FLOW_CREDIT_V1 먼저 실행 후 재시도
|
||
frg_20d_sh: DATA_MISSING 시 5D 기준만 적용. 임계값 0.70 유지.
|
||
canonical_ref: spec/exit/proactive_exit_radar.yaml:divergence_alert
|
||
version: 2026-05-19_PROACTIVE_RADAR_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- close_price
|
||
- ma20
|
||
- frg_5d_sh
|
||
- inst_5d_sh
|
||
- flow_credit
|
||
- frg_20d_sh
|
||
output_fields:
|
||
- divergence_score
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
OVERHANG_PRESSURE_V1:
|
||
purpose: '외국인 매도 속도가 최근 20D 평균 대비 급가속하면서 거래대금이 감소하면 오버행(대기 매도 물량) 누적으로 가격 지지 실패
|
||
가능성을 사전 경고.
|
||
|
||
'
|
||
applicable: 보유 종목 분석 시 항상 실행.
|
||
inputs:
|
||
- field: frg_5d_sh
|
||
unit: shares
|
||
- field: frg_20d_sh
|
||
unit: shares
|
||
optional: true
|
||
- field: volume
|
||
unit: shares
|
||
- field: avg_volume_5d
|
||
unit: shares
|
||
- field: flow_credit
|
||
unit: ratio_0_1
|
||
optional: true
|
||
derived_flags:
|
||
selling_acceleration:
|
||
with_20d: 'frg_5d_sh < 0 AND frg_20d_sh < 0 AND frg_5d_sh < (frg_20d_sh /
|
||
4) * (-1.5)
|
||
|
||
'
|
||
without_20d_fallback: 'frg_5d_sh < -500000 # 절대값 기준 임시 적용 OR flow_credit
|
||
< 0.30
|
||
|
||
'
|
||
volume_weakness: volume < avg_volume_5d * 0.80
|
||
overhang_score:
|
||
expression: '(selling_acceleration ? 0.60 : 0) + (volume_weakness ? 0.40 : 0)'
|
||
output:
|
||
field: overhang_score
|
||
unit: ratio_0_1
|
||
gates:
|
||
- if: overhang_score >= 1.00
|
||
status: OVERHANG_ALERT
|
||
note: 매도 가속 + 거래대금 감소 동시 발생
|
||
- if: overhang_score >= 0.60
|
||
status: OVERHANG_CAUTION
|
||
note: 둘 중 하나만 발생
|
||
- if: overhang_score < 0.60
|
||
status: PASS
|
||
missing_policy:
|
||
frg_5d_sh: W2 DATA_MISSING. 레이더 결과 무효.
|
||
avg_volume_5d: volume_weakness=false 처리 (보수적)
|
||
frg_20d_sh: DATA_MISSING 시 fallback 기준 적용
|
||
cross_alert:
|
||
rule: W1_DIVERGENCE_ALERT + W2_OVERHANG_ALERT 동시 → CRITICAL_ALERT 상향
|
||
output_tag: '[W1+W2_CRITICAL_ALERT]'
|
||
canonical_ref: spec/exit/proactive_exit_radar.yaml:overhang_warning
|
||
version: 2026-05-19_PROACTIVE_RADAR_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- frg_5d_sh
|
||
- frg_20d_sh
|
||
- volume
|
||
- avg_volume_5d
|
||
- flow_credit
|
||
output_fields:
|
||
- overhang_score
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
SECTOR_ROTATION_RADAR_V1:
|
||
purpose: '보유 섹터의 SmartMoney 5D 점수가 -0.5 이하로 하락하고 타 섹터로 자금이 이동하는 로테이션 초기 신호를 포착한다.
|
||
주가 꺾임보다 2~4주 선행하는 수급 선행 지표.
|
||
|
||
'
|
||
applicable: 보유 종목의 sector_flow 데이터 존재 시 실행.
|
||
inputs:
|
||
- field: sector_smartmoney_5d
|
||
unit: normalized_score
|
||
source: sector_flow 탭 — 보유 종목 섹터
|
||
- field: sector_rank
|
||
unit: integer
|
||
optional: true
|
||
note: 이전 주 대비 순위 변화
|
||
- field: sector_top2_names
|
||
unit: list
|
||
optional: true
|
||
note: 자금 유입 상위 2개 섹터
|
||
derived_flags:
|
||
held_sector_outflow: sector_smartmoney_5d < -0.50
|
||
rank_deterioration: sector_rank가 이전 주 대비 2단계 이상 하락
|
||
rotation_destination: sector_top2_names에 보유 종목 섹터 없음
|
||
gates:
|
||
- if: held_sector_outflow AND (rank_deterioration OR rotation_destination)
|
||
status: ROTATION_ALERT
|
||
note: 선제 TRIM 최적 시점. tier_1 익절 미실행 즉시 검토.
|
||
- if: held_sector_outflow AND NOT rank_deterioration AND NOT rotation_destination
|
||
status: ROTATION_CAUTION
|
||
note: 초기 신호. 다음 5D 업데이트 후 재확인.
|
||
- if: NOT held_sector_outflow
|
||
status: PASS
|
||
output:
|
||
field: rotation_radar_status
|
||
unit: enum
|
||
missing_policy:
|
||
sector_flow_missing: W3 DATA_MISSING. sector_flow 탭 점검 권고.
|
||
cross_alert:
|
||
rule: W3_ROTATION_ALERT + (W1 OR W2 ALERT) 동시 → CRITICAL_ALERT
|
||
output_tag: '[W3+CRITICAL_ALERT: 섹터 로테이션 + 수급 이탈 동시. 익절 최적 시점.]'
|
||
canonical_ref: spec/exit/proactive_exit_radar.yaml:sector_rotation_radar
|
||
version: 2026-05-19_PROACTIVE_RADAR_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- sector_smartmoney_5d
|
||
- sector_rank
|
||
- sector_top2_names
|
||
output_fields:
|
||
- rotation_radar_status
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
FLOW_ACCELERATION_V1:
|
||
purpose: '가격 상승 중 외국인 매수 강도가 20D 평균 대비 급격히 둔화되는 에너지 소진(Distribution) 초기 신호를 포착.
|
||
W1보다 선행. W1(방향 전환) 이전에 설거지 구간을 조기 경고.
|
||
|
||
'
|
||
applicable: 보유 포지션 분석 시 항상 실행. W1/W2/W3와 동시.
|
||
inputs:
|
||
- field: frg_5d_sh
|
||
unit: shares
|
||
note: 외국인 5D 순매수
|
||
- field: frg_20d_sh
|
||
unit: shares
|
||
note: 외국인 20D 누적 순매수
|
||
- field: close_price
|
||
unit: KRW_per_share
|
||
- field: ma20
|
||
unit: KRW_per_share
|
||
derived_flags:
|
||
buy_energy_20d_avg: 'frg_20d_sh / 4 # 20D 평균의 5D 기대값'
|
||
flow_accel_ratio: frg_5d_sh / buy_energy_20d_avg (>0인 경우)
|
||
price_above_ma20: 1 if close_price > ma20 else 0
|
||
gates:
|
||
- if: price_above_ma20 AND frg_5d_sh > 0 AND flow_accel_ratio < 0.50
|
||
status: FLOW_DECEL_WARNING
|
||
note: 매수 에너지 20D 평균 절반 미만. 설거지 초기. W1과 동시 발화 시 CRITICAL_ALERT.
|
||
- if: price_above_ma20 AND frg_5d_sh <= 0
|
||
status: W1_DOMAIN
|
||
note: 순매도 전환 -- W1 DIVERGENCE_SCORE_V1 처리
|
||
- if: NOT price_above_ma20 OR buy_energy_20d_avg <= 0
|
||
status: PASS
|
||
output:
|
||
field: flow_acceleration_status
|
||
unit: enum
|
||
cross_alert:
|
||
rule: FLOW_DECEL_WARNING + W1_DIVERGENCE_ALERT -> CRITICAL_ALERT
|
||
output_tag: '[W4+W1_CRITICAL: 설거지 에너지 소진 + 수급 이탈 동시]'
|
||
missing_policy:
|
||
frg_20d_sh: W4 DATA_MISSING. 가속도 산출 불가.
|
||
frg_5d_sh: W4 DATA_MISSING.
|
||
canonical_ref: spec/exit/proactive_exit_radar.yaml:flow_acceleration_radar
|
||
version: 2026-05-19_ALPHA_SHIELD_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- frg_5d_sh
|
||
- frg_20d_sh
|
||
- close_price
|
||
- ma20
|
||
output_fields:
|
||
- flow_acceleration_status
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
RS_RATIO_V1:
|
||
purpose: '종목의 5D 수익률을 KOSPI 5D 수익률로 나눠 상대강도(RS)를 계산한다. sell_priority_engine의 rw_ge_4_or_rs_laggard
|
||
판정 공식. RS 강세 종목(rs_ratio >= 1.20)은 손실 중에도 매도 후순위로 보호.
|
||
|
||
'
|
||
applicable: 매도 후보 종목 분석 시 항상 실행.
|
||
inputs:
|
||
- field: stock_close_5d_return
|
||
unit: ratio
|
||
note: (close - close_5d_ago) / close_5d_ago
|
||
- field: kospi_close_5d_return
|
||
unit: ratio
|
||
note: KOSPI 기준 동일 계산
|
||
expression: 'rs_ratio = stock_close_5d_return / kospi_close_5d_return (kospi_close_5d_return
|
||
== 0 이면 1.0 처리)
|
||
|
||
'
|
||
output:
|
||
field: rs_ratio
|
||
unit: ratio
|
||
gates:
|
||
- if: rs_ratio >= 1.20
|
||
status: RS_LEADER
|
||
note: 시장 대비 20%+ 강세. sell_priority 보호. core_quality_protection에 준하는 후순위.
|
||
- if: 0.80 <= rs_ratio < 1.20
|
||
status: RS_NEUTRAL
|
||
- if: rs_ratio < 0.80
|
||
status: RS_LAGGARD
|
||
note: '시장 대비 20%+ 약세. rw_ge_4_or_rs_laggard: 35점 발동.'
|
||
missing_policy:
|
||
stock_close_5d_return: RS_LAGGARD=false (보수적). 데이터 확보 후 재산출.
|
||
kospi_close_5d_return: RS_LAGGARD=false (보수적).
|
||
canonical_ref: spec/risk/portfolio_exposure.yaml:sell_priority_engine.components.weakness_points
|
||
version: 2026-05-19_ALPHA_SHIELD_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- stock_close_5d_return
|
||
- kospi_close_5d_return
|
||
output_fields:
|
||
- rs_ratio
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
RS_VERDICT_V1:
|
||
purpose: '종목의 10일 수익률을 KOSPI 10일 수익률과 비교해 초과 수익률(excess_ret_10d)을 계산하고 LEADER/MARKET/LAGGARD/BROKEN
|
||
4단계 판정을 내린다. composite_verdict, SFG_V1, RAG_V1의 선행 입력으로 사용된다.
|
||
|
||
'
|
||
applicable: 매 buildTickerRow_ 실행 시 _addTickerGates_ 내에서 계산. LLM 재계산 금지.
|
||
inputs:
|
||
- field: price.ret10D
|
||
unit: pct
|
||
note: 종목 10일 수익률
|
||
- field: globalKospiRet10D_
|
||
unit: pct
|
||
note: KOSPI 10일 수익률 (preReads)
|
||
- field: rw_partial
|
||
unit: int_0_5
|
||
note: 상대약세 청산 신호 합계
|
||
- field: flow_credit
|
||
unit: ratio_0_1
|
||
note: FLOW_CREDIT_V1 결과
|
||
derived:
|
||
excess_ret_10d: (price.ret10D - globalKospiRet10D_) if both available else null
|
||
gates:
|
||
- if: excess_ret_10d < -10 AND rw_partial >= 3
|
||
verdict: BROKEN
|
||
note: 구조적 이탈
|
||
- if: excess_ret_10d < -3 OR (excess_ret_10d < 0 AND rw_partial >= 3)
|
||
verdict: LAGGARD
|
||
note: 시장 대비 약세
|
||
- if: excess_ret_10d > 3 AND flowCredit >= 0.6
|
||
verdict: LEADER
|
||
note: 시장 대비 강세
|
||
- if: otherwise
|
||
verdict: MARKET
|
||
note: 시장 중립
|
||
output:
|
||
field: rs_verdict
|
||
unit: enum [LEADER, MARKET, LAGGARD, BROKEN, UNKNOWN]
|
||
additional_fields:
|
||
- excess_ret_10d
|
||
missing_policy:
|
||
price.ret10D: rs_verdict = UNKNOWN. composite_verdict = WATCH_CANDIDATE.
|
||
globalKospiRet10D_: rs_verdict = UNKNOWN.
|
||
ground_truth: harness
|
||
llm_allowed: cite_only
|
||
prohibition:
|
||
- LLM이 뉴스·차트 감각으로 rs_verdict를 LEADER로 상향 금지
|
||
- rs_verdict = BROKEN 종목을 'RS가 곧 회복될 것'으로 임의 완화 금지
|
||
canonical_ref: spec/risk/portfolio_exposure.yaml:sell_priority_engine.weakness_points
|
||
version: 2026-05-21_CLA_HARNESS_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- price.ret10D
|
||
- globalKospiRet10D_
|
||
- rw_partial
|
||
- flow_credit
|
||
output_fields:
|
||
- rs_verdict
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
SATELLITE_LIFECYCLE_GATE_V1:
|
||
purpose: '위성 종목에 WATCH/PILOT/CONFIRMED/REVIEW/EXIT 5단계 라이프사이클을 부여한다. 각 단계는 전환
|
||
조건, 허용 액션, 보유 기준이 명확히 다르다. 이진 CORE/SATELLITE 분류를 확장하며 기존 분류와 병렬 적용.
|
||
|
||
'
|
||
applicable: _addTickerGates_ 내 COMPOSITE_VERDICT_V1 이후 실행.
|
||
inputs:
|
||
- field: ticker
|
||
unit: string
|
||
- field: composite_verdict
|
||
unit: enum
|
||
- field: brt_verdict
|
||
unit: enum
|
||
- field: excess_drawdown_pctp
|
||
unit: pct_points
|
||
- field: entry_date
|
||
unit: date
|
||
- field: alpha_evaluation_window_json
|
||
unit: array
|
||
optional: true
|
||
output:
|
||
field: satellite_lifecycle_stage
|
||
additional_fields:
|
||
- lifecycle_transition_reason
|
||
- lifecycle_days_in_stage
|
||
- review_warning
|
||
lifecycle_stages:
|
||
WATCH:
|
||
definition: 관심종목. 미투자. SAQG_V1 ELIGIBLE 미달.
|
||
transition_to_PILOT: saqg_v1=ELIGIBLE AND rag_v1=PASS AND brt_verdict IN [LEADER,MARKET]
|
||
allowed_actions:
|
||
- WATCH
|
||
PILOT:
|
||
definition: 소액 파일럿. T1 트랜치 30% 진입.
|
||
transition_to_CONFIRMED: t20_vs_core_pctp >= 0 AND brt_verdict=LEADER AND
|
||
composite_verdict=PRIME_CANDIDATE
|
||
transition_to_REVIEW: t5_alpha_gate=alpha_negative 연속2회 OR brt_verdict=LAGGARD
|
||
OR excess_drawdown_pctp > 8
|
||
allowed_actions:
|
||
- HOLD_PILOT
|
||
- ADD_T2_IF_CONFIRMED
|
||
CONFIRMED:
|
||
definition: 알파 검증됨. 정규 비중 편입.
|
||
transition_to_REVIEW: t20_vs_core_pctp < -5 OR brt_verdict=LAGGARD OR composite_verdict=REDUCE_CANDIDATE
|
||
allowed_actions:
|
||
- HOLD
|
||
- ADD_T2
|
||
- ADD_T3
|
||
- PARTIAL_TP
|
||
REVIEW:
|
||
definition: 알파 훼손. 감시, 축소 모드.
|
||
transition_to_CONFIRMED: brt_verdict=LEADER 연속2주 AND composite_verdict=PRIME_CANDIDATE
|
||
transition_to_EXIT: brt_verdict=BROKEN OR composite_verdict=CLOSE_POSITION
|
||
OR t20_vs_core_pctp < -10 OR excess_drawdown_pctp >= 15
|
||
forced_reduce: 4주 이상 REVIEW 시 비중 50% 감축 권고
|
||
allowed_actions:
|
||
- HOLD_REDUCED
|
||
- TRIM_ON_REBOUND
|
||
- NO_ADD
|
||
EXIT:
|
||
definition: 정리 확정. 다음 반등 시 전량 청산.
|
||
allowed_actions:
|
||
- FULL_EXIT_ON_TRIGGER
|
||
- STAGED_EXIT
|
||
prevent: EXIT 진입 후 LLM이 단계 복귀 금지
|
||
output_fields:
|
||
- field: satellite_lifecycle_stage
|
||
unit: enum [WATCH,PILOT,CONFIRMED,REVIEW,EXIT]
|
||
- field: lifecycle_transition_reason
|
||
unit: string
|
||
- field: lifecycle_days_in_stage
|
||
unit: int
|
||
hard_rules:
|
||
- EXIT 단계 종목에 신규 ADD/BUY 금지
|
||
- REVIEW 단계 종목에 T3 트랜치 진입 금지
|
||
ground_truth: harness
|
||
llm_allowed: cite_only
|
||
prohibition:
|
||
- LLM이 lifecycle_stage 임의 격상 금지
|
||
- EXIT -> CONFIRMED 복귀는 하네스 재산출 후만 가능
|
||
version: 2026-05-21_SLG_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- ticker
|
||
- composite_verdict
|
||
- brt_verdict
|
||
- excess_drawdown_pctp
|
||
- entry_date
|
||
- alpha_evaluation_window_json
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
CLA_REGIME_EXIT_CONDITION_V1:
|
||
purpose: 'CONCENTRATED_LEADER_ADVANCE 국면의 종료 조건을 결정론적으로 탐지한다. CLA 활성 중에도 하네스가
|
||
주기적으로 종료 신호(S1~S5)를 스캔한다. 종료 조건 충족 시 market_regime을 CLA -> NEUTRAL 전환 권고.
|
||
|
||
'
|
||
applicable: buildHarnessContext_ 내 market_regime=CLA일 때만 실행.
|
||
inputs:
|
||
- field: ticker
|
||
unit: string
|
||
- field: rs_verdict
|
||
unit: enum
|
||
- field: brt_verdict
|
||
unit: enum
|
||
- field: frg_5d_sh
|
||
unit: shares
|
||
- field: volume
|
||
unit: shares
|
||
- field: avg_volume_5d
|
||
unit: shares
|
||
- field: market_regime
|
||
unit: string
|
||
output:
|
||
field: cla_exit_status
|
||
additional_fields:
|
||
- cla_exit_signals_triggered
|
||
- cla_exit_total_weight
|
||
exit_signals:
|
||
S1_rs_degradation:
|
||
condition: (삼성전자 OR SK하이닉스 rs_verdict=LAGGARD) 연속5영업일
|
||
weight: 3
|
||
S2_kospi_contribution_drop:
|
||
condition: 삼성전자+SK하이닉스 최근20D KOSPI 기여도 < 30%
|
||
weight: 2
|
||
S3_foreign_flow_reversal:
|
||
condition: 삼성전자 frg_5d_sh < 0 AND SK하이닉스 frg_5d_sh < 0 연속3일
|
||
weight: 2
|
||
S4_volume_exhaustion:
|
||
condition: 삼성전자+SK하이닉스 volume < avgVolume5d*0.6 연속3일
|
||
weight: 1
|
||
S5_brt_degradation:
|
||
condition: 삼성전자 brt_verdict=MARKET AND SK하이닉스 brt_verdict=MARKET (LEADER에서
|
||
하락)
|
||
weight: 2
|
||
exit_decision:
|
||
CLA_EXIT_CONFIRMED:
|
||
condition: total_weight >= 5
|
||
action: market_regime -> NEUTRAL 권고. O2 반도체 25% 상한 재적용.
|
||
CLA_EXIT_WARNING:
|
||
condition: total_weight IN [3,4]
|
||
action: CLA 종료 경보. 위성 신규매수 제한 해제 준비.
|
||
CLA_ACTIVE:
|
||
condition: total_weight < 3
|
||
action: CLA 계속 유지. 기존 보호 규칙 적용.
|
||
output_fields:
|
||
- field: cla_exit_status
|
||
unit: enum [CLA_ACTIVE,CLA_EXIT_WARNING,CLA_EXIT_CONFIRMED]
|
||
- field: cla_exit_signals_triggered
|
||
unit: list
|
||
- field: cla_exit_total_weight
|
||
unit: int
|
||
ground_truth: harness
|
||
llm_allowed: cite_only
|
||
prohibition:
|
||
- LLM이 CLA 종료를 임의 선언 금지
|
||
- CLA_EXIT_CONFIRMED 없이 O2 반도체 25% 상한 재적용 금지
|
||
version: 2026-05-21_CLA_EXIT_V1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- ticker
|
||
- rs_verdict
|
||
- brt_verdict
|
||
- frg_5d_sh
|
||
- volume
|
||
- avg_volume_5d
|
||
- market_regime
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
SELL_PRICE_SANITY_V1:
|
||
purpose: 'HTS 입력 전 매도 지정가의 역전, 비현실가, 호가단위 불일치를 100% 차단한다. LS전기(E1 오류) 재발 방지: 지정가
|
||
< 손절가 역전 사례를 하네스가 선점 차단.
|
||
|
||
'
|
||
applicable: calcApexExecutionHarness_ 주문 최종 검증 단계. TICK_NORMALIZER_V1 직후 실행.
|
||
inputs:
|
||
- field: sell_limit_price
|
||
unit: KRW_per_share
|
||
- field: stop_loss_price
|
||
unit: KRW_per_share
|
||
- field: current_price
|
||
unit: KRW_per_share
|
||
- field: tick_unit
|
||
unit: KRW_per_share
|
||
note: TICK_NORMALIZER_V1 산출값
|
||
validation_rules:
|
||
INVALID_PRICE_INVERSION:
|
||
condition: sell_limit_price < stop_loss_price
|
||
action: HTS 주문표 제거. Shadow Ledger 이동. reason_code=INVALID_PRICE_INVERSION.
|
||
example: 지정가 261,000 < 손절가 291,000 → 즉시 차단
|
||
INVALID_CHASE_UP_SELL:
|
||
condition: sell_limit_price > current_price * 1.03
|
||
action: 사용자 Override 없이 주문표 제거.
|
||
INVALID_TICK:
|
||
condition: sell_limit_price % tick_unit != 0
|
||
action: TICK_NORMALIZER_V1 자동 재정규화 후 재산출. (HS008 통합)
|
||
WARN_DEEP_DISCOUNT_SELL:
|
||
condition: sell_limit_price < current_price * 0.90
|
||
action: 주문표 유지, 보고서 상단 경고 표시.
|
||
output:
|
||
field: sell_price_sanity_status
|
||
values:
|
||
- PASS
|
||
- INVALID_PRICE_INVERSION
|
||
- INVALID_CHASE_UP_SELL
|
||
- INVALID_TICK
|
||
- WARN_DEEP_DISCOUNT_SELL
|
||
additional_fields:
|
||
- sanity_fail_reason
|
||
- corrected_limit_price
|
||
ground_truth: harness
|
||
llm_allowed: cite_only
|
||
prohibition:
|
||
- INVALID_PRICE_INVERSION 행을 HTS 주문표에 기재 금지
|
||
- LLM이 '임시로' 역전 가격을 주문표에 넣는 행위 절대 금지
|
||
- TICK 재정규화 전 가격을 HTS에 입력 금지 (HS008)
|
||
canonical_ref: AGENTS.md:Direction A1, HS008(TICK_NORMALIZER_V1)
|
||
version: 2026-05-22_3RD_HARNESS
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- sell_limit_price
|
||
- stop_loss_price
|
||
- current_price
|
||
- tick_unit
|
||
output_fields:
|
||
- sell_price_sanity_status
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
DISTRIBUTION_SELL_DETECTOR_V1:
|
||
purpose: 'PRE_DISTRIBUTION_EARLY_WARNING(2신호)의 정밀도 한계 보완. 기관·외인이 개인에게 물량을 넘기는
|
||
설거지 구간을 6신호 합산으로 조기 감지.
|
||
|
||
'
|
||
applicable: _addTickerGates_ 내 FLOW_ACCELERATION_V1 직후.
|
||
inputs:
|
||
- field: close
|
||
unit: KRW_per_share
|
||
- field: high52w
|
||
unit: KRW_per_share
|
||
optional: true
|
||
- field: avg_volume_5d
|
||
unit: shares
|
||
- field: volume
|
||
unit: shares
|
||
- field: ret5d
|
||
unit: percent
|
||
- field: flow_credit
|
||
unit: ratio_0_1
|
||
- field: frg_5d_sh
|
||
unit: shares
|
||
- field: inst_5d_sh
|
||
unit: shares
|
||
- field: rsi14
|
||
unit: score_0_100
|
||
optional: true
|
||
- field: obv_slope_20d
|
||
unit: float
|
||
optional: true
|
||
signals:
|
||
SIG_1:
|
||
condition: high52w > 0 AND close >= high52w * 0.97 AND volume < avg_volume_5d
|
||
* 0.80
|
||
label: 신고가 근접 + 거래량 수축
|
||
weight: 2.0
|
||
SIG_2:
|
||
condition: ret5d >= 5 AND flow_credit < 0.45
|
||
label: 5일 급등 + 수급 약화
|
||
weight: 2.0
|
||
SIG_3:
|
||
condition: frg_5d_sh < 0 AND inst_5d_sh < 0
|
||
label: 외인+기관 동반 순매도 (3일 연속)
|
||
weight: 1.5
|
||
SIG_4:
|
||
condition: rsi14 != null AND rsi14 >= 75 AND close < open_today
|
||
label: RSI 과열 + 당일 음봉
|
||
weight: 1.5
|
||
SIG_5:
|
||
condition: obv_slope_20d != null AND obv_slope_20d < 0
|
||
label: OBV 20일 기울기 음수
|
||
weight: 1.0
|
||
SIG_6:
|
||
condition: ret1d_prev >= 5 AND close < open_today * 0.98
|
||
label: 전일 급등 후 당일 -2% 갭하락
|
||
weight: 1.0
|
||
classification:
|
||
weighted_sum: sum of (signal.weight for each triggered signal)
|
||
DISTRIBUTION_CONFIRMED:
|
||
condition: weighted_sum >= 4.0
|
||
action: BUY 완전 차단 + TRIM_REVIEW 발동
|
||
DISTRIBUTION_WARNING:
|
||
condition: weighted_sum >= 2.0 AND weighted_sum < 4.0
|
||
action: BUY 보류 권고 + EARLY_WARNING 표기
|
||
DISTRIBUTION_CLEAR:
|
||
condition: weighted_sum < 2.0
|
||
action: 정상 진행
|
||
output:
|
||
field: distribution_sell_detector_status
|
||
values:
|
||
- DISTRIBUTION_CONFIRMED
|
||
- DISTRIBUTION_WARNING
|
||
- DISTRIBUTION_CLEAR
|
||
additional_fields:
|
||
- weighted_sum
|
||
- signals_triggered
|
||
ground_truth: harness
|
||
llm_allowed: cite_only
|
||
prohibition:
|
||
- DISTRIBUTION_CONFIRMED 상태에서 LLM '단기 조정이니 괜찮다' 우회 금지
|
||
- PRE_DISTRIBUTION_EARLY_WARNING과 독립적으로 둘 다 체크 (OR 아님, AND 독립)
|
||
- LLM이 신호 합산을 직접 계산 금지
|
||
canonical_ref: AGENTS.md:Direction B3, L4(PRE_DISTRIBUTION)
|
||
version: 2026-05-22_3RD_HARNESS
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- close
|
||
- high52w
|
||
- avg_volume_5d
|
||
- volume
|
||
- ret5d
|
||
- flow_credit
|
||
- frg_5d_sh
|
||
- inst_5d_sh
|
||
- rsi14
|
||
- obv_slope_20d
|
||
output_fields:
|
||
- distribution_sell_detector_status
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
PROFIT_RATCHET_TIERED_V2:
|
||
purpose: '기존 L2(RATCHET_TRAILING_AUTO_V1)에 APEX_SUPER(+60%+) 구간 신설. 삼성전자 +61.5%(E3
|
||
오류) 재발 방지: 단순 ''보유 유지'' 서술 없이 래칫 스탑 필수 표기.
|
||
|
||
'
|
||
applicable: PROFIT_LOCK_STAGE_CLASSIFIER_V1 직후. 수익 구간별 자동 적용.
|
||
inputs:
|
||
- field: profit_pct
|
||
unit: percent
|
||
- field: profit_lock_stage
|
||
unit: enum
|
||
note: PROFIT_LOCK_STAGE_CLASSIFIER_V1 산출
|
||
- field: highest_close
|
||
unit: KRW_per_share
|
||
- field: atr20
|
||
unit: KRW_per_share
|
||
- field: average_cost
|
||
unit: KRW_per_share
|
||
- field: quantity
|
||
unit: shares
|
||
- field: secular_leader_gate_active
|
||
unit: boolean
|
||
optional: true
|
||
ratchet_table_v2:
|
||
NORMAL:
|
||
trailing_stop: 'null'
|
||
tp_ladder_action: 없음
|
||
BREAKEVEN_RATCHET:
|
||
trailing_stop: average_cost * 1.005 (세후)
|
||
tp_ladder_action: 없음
|
||
PROFIT_LOCK_10:
|
||
trailing_stop: highest_close - 2.5 * atr20
|
||
tp_ladder_action: 없음
|
||
note: '[신규 V2]'
|
||
PROFIT_LOCK_20:
|
||
trailing_stop: highest_close - 1.5 * atr20
|
||
tp_ladder_action: tp1_qty 확인
|
||
PROFIT_LOCK_30:
|
||
trailing_stop: highest_close - 1.8 * atr20
|
||
tp_ladder_action: tp1+tp2 확인
|
||
note: 'V2: 1.8 (V1: 2.0 보다 타이트)'
|
||
APEX_TRAILING:
|
||
trailing_stop: highest_close - 1.5 * atr20
|
||
tp_ladder_action: tp1+tp2 확인
|
||
note: 'V2: 1.5 (V1: 2.0 보다 타이트)'
|
||
APEX_SUPER:
|
||
condition: profit_pct >= 60
|
||
trailing_stop: max(ratchet_stop, highest_close - 1.2 * atr20)
|
||
tp_ladder_action: 강제 10% 익절 권고 (quantity * 0.10, 매 +10%마다)
|
||
llm_obligation: '보고서에 ''APEX_SUPER 구간: trailing_stop=XXX원, 10% 익절 검토'' 필수
|
||
표기'
|
||
note: '[신규 V2] +60% 초과 종목 전용. 삼성전자 현재 해당.'
|
||
SECULAR_LEADER_DEFERRED:
|
||
trailing_stop: 'null'
|
||
tp_ladder_action: H3 연동 유지
|
||
output:
|
||
field: auto_trailing_stop_v2
|
||
additional_fields:
|
||
- ratchet_stage_v2
|
||
- apex_super_active
|
||
- tp_ladder_qty_v2
|
||
ground_truth: harness
|
||
llm_allowed: cite_only
|
||
prohibition:
|
||
- APEX_SUPER 구간 종목에 '보유 유지' 단독 서술 금지 — trailing_stop 병기 필수
|
||
- LLM이 trailing_stop을 재계산 금지 — 하네스 산출값 그대로 사용
|
||
- SECULAR_LEADER_DEFERRED 구간에서 H3 규칙 무시 금지
|
||
canonical_ref: AGENTS.md:Direction E1, L2(RATCHET_TRAILING_AUTO_V1), M3
|
||
version: 2026-05-22_3RD_HARNESS
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- profit_pct
|
||
- profit_lock_stage
|
||
- highest_close
|
||
- atr20
|
||
- average_cost
|
||
- quantity
|
||
- secular_leader_gate_active
|
||
output_fields:
|
||
- auto_trailing_stop_v2
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
SELL_VALUE_PRESERVATION_TIERED_V2:
|
||
purpose: '현금확보 매도 시 ''좋은 매도''와 ''나쁜 매도''를 하네스가 자동 판별. 반등 시 추가 수익까지 고려한 세련된 매도
|
||
결정 트리 (K2 + SELL_WATERFALL 통합).
|
||
|
||
'
|
||
applicable: SELL_WATERFALL_ENGINE_V1 이후. 종목별 최적 매도 스타일 확정.
|
||
inputs:
|
||
- field: emergency_full_sell
|
||
unit: boolean
|
||
- field: oversold_gate
|
||
unit: enum
|
||
- field: rsi14
|
||
unit: score
|
||
- field: profit_lock_stage
|
||
unit: enum
|
||
- field: velocity_5d
|
||
unit: percent
|
||
- field: h2_priority_rank
|
||
unit: int
|
||
- field: rs_verdict
|
||
unit: enum
|
||
- field: cash_shortfall_min_krw
|
||
unit: KRW
|
||
- field: waterfall_plan_json
|
||
unit: json
|
||
decision_tree:
|
||
- if: emergency_full_sell == true
|
||
verdict: EMERGENCY_EXIT
|
||
plan: SELL_WATERFALL stage_4 실행
|
||
- elif: oversold_gate == OVERSOLD AND rsi14 < 30
|
||
verdict: OVERSOLD_REBOUND_SELL
|
||
plan: K2 + SELL_WATERFALL stage_2. rebound_tp_price = prev_close + 1.0 * atr20
|
||
- elif: profit_lock_stage IN [PROFIT_LOCK_20, APEX_TRAILING, APEX_SUPER] AND velocity_5d
|
||
> 8
|
||
verdict: APEX_TRIM
|
||
plan: tp_quantity_ladder.tp1_qty 즉시 매도. limit = current - 0.5 * atr20
|
||
- elif: h2_priority_rank == 1 AND rs_verdict == BROKEN
|
||
verdict: STAGED_EXIT
|
||
plan: SELL_WATERFALL stage_1 → stage_2 → stage_3 순서
|
||
- elif: cash_shortfall_min_krw > 0
|
||
verdict: PRESERVE_TIERED
|
||
plan: CASH_RECOVERY_OPTIMIZER_V1 조합 실행
|
||
- else: null
|
||
verdict: HOLD
|
||
plan: 매도 조건 미충족
|
||
output:
|
||
field: preservation_verdict
|
||
additional_fields:
|
||
- recommended_plan_ref
|
||
- rebound_upside_krw
|
||
ground_truth: harness
|
||
llm_allowed: cite_only
|
||
prohibition:
|
||
- decision_tree 순서 임의 변경 금지
|
||
- EMERGENCY_EXIT 외 조건에서 전량 즉시 매도 지시 금지
|
||
canonical_ref: AGENTS.md:Direction E2, K2, SELL_WATERFALL_ENGINE_V1
|
||
version: 2026-05-22_3RD_HARNESS
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- emergency_full_sell
|
||
- oversold_gate
|
||
- rsi14
|
||
- profit_lock_stage
|
||
- velocity_5d
|
||
- h2_priority_rank
|
||
- rs_verdict
|
||
- cash_shortfall_min_krw
|
||
- waterfall_plan_json
|
||
output_fields:
|
||
- preservation_verdict
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
VALUE_PRESERVATION_SCORER_V1:
|
||
purpose: '종목별 가치 훼손 점수(value_damage_score 0~100) + 반등 잠재력(rebound_potential 0~100)
|
||
+ 권고 동작(recommended_action)을 결정론 공식으로 산출한다. SCRS-V2 selected_combo의 빈 셀에 주입하여
|
||
LLM 자유 해석을 차단한다.
|
||
|
||
'
|
||
inputs:
|
||
- field: Close
|
||
unit: KRW_per_share
|
||
- field: MA20
|
||
unit: KRW_per_share
|
||
- field: MA60
|
||
unit: KRW_per_share
|
||
- field: ATR20
|
||
unit: KRW_per_share
|
||
- field: RSI14
|
||
unit: percent
|
||
- field: BB_Position
|
||
unit: 0to1_scale
|
||
- field: Frg_5D
|
||
unit: KRW
|
||
- field: Inst_5D
|
||
unit: KRW
|
||
- field: AvgTradeValue_5D_M
|
||
unit: KRW_hundred_million
|
||
- field: AvgTradeValue_20D_M
|
||
unit: KRW_hundred_million
|
||
- field: Recovery_Ratio_5D
|
||
unit: ratio
|
||
- field: Stock_Drawdown_From_High_Pct
|
||
unit: percent
|
||
output:
|
||
field: value_preservation_scorer_v1_json
|
||
expected_outputs:
|
||
- gate
|
||
- distinct_actions
|
||
- row_count
|
||
llm_allowed: cite_only
|
||
version: 2026-05-27_PHASE1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- Close
|
||
- MA20
|
||
- MA60
|
||
- ATR20
|
||
- RSI14
|
||
- BB_Position
|
||
- Frg_5D
|
||
- Inst_5D
|
||
- AvgTradeValue_5D_M
|
||
- AvgTradeValue_20D_M
|
||
- Recovery_Ratio_5D
|
||
- Stock_Drawdown_From_High_Pct
|
||
output_fields:
|
||
- value_preservation_scorer_v1_json
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
RATCHET_TRAILING_GENERAL_V1:
|
||
purpose: '모든 보유 종목(수익률≥0%)에 7-tier 공식으로 auto_trailing_stop을 산출한다. 기존 APEX 한정 trailing을
|
||
전 종목으로 일반화. 수익 보호 + 뒷박 재진입 차단.
|
||
|
||
'
|
||
inputs:
|
||
- field: Profit_Pct
|
||
unit: percent
|
||
- field: Close
|
||
unit: KRW_per_share
|
||
- field: ATR20
|
||
unit: KRW_per_share
|
||
- field: High52W
|
||
unit: KRW_per_share
|
||
- field: Stop_Price_Est
|
||
unit: KRW_per_share
|
||
- field: Account_Avg_Cost
|
||
unit: KRW_per_share
|
||
output:
|
||
field: ratchet_trailing_general_v1_json
|
||
expected_outputs:
|
||
- gate
|
||
- coverage_pct
|
||
llm_allowed: cite_only
|
||
version: 2026-05-27_PHASE1
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- Profit_Pct
|
||
- Close
|
||
- ATR20
|
||
- High52W
|
||
- Stop_Price_Est
|
||
- Account_Avg_Cost
|
||
output_fields:
|
||
- ratchet_trailing_general_v1_json
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
SELL_WATERFALL_ENGINE_V2:
|
||
purpose: 'V1 4단계 유지 + 호가단위 슬리피지(bps) 시뮬, TWAP/지정가 분할(유동성기반), 부분체결 잔량 자동 stage
|
||
승격(단계 건너뜀 금지).
|
||
|
||
'
|
||
output:
|
||
file: Temp/sell_waterfall_engine_v2.json
|
||
expected_outputs:
|
||
- gate
|
||
- stage_counts
|
||
- escalation_skip_violations
|
||
llm_allowed: cite_only
|
||
version: 2026-05-28_PHASE4
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields: []
|
||
output_fields: []
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
FINAL_JUDGMENT_GATE_V1:
|
||
purpose: '판단 결정론 계층 — 키스톤. 모든 게이트·신호 JSON + _harness_context를 읽어 종목별 단일 action_verdict를
|
||
AND-11 조건으로 결정론 산출. action_verdict in {BUY_PILOT, HOLD, TRIM, SELL, WATCH, BLOCKED}.
|
||
harness_key 부재 시 DATA_MISSING 명시(silent PASS 금지). effective_confidence = raw_confidence
|
||
× (0.4 + 0.6 × invest_quality/100).
|
||
|
||
'
|
||
output:
|
||
file: Temp/final_judgment_gate_v1.json
|
||
expected_outputs:
|
||
- gate
|
||
- coverage_pct
|
||
- verdict_counts
|
||
- silent_pass_violations
|
||
- late_chase_buy_violations
|
||
- ticker_count
|
||
llm_allowed: cite_only
|
||
version: 2026-05-28_PHASE6
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields: []
|
||
output_fields: []
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
VERDICT_CONSISTENCY_LOCK_V1:
|
||
purpose: '판단 일관성 잠금 — operational_report.json의 서술을 final_judgment_gate_v1.json
|
||
verdict와 대조. verdict=BLOCKED/SELL인데 보고서가 긍정 BUY 서술 → INVALID_VERDICT_OVERRIDE
|
||
위반, gate=FAIL. LLM의 verdict 자유도를 0으로 제거. 사용자 H10 수동 오버라이드는 예외.
|
||
|
||
'
|
||
output:
|
||
file: Temp/verdict_consistency_lock_v1.json
|
||
expected_outputs:
|
||
- gate
|
||
- override_count
|
||
- warn_count
|
||
- violations
|
||
llm_allowed: cite_only
|
||
version: 2026-05-28_PHASE6
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields: []
|
||
output_fields: []
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
K2_STAGED_REBOUND_SELL_V1:
|
||
purpose: '과매도 구간 현금확보 매도를 50/50 분할과 반등 대기로 구조화한다.
|
||
|
||
'
|
||
inputs:
|
||
- field: base_sell_qty
|
||
unit: shares
|
||
- field: previous_close_price
|
||
unit: KRW_per_share
|
||
- field: atr20
|
||
unit: KRW_per_share
|
||
output:
|
||
field: immediate_sell_qty
|
||
input_fields:
|
||
- baseQty
|
||
- prev_close
|
||
- atr20
|
||
expected_outputs:
|
||
- immediate_sell_qty
|
||
- rebound_wait_qty
|
||
- rebound_trigger_price
|
||
llm_allowed: cite_only
|
||
version: 2026-05-30_PHASE8
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
output_fields:
|
||
- immediate_sell_qty
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
STOP_BREACH_ALERT_V1:
|
||
purpose: '손절가 이탈 여부와 즉시 청산 경보를 결정한다.
|
||
|
||
'
|
||
inputs:
|
||
- field: close_price
|
||
unit: KRW_per_share
|
||
- field: stop_price
|
||
unit: KRW_per_share
|
||
output:
|
||
field: stop_breach_gate
|
||
input_fields:
|
||
- close
|
||
- stop_price
|
||
expected_outputs:
|
||
- stop_breach_gate
|
||
- gap_pct
|
||
llm_allowed: cite_only
|
||
version: 2026-05-30_PHASE8
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
output_fields:
|
||
- stop_breach_gate
|
||
missing_policy: DATA_MISSING. 계산 결과를 추정하지 않는다.
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|
||
REBOUND_CAPTURE_THESIS_FACTOR_V1:
|
||
purpose: 과매도 반등 진입을 thesis 팩터로 명시 — 영구 약세편향 해소 (Direction SFP1)
|
||
agents_md_ref: 'Direction SFP1: SINGLE_FACTOR_DOMINANCE_CAP_V1 — REBOUND_CAPTURE
|
||
thesis 반영'
|
||
inputs:
|
||
- field: rsi14
|
||
unit: index_0_100
|
||
- field: current_price
|
||
unit: KRW_per_share
|
||
- field: ma20
|
||
unit: KRW_per_share
|
||
- field: flow_credit
|
||
unit: ratio_0_1
|
||
- field: down_streak
|
||
unit: days_integer
|
||
expression: thesis_bonus = 15.0 if (25<=rsi14<=40) AND (current_price<=ma20*1.03)
|
||
AND (flow_credit>=0.5) AND (down_streak>=2) else 0
|
||
components:
|
||
REBOUND_CAPTURE_WEIGHT:
|
||
value: 15.0
|
||
unit: thesis_points
|
||
calibration_status: EXPERT_PRIOR
|
||
note: 과매도 반등 4조건 동시 충족 시 thesis 점수 가산
|
||
conditions:
|
||
rsi14_range: 25 <= rsi14 <= 40 (과매도~회복 초입)
|
||
price_pullback: current_price <= ma20 x 1.03 (MA20 ±3% 눌림목)
|
||
flow_quality: flow_credit >= 0.5 (자금 유입 최소 기준)
|
||
down_streak: down_streak >= 2 (연속 하락 2일 이상)
|
||
output:
|
||
field: rebound_capture_hit
|
||
unit: boolean
|
||
missing_policy: 4개 조건 중 1개라도 데이터 없으면 rebound_capture_hit=false
|
||
implementation: tools/build_predictive_alpha_dialectic_engine_v2.py:NF2
|
||
calibration_ref: spec/calibration_registry.yaml:NF2 (EXPERT_PRIOR)
|
||
version: 2026-06-04_NF2
|
||
owner: quant_team
|
||
lifecycle_state: active
|
||
input_fields:
|
||
- rsi14
|
||
- current_price
|
||
- ma20
|
||
- flow_credit
|
||
- down_streak
|
||
output_fields:
|
||
- rebound_capture_hit
|
||
golden_cases: []
|
||
activation_threshold:
|
||
min_t20_sample: 30
|
||
retirement_condition: performance_degradation
|