Files
QuantEngineByItz/spec/strategy/discovery.yaml
T
kjh2064 ee3e799de1 feat: 리밸런싱 엔진 V1 + GAS 버그 수정 (2026-06-13)
주요 변경:
- 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>
2026-06-13 13:20:14 +09:00

75 lines
4.7 KiB
YAML

meta:
title: "은퇴자산포트폴리오 — 후보 발굴·지연매매 방지"
parent_file: "spec/strategy/entry_gates.yaml"
version: "2026-05-15-F11_entry_split"
language: "ko-KR"
timezone: "Asia/Seoul"
role: "canonical"
migration_status: "canonical_split_active"
anti_late_trade_rule:
principle: >
가격·수급·ATR 신호는 주문 트리거가 아니라 위험등급 신호로 우선 사용한다.
이미 큰 폭으로 상승한 종목의 강한 수급은 추격매수 근거가 될 수 없고,
이미 큰 폭으로 하락한 종목의 ATR 이탈은 즉시 투매 근거가 될 수 없다.
buy_filter:
forbid_chasing:
- "20거래일 급등 후 신고가권 신규매수 금지"
- "20일선 대비 과도한 이격 발생 시 신규매수 금지"
- "기존 보유 섹터와 중복될 경우 신규매수 금지"
allow_buy_only_if:
- "눌림 후 회복"
- "손절폭 대비 기대수익 1.8배 이상"
- "포지션 크기와 손실예산이 사전에 확정"
sell_filter:
no_retroactive_stop:
- "진입 전 손절선이 없던 기존 포지션에 사후 ATR 손절을 기계 적용하지 않는다"
damaged_position_protocol:
- "이미 -10% 이상 손실 포지션은 시장가 투매 금지"
- "반등 매도, 시간 손절, 논리 훼손 손절로 분리"
- "ETF와 개별주의 손절 기준을 다르게 적용"
portfolio_rule:
trim_strength_before_weakness:
- "현금 확보는 약한 종목 투매보다 강한 종목의 초과비중 일부 익절을 우선 검토"
- "단, 장기 코어는 월간 리밸런싱에서만 조정"
calculation_gate:
formula: "(target_price - entry_price) / max(1, entry_price - stop_price) >= 1.8 (RR 최소 기준)"
no_trade_if: ["RR < 1.8", "손실예산 미확정", "보유수량/평단/계좌 원장 미확인"]
evidence_gate:
requires:
- "실체결 기준 수익률과 손실률"
- "3~10거래일 후행 성과 검증"
- "동일 섹터 중복노출 대비 초과수익"
prohibit:
- "하루 가격 반응만으로 전면 교체"
- "ATR 미확인 상태의 손절가·정수수량 산출"
- "강한 종목 수급을 이유로 신고가 추격매수"
next_generation_core_satellite_discovery:
alias_of: "next_generation_satellite_position_discovery"
terminology: "satellite_position은 포트폴리오 보완용 전술·보조 종목이며, core_satellite 시트의 satellite는 우주 업종이 아닌 자산배분 레이블이다."
preferred_output_name: "core_satellite 후보 스크리닝"
universe_build:
source_order: ["KRX 상장상태·거래대금", "Naver/KRX 수급", "Yahoo/KRX 20/60D 상대강도·ATR20", "OpenDART 촉매·리스크"]
minimum_liquidity: "20D 평균거래대금 100억원 이상 권장, 50억원 미만 원칙 제외"
screening_axes: ["상대강도", "5D/20D 수급", "거래대금 증가", "DART 촉매", "리스크 공시", "기존 보유와의 상관"]
grade:
alias_of: "recommendation_grade" # [P129] A_watch_to_buy_ready=A, B_watch=B, C_theme_only=C, D_reject=D
label_mapping: {A_watch_to_buy_ready: "recommendation_grade.A", B_watch: "recommendation_grade.B", C_theme_only: "recommendation_grade.C", D_reject: "recommendation_grade.D"}
A_watch_to_buy_ready: "80점 이상, Price_Status=PRICE_OK, Flow_OK=Y, DART_Risk 없음, ATR20 확인, 돌파 직후가 아니라 확인 또는 눌림 구간 → 조건부 진입 후보"
B_watch: "65~79점. 다음 quant_feed 갱신 대기"
C_theme_only: "50~64점 또는 핵심 데이터 부족. 관찰만."
D_reject: "50점 미만, 상장상태 리스크, 유동성 부족, 공시 리스크, DATA_CONFLICT"
output_rule:
- "고정 종목 목록·고정 업종 키워드 금지. 공개 스크리닝 통과 종목만 포함."
- "통과 종목 없으면 '후보 없음' 표에 검색조건·탈락사유·다음조회일 기재."
- "신규 후보는 항상 시범진입 여부와 본진입 여부를 분리해 적는다."
- "risk_on 국면의 주도주는 시범진입을 늦게 하지 말고, 대신 수량을 작게 가져간다."
- "보고서 제목의 core_satellite는 자산배분 분류를 뜻하며, 항공우주 업종으로 오해될 수 있는 '위성' 단독 표현은 보조 표기만 허용한다."
watchlist_analysis_workflow:
- "스크리닝 결과 후보 1개 이상일 때만 분석 수행."
- "ATR20 없으면 관찰가만 제시. 손절가·정수수량·기대수익비 산출금지 표시."
- "신고가 직후 종목은 관찰가보다 위의 가격을 제시하지 않는다."
- "다만 risk_on + 20D 수급 양호 + 거래대금 확장 + 종가 고가 마감이면 관찰가가 아니라 시범진입가를 제시할 수 있다."