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>
75 lines
4.7 KiB
YAML
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 수급 양호 + 거래대금 확장 + 종가 고가 마감이면 관찰가가 아니라 시범진입가를 제시할 수 있다."
|