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>
89 lines
4.4 KiB
YAML
89 lines
4.4 KiB
YAML
# spec/strategy/fundamental_quality_v3.yaml
|
|
# P1-011: FUNDAMENTAL_EVIDENCE_UPGRADE — engine_audit vs data_quality 충돌 해소
|
|
#
|
|
# 충돌 근거:
|
|
# data_quality.schema_presence_score = 100 ← 필드 존재 여부만 확인
|
|
# engine_audit.fundamental_score = ~62 ← 실제 값 존재 여부 + missing_penalty
|
|
# conflict_gap_pct = 40.0 (OCF/FCF 0% 커버리지가 원인)
|
|
#
|
|
# 해소 방법:
|
|
# 1. OCF/FCF 데이터 HTS 캡처 (OPERATIONAL_ACTION)
|
|
# 2. data_quality=FULL 레이블 기준 강화 (OCF or FCF 필수) → v2에서 적용됨
|
|
# 3. fundamental_multifactor_v4 missing_penalty 적용
|
|
|
|
meta:
|
|
formula_id: FUNDAMENTAL_QUALITY_V3
|
|
version: "2026-06-06"
|
|
python_tools:
|
|
- tools/build_fundamental_raw_v2.py
|
|
- tools/build_fundamental_multifactor_v4.py
|
|
sources:
|
|
- Temp/fundamental_raw_v1.json # FUNDAMENTAL_RAW_INGEST_V1 출력
|
|
- Temp/fundamental_raw_v2.json # v2: field-level coverage 수정
|
|
- Temp/fundamental_multifactor_v4.json
|
|
|
|
# ── 충돌 정의 ─────────────────────────────────────────────────────────────────
|
|
conflict_definition:
|
|
issue: >
|
|
v1에서 data_quality=FULL이지만 OCF/FCF=None인 tickers가 존재함.
|
|
ROE/OPM/PER/PBR/EPS 5개 필드 기준으로 FULL 판정했으나
|
|
multifactor 점수에서 OCF/FCF 합산 30점 비중이 빠지는 문제.
|
|
v1_full_label_count: 7
|
|
v2_reclassified_to_partial: 7 # 전원 PARTIAL로 재분류
|
|
root_cause: OCF/FCF HTS 캡처 미완료 (OPERATIONAL_ACTION)
|
|
|
|
# ── 필드 가중치 ────────────────────────────────────────────────────────────────
|
|
field_weights:
|
|
roe_pct: 25 # ROE
|
|
opm_pct: 20 # 영업이익률
|
|
ocf_krw: 15 # 영업현금흐름 ← 현재 0% 커버리지
|
|
fcf_krw: 15 # 잉여현금흐름 ← 현재 0% 커버리지
|
|
net_debt_krw: 10 # 순부채
|
|
per: 8 # PER
|
|
pbr: 7 # PBR
|
|
total_weight: 100
|
|
|
|
# ── data_quality 레이블 기준 (v2) ──────────────────────────────────────────────
|
|
data_quality_labels:
|
|
FULL: "ROE/OPM + 밸류에이션 + (OCF or FCF) 모두 있음"
|
|
PARTIAL: "ROE/OPM + 밸류에이션 있음, OCF/FCF 없음"
|
|
SPARSE: "ROE/OPM만 있음"
|
|
MISSING: "핵심 필드 없음"
|
|
ETF_EXCLUDED: "ETF — 펀더멘털 미적용"
|
|
|
|
# ── missing_penalty ────────────────────────────────────────────────────────────
|
|
missing_penalty:
|
|
ocf_krw: -5.0 # OCF 없을 때 감점
|
|
fcf_krw: -5.0 # FCF 없을 때 감점
|
|
note: "penalty는 quality_multiplier 적용 후 차감"
|
|
|
|
# ── 수락 기준 ─────────────────────────────────────────────────────────────────
|
|
acceptance_criteria:
|
|
raw_field_coverage_pct:
|
|
target: ">=90"
|
|
current: 60.0
|
|
status: FAIL
|
|
remediation: "OCF/FCF HTS 캡처 → OPERATIONAL_ACTION"
|
|
fundamental_score_not_available_count:
|
|
target: "==0"
|
|
current: 7
|
|
status: FAIL
|
|
remediation: "OCF/FCF 캡처 후 자동 해소"
|
|
conflict_gap_pct:
|
|
target: "<5"
|
|
current: 40.0
|
|
status: FAIL
|
|
remediation: "field coverage 개선 후 자동 해소"
|
|
|
|
# ── 장기투자 제한 ──────────────────────────────────────────────────────────────
|
|
long_horizon_policy:
|
|
condition: "OCF=None AND FCF=None"
|
|
action: "long_horizon_buy_allowed=False"
|
|
note: "현금흐름 근거 없이 장기투자 추천 금지"
|
|
|
|
# ── 금지 사항 ─────────────────────────────────────────────────────────────────
|
|
prohibitions:
|
|
- "OCF/FCF 결측 상태에서 data_quality=FULL 레이블 사용 금지"
|
|
- "fundamental_score 결측을 0점으로 대체해 등급 산출 금지"
|
|
- "conflict_gap_pct >= 5인 상태에서 펀더멘털 기반 장기투자 추천 금지"
|