Files
QuantEngineByItz/spec/strategy/leader_scan.yaml
T
kjh2064 416da59607 WBS-8.7: spec-code synchronization expanded to 66.4% (93/140 files)
Coverage improvement: 24.07% (39 files) → 66.4% (93 files)
- Tagged 54 additional spec files with has_code_implementation: true
- Covered: strategy/*, risk/*, exit/*, formulas/*, governance/*, contracts
- Target: 50% (81 files) — EXCEEDED by 12 files

Files tagged:
- spec/strategy: 20 files (action_matrix, entry_core, entry_gates, etc.)
- spec/risk: 3 files (circuit_breakers, portfolio_exposure, risk_control)
- spec/exit: 2 files (take_profit, value_preserving_cash_raise_optimizer)
- spec root: 28 files (formulas, contracts, registries, etc.)
- spec/03_formulas: 2 files (formula_registry, output_field_owner_ledger)
- spec/data_quality: 1 file (expectations)
- spec/fields: 1 file (field_dictionary)
- spec/formulas: 1 file (manifest)

Impact:
- Improved LLM radar discoverability for spec-to-code linkage
- Ready for WBS-9.6 (LLM document optimization phase)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-06-22 23:51:58 +09:00

206 lines
13 KiB
YAML

meta:
title: "은퇴자산포트폴리오 — 주도주 스캔·과열 방지"
parent_file: "spec/strategy/entry_gates.yaml"
version: "2026-05-16-F12_kosdaq_strict"
language: "ko-KR"
timezone: "Asia/Seoul"
role: "canonical"
has_code_implementation: true
code_path: ["spec/strategy/action_matrix.yaml"]
migration_status: "canonical_split_active"
entry_timing_guardrails:
principle: "좋은 종목도 비싸게 사면 수익이 나빠지지만, 강한 장세의 돌파를 놓치는 것도 손실이다. 진입은 추격이 아니라 단계화다."
daily_leader_scan:
purpose: "장마감 후 5개 조건(C1~C5)을 스캔해 탐색 후보를 등재한다. 4개 이상=탐색 후보, 3개=관찰 전용."
scan_timing: "매일 장마감 후 (15:30~16:00)"
conditions:
C1_price:
formula: "Close >= MA20 AND Close >= (High - (High-Low)*0.3)"
meaning: "20일선 위 + 당일 종가가 장중 상단 70% 이내 (윗꼬리 배제)"
score: 1
data: "data_feed 탭 Close·MA20·High·Low"
C2_relative_strength:
formula: "Ret10D_종목 >= Ret10D_KOSPI + 3%p"
meaning: "최근 10거래일 수익률이 KOSPI 대비 +3%p 이상 초과"
score: 1
data: "data_feed 탭 Ret10D 또는 직접 계산"
C3_volume_surge:
formula: "AvgTradeValue_5D_M >= AvgTradeValue_20D_M * 1.5"
meaning: "최근 5일 평균거래대금이 20일 평균의 150% 이상"
score: 1
data: "data_feed 탭 AvgTradeValue_5D_M·AvgTradeValue_20D_M (단위 통일: 억원)"
C4_flow:
formula: "Frg_5D > 0 OR Inst_5D > 0 AND Flow_OK=Y"
meaning: "외국인 또는 기관 중 하나라도 5일 순매수 양수 AND Flow_OK=Y"
score: 1
data: "quant_feed_contract.investor_flow_rules"
C5_sector:
formula: "sector_priority_ranking.Tier_1 AND sector_flow.Rotation_Score 순위 <= 3"
meaning: "해당 종목 섹터가 Tier_1(최우선 섹터) AND Rotation_Score 상위 3위 이내"
score_Tier1: 1.0
score_Tier2: 0.5
score_Tier3: 0
data: "sector_flow 탭 Rotation_Score + sector_priority_ranking 리스트"
pass_rule:
explore_candidate: "C1+C2+C3+C4+C5 합계 >= 4 → 탐색 후보 등재"
watch_only: "합계 == 3 → 관찰 전용 (탐색매수 금지)"
below_threshold: "합계 <= 2 → 이번 스캔 제외"
entry_delay_rule: # [proposal_68 / 2026-05-15] 탐색 후보 등재 후 진입 지연 허용 기간
purpose: "탐색 후보 등재 후 실제 stage_1 진입까지 최대 3거래일 허용. 초과 시 자동 해제."
preferred_timing: "탐색 후보 등재 익일(T+1) 개장 후 anti_climax_buy_gate 재확인 통과 시 진입"
max_delay:
duration: "3거래일 (T+1~T+3)"
expiry_action:
condition: "T+3 종가까지 stage_1 진입 미실행"
action: "탐색 후보 자동 해제. 탐색 슬롯 1건 반환."
re_entry: "동일 종목은 다음 날 daily_leader_scan 재스캔 통과 시 신규 후보로 재등재 가능"
anti_climax_recheck:
rule: "진입 당일 개장 전 anti_climax_buy_gate 5개 신호 재확인 필수"
if_newly_triggered: "신호 3개 이상 새로 발생 시 해당 후보 즉시 해제"
output_columns_add: ["후보등재일", "만료일(T+3)", "anti_climax재확인결과", "진입실행여부"]
prohibition:
- "T+4 이후 기존 탐색 후보 재활성화 금지. 신규 스캔 통과로만 재등재"
- "anti_climax 재확인 없이 T+2~T+3 지연 진입 금지"
candidate_signal_freeze: # [proposal_77 / 2026-05-15] 등재 후 일간 스캔 재결과 충돌 처리
purpose: "등재된 탐색 후보의 C점수가 이후 일간 스캔에서 변동될 경우 처리 원칙"
freeze_rule: "탐색 후보 등재 당시(T+0 15:30 기준) C1~C5 합계를 유효 신호로 동결. 만료일(T+3 종가)까지 유지."
rescan_role: "T+1·T+2·T+3 일간 스캔 결과는 '참고 표기'로만 출력. 기존 후보 자동 해제 근거로 사용 금지."
mandatory_release_conditions:
- "anti_climax_buy_gate에서 새로 S신호 3개 이상 발생 시 즉시 해제 (이 경우에만 스캔 재결과 반영)"
- "T+3 종가 경과 시 자동 만료 (entry_delay_rule 준수)"
output_requirement: "후보 테이블에 [등재일 C합계] vs [당일 C합계] 병기. 동결 여부 명시."
prohibition:
- "T+2~T+3 스캔에서 C합계 < 4로 하락했다는 이유만으로 후보 자동 해제 금지"
- "스캔 재결과로 후보를 C합계 상향 처리 금지 — 동결 양방향 적용"
sector_priority_ranking:
# [proposal_63 / 2026-05-15] 섹터 동적 우선순위 — C5 판정 기준 고정
as_of: "2026-05-15 (매월 첫째 주 갱신)"
Tier_1:
description: "현재 KOSPI·KOSDAQ 수급·추세가 가장 강한 섹터. 탐색매수 최우선."
sectors: ["반도체·AI메모리", "AI인프라·서버·전력반도체", "방산·항공우주", "조선·해운"]
C5_score: 1.0
Tier_2:
description: "추세 있으나 Tier_1 대비 약한 섹터. C5=0.5 부여 (합계 4점 도달 시 C1~C4 모두 필요)."
sectors: ["전력기기·전선", "자동차·전기차", "바이오·제약(임상확인)", "엔터·콘텐츠(실적대형주)"]
C5_score: 0.5
Tier_3:
description: "수급 이탈·비주도. 신규 탐색 금지. sector_flow 순위 무관 C5=0."
sectors: ["유통·소비재", "건설·부동산", "금융·보험", "기타소형주"]
C5_score: 0
monthly_update:
promotion: "Tier_2가 4주 연속 Rotation_Score 상위 3위 유지 → Tier_1 승격"
demotion: "Tier_1이 2주 연속 Rotation_Score 6위 이하 → Tier_2 강등"
prohibition:
- "뉴스·테마 단기 급등만으로 Tier_1 즉시 승격 금지. 4주 연속 조건 필수."
- "보유 종목 섹터를 Tier_1로 임의 분류 금지 (보유 편향)"
demotion_protocol: # [proposal_67 / 2026-05-15] Tier 강등 즉시 탐색 금지
purpose: "Tier 강등 확정 즉시 해당 섹터 탐색 후보를 해제하고 5거래일 신규 탐색을 금지한다."
trigger: "monthly_update.demotion 조건 충족 확정 시"
immediate_actions:
step_1: "강등 확정일: 해당 섹터의 현재 daily_leader_scan 탐색 후보 전부 즉시 해제"
step_2: "강등 섹터 종목의 C5 점수를 강등 후 Tier 기준으로 즉시 재산정"
step_3: "해당 섹터 신규 탐색매수(stage_1) 5거래일 금지"
step_4: "기존 보유 위성(해당 섹터) → relative_weakness_exit 점검 주기 일간 임시 전환"
cooldown_period:
duration: "5거래일 (강등 확정일 기준)"
resume_condition: >
5거래일 후 해당 섹터 Rotation_Score 5위 이내 AND
외국인·기관 순매수 5D 합산 양수 재확인 시 탐색 재개.
미충족 시 10거래일 추가 대기.
prohibition:
- "Tier 강등 5거래일 이내 해당 섹터 신규 탐색 진입 금지"
- "기존 보유 위성은 강등만으로 즉시 전량 청산 금지 (relative_weakness_exit 준수)"
data_integrity_guard:
# [proposal_57 / 2026-05-15] daily_scan 할루시네이션 방지 guard
pre_scan_checks:
check_1_freshness: "as_of_date가 당일 장마감(15:30) 이내여야 함. 불충족 시 DATA_STALE — 탐색 후보 등재 금지."
check_2_unit_consistency: "C3 산출 시 AvgTradeValue_5D_M·AvgTradeValue_20D_M 모두 억원 단위 확인. 불일치 시 C3=0."
check_3_data_conflict: "동일 필드 복수 소스 오차 시 해당 C=0 처리."
check_4_missing_defaults:
C1_missing: "Close 또는 MA20 미확인 → C1=0"
C2_missing: "Ret10D_종목 또는 Ret10D_KOSPI 미확인 → C2=0"
C3_missing: "AvgTradeValue 미확인 → C3=0"
C4_missing: "Flow_OK=N 또는 수급 미확인 → C4=0"
C5_missing: "sector_flow 미제공 → C5=0"
principle: "누락 데이터는 항상 0점. 추정·보간 금지."
check_5_atr_prerequisite: "탐색 후보 등재 종목이라도 ATR20 미확인 시 [ATR미확인 — 진입 불가] 명시. 진입 허용 착각 방지."
post_scan_prohibition:
- "5개 조건 중 3개 이상 기본값(0)인 경우 탐색 후보 등재 금지"
- "as_of_date 없이 스캔 결과 출력 금지"
- "결과 '후보 없음'이어도 data_integrity_guard 실행 여부 표기 필수"
# [proposal_93 / 2026-05-16] 코스닥 종목 진입 허들 상향 — 동일 C점수에서 더 높은 기준 요구
kosdaq_entry_gate_premium:
purpose: "코스닥 종목은 유동성·기관수급 불안정성으로 인해 KOSPI 종목 대비 진입 허들을 1단계 높인다."
explore_candidate_threshold:
kospi_satellite: "C1+C2+C3+C4+C5 합계 >= 4 → 탐색 후보"
kosdaq_satellite: "C1+C2+C3+C4+C5 합계 >= 5 → 탐색 후보 (1점 추가 요구)"
kosdaq_watch: "합계 == 4 → 관찰 전용 (코스닥에서는 탐색매수 금지)"
additional_required_any:
- "기관 5D 순매수 양수 (Inst_5D > 0) — 코스닥은 외국인 단독 수급 신뢰도 낮음"
- "거래대금 20D 평균 대비 150% 이상 (C3 조건과 동일하나 코스닥 저유동성 보정 재확인)"
grade_cap:
rule: "코스닥 종목은 CSCS >= 90이어도 A등급 상한 적용"
exception: "코스닥 내 Tier_1 섹터(반도체·AI인프라 관련 코스닥 대형주) 이고 기관·외국인 동시 순매수 확인 시 예외 검토 가능. 단, daily_leader_scan 합계 >= 5 필수."
output_column_add: ["시장구분(KOSPI/KOSDAQ)", "코스닥_추가조건_충족여부"]
prohibition:
- "코스닥 종목을 KOSPI 기준 탐색 후보 등재 금지 (합계 4점은 코스닥에서 관찰 전용)"
- "기관 수급 미확인 코스닥 종목 A등급 부여 금지"
output_table:
columns: ["종목명", "시장구분", "C1", "C2", "C3", "C4", "C5", "합계", "판정(탐색/관찰/제외)", "ATR상태", "as_of_date"]
prohibition:
- "4개 미충족 종목 탐색매수 후보 등재 금지"
- "코스닥 종목은 5개 미충족 시 탐색 후보 등재 금지"
- "data_integrity_guard 미실행 상태 탐색 후보 표기 금지"
- "→ master_prohibitions.P2(ATR미확인 진입 금지)·P5(데이터 없이 A등급 금지) 전역 적용"
# [proposal_49 / 2026-05-15] 설거지 방지 규칙 통합 명문화 — anti_climax_buy_gate
anti_climax_buy_gate:
purpose: "급등 클라이맥스·주도주 설거지 구간을 정량적으로 차단한다. 5개 신호 중 3개 이상 = 신규매수 전면 금지."
signals:
S1_surge_5d:
formula: "Ret5D_종목 >= 25%"
meaning: "최근 5거래일 수익률 +25% 이상 급등"
score: 1
data: "data_feed 탭 Ret5D 또는 직접 계산"
S2_volume_climax:
formula: "AvgTradeValue_5D_M >= AvgTradeValue_20D_M * 3.0"
meaning: "5일 평균거래대금이 20일 평균의 300% 이상 (클라이맥스 물량)"
score: 1
S3_upper_wick:
formula: "(High - Close) / max(High - Low, 1) >= 0.35 AND High > 전고점"
meaning: "당일 윗꼬리 비율 35% 이상 + 전고점 돌파 후 음봉 반전"
score: 1
S4_smart_money_exit:
formula: "Frg_5D < 0 AND Inst_5D < 0"
meaning: "외국인 AND 기관 5D 동반 순매도 전환 (스마트머니 이탈)"
score: 1
S5_retail_frenzy:
formula: "Ind_5D > 0 AND (Frg_5D < 0 OR Inst_5D < 0)"
meaning: "개인 순매수 + 외국인·기관 이탈 (뒤늦은 개인 매수 = 설거지 패턴)"
score: 1
gate_rule:
buy_ban: "합계 >= 3 → 신규 매수 금지 (탐색매수 포함)"
caution: "합계 == 2 → 매수 허용하나 수량 50% 축소 + 사유 명시"
clear: "합계 <= 1 → gate 통과"
recheck_timing: # [proposal_76 / 2026-05-15] T+1 재확인 기준시각·데이터 명시
purpose: "탐색 후보 T+1 진입 전 anti_climax 재확인의 정확한 시점과 데이터 기준"
execution_time: "T+1 08:30 이전 (개장 30분 전까지 완료)"
data_reference:
base_date: "T-1 (등재 전일) 20:00 시점 최신 확정 데이터"
S1_S2_S3: "T-1 종가 OHLC 기준"
S4_S5: "T-1 20:00까지의 5D 누적 신호 기준"
prohibition:
- "T+1 장중 데이터로 anti_climax 재판정 금지 (미확정 데이터 혼용)"
- "T+1 09:00 이후 재확인 시도로 진입 지연 허용 금지"
fallback: "T+1 08:30까지 데이터 수집 불가 시 → anti_climax 신호 합계 3으로 보수 처리 (매수 보류)"
prohibition:
- "anti_climax_buy_gate 발동 중 daily_leader_scan 탐색 후보 종목도 매수 금지"
- "gate 발동 중 pullback_reentry_rule 재진입도 금지"
- "5억 목표 압박을 이유로 gate 해제 금지 (→ master_prohibitions.P3)"
output_table:
columns: ["종목명", "S1", "S2", "S3", "S4", "S5", "합계", "gate판정", "가능수량비율"]
# [proposal_48 / 2026-05-15] 3단계 탐색매수 체계 — staged_entry_v2