From 8979ee7689f4e16dda96216e87378120448cc3e8 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 13 Jun 2026 13:36:15 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs:=20=ED=80=80=ED=8A=B8=ED=88=AC?= =?UTF-8?q?=EC=9E=90=20=EC=97=94=EC=A7=84=20=EC=A0=84=EC=B2=B4=20=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=EB=A7=B5=20&=20WBS=20&=20=ED=95=98=EB=84=A4=EC=8A=A4?= =?UTF-8?q?=20=EC=84=B1=EA=B3=B5=20=EA=B8=B0=EC=A4=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 5개 페이즈 로드맵 (P1 기반경화 → P5 완전자동화) - 21개 WBS 항목, 각 항목별 데이터 기반 성공 하네스 - 현재 완성도 KPI 매트릭스 (NULL 40→10, lifecycle 9→100%) - Sprint 1~3 즉시 실행 목록 Co-Authored-By: Claude Sonnet 4.6 --- docs/ROADMAP_WBS.md | 611 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 611 insertions(+) create mode 100644 docs/ROADMAP_WBS.md diff --git a/docs/ROADMAP_WBS.md b/docs/ROADMAP_WBS.md new file mode 100644 index 0000000..9702906 --- /dev/null +++ b/docs/ROADMAP_WBS.md @@ -0,0 +1,611 @@ +# 퀀트투자 엔진 — 전체 로드맵 & WBS & 하네스 성공 기준 + +> 작성일: 2026-06-13 | 엔진 버전: REBALANCE_ENGINE_V1 기준 +> 원칙: **모든 수치는 공식 ID 기반 산출 → 하네스 검증 → LLM은 렌더링 전용** + +--- + +## 0. 프로젝트 비전 & 방향성 + +### 핵심 목표 +**"은퇴자산 포트폴리오를 운용하는 완전 결정론적 퀀트 투자 엔진"** + +- 사람의 직관 개입 없이 규칙 기반 매수/매도/리밸런싱 결정 +- 모든 숫자는 추적 가능한 공식 ID와 데이터 출처를 보유 +- 레짐(시장국면) 적응형 — RISK_ON / NEUTRAL / RISK_OFF 자동 대응 +- HTS 캡처 → GAS 분석 → Python 하네스 → 최종 결정 패킷 완전 자동화 + +### 5대 방향성 축 + +| 축 | 설명 | 현재 수준 | +|----|------|---------| +| **D1 데이터 완결성** | 194개 컬럼 전부 실데이터로 채움 | 40개 NULL (21%) | +| **D2 공식 결정론** | 149개 공식 ID 전부 lifecycle 등록 | 13개 등록 (9%) | +| **D3 리스크 제어** | Core/Satellite/Cash 버킷 밴드 위반 0건 | RISK_ON 밴드 내 유지 중 | +| **D4 알파 피드백** | 예측→실현 수익 루프 30건 이상 누적 | 0건 (DATA_GATED) | +| **D5 실행 자동화** | run_all 1회 실행으로 전체 파이프라인 완결 | 63단계 DAG 구축 완료 | + +--- + +## 1. 전체 로드맵 (5개 페이즈) + +``` +Phase 1 ████████████░░░░░░░░ 기반 경화 (Foundation Hardening) [진행 중] +Phase 2 ░░░░░░░░░░░░░░░░░░░░ 신호 엔진 완성 (Signal Engine) [미착수] +Phase 3 ░░░░░░░░░░░░░░░░░░░░ 실행·리스크 관리 (Execution & Risk) [V1 완료] +Phase 4 ░░░░░░░░░░░░░░░░░░░░ 성과 인텔리전스 (Performance) [DATA_GATED] +Phase 5 ░░░░░░░░░░░░░░░░░░░░ 완전 자동화 (Full Automation) [설계 중] +``` + +| Phase | 기간 목표 | 핵심 산출물 | 완료 기준 | +|-------|----------|-----------|---------| +| **P1 기반 경화** | ~2026-07 | GAS 버그 0건, data_feed NULL 40→10 이하 | `full-gate` PASS | +| **P2 신호 엔진** | ~2026-09 | 펀더멘털 피드 완성, RS/알파 신호 ACTIVE | 황금 테스트케이스 100% | +| **P3 실행·리스크** | 2026-06 완료 | 리밸런싱 엔진 V1, 3단계 분할 주문 | 실제 주문 3회 이상 | +| **P4 성과 인텔리전스** | ~2026-10 | T+20 결과 30건, 알파 보정 루프 | match_rate ≥ 55% | +| **P5 완전 자동화** | ~2026-12 | CI/CD + Gitea, 자율 실행 | 수동 개입 0회/주 | + +--- + +## 2. 상세 WBS (Work Breakdown Structure) + +--- + +### WBS-1: 기반 경화 (Phase 1) + +#### WBS-1.1 GAS 소수주 분리 행 병합 완결 + +| 항목 | 내용 | +|------|------| +| **작업** | `gdc_01_fetch_fundamentals.gs` `_mergePositionRecord_()` 배포 + 검증 | +| **트리거** | account_snapshot에 `(소수)` 접미사 행이 전체주 행과 동일 ticker | +| **담당 파일** | `src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs:1648` | +| **하네스 검증** | `005930 Weight_Pct ≥ 40%`, `000660 Weight_Pct ≥ 30%` | +| **상태** | 코드 완성, GAS 배포 대기 | + +**성공 하네스 (데이터 기준)**: +``` +BEFORE: 005930 Weight_Pct = 0.05%, AcctQty = 0.647 +AFTER: 005930 Weight_Pct ≥ 40%, AcctQty = 530.647 +검증 쿼리: data_feed에서 Weight_Pct × total_asset_krw ≈ account_snapshot.market_value ±1% +``` + +--- + +#### WBS-1.2 total_asset_krw 실시간 재계산 + +| 항목 | 내용 | +|------|------| +| **작업** | Naver 가격 루프 완료 후 `Σ(close × qty) + settlementCashD2_` 재계산 | +| **현재 오차** | settings값(405M) vs Naver실가(385M) = **20.4M원(5%) 괴리** | +| **담당 파일** | `src/gas_adapter_parts/gdc_02_account_satellite.gs:529` | +| **수정 방법** | 2-pass 루프: 1차 가격 수집 → totalAssetKrw_ 재계산 → 2차 Weight_Pct | +| **상태** | 미구현 (P-NEW-2) | + +**성공 하네스 (데이터 기준)**: +``` +검증: |settings.total_asset_krw - Σ(Naver_close × qty) - cash| / settings.total_asset_krw ≤ 2% +현재: (405,489,183 - 385,052,321) / 405,489,183 = 5.0% → FAIL +목표: ≤ 2% → PASS +``` + +--- + +#### WBS-1.3 Time_Stop_Date / Days_To_Time_Stop 컬럼 채움 + +| 항목 | 내용 | +|------|------| +| **작업** | entry_date + time_stop_days 임계 초과 시 자동 계산 | +| **현재 상태** | 11개 행 전부 NULL (SK하이닉스·TIGER조선 TIME_STOP 신호 있으나 날짜 미기재) | +| **담당 파일** | `src/gas_adapter_parts/gdc_02_account_satellite.gs` | +| **로직** | `time_stop_date = entry_date + 60일`, `days_to_time_stop = time_stop_date - today` | +| **상태** | 미구현 | + +**성공 하네스 (데이터 기준)**: +``` +검증: TIME_STOP Sell_Reason을 가진 모든 행에서 Days_To_Time_Stop IS NOT NULL +현재: 000660(SK하이닉스) entry_date=2026-05-07, 경과일=37일, 임계=60일 +→ Days_To_Time_Stop = 60 - 37 = 23일 (이미 초과 → 0 또는 음수) +목표: TIME_STOP 신호 보유종목 null 비율 = 0% +``` + +--- + +#### WBS-1.4 Rule_Sell_Qty / Override_Sell_Qty 자동 산출 + +| 항목 | 내용 | +|------|------| +| **작업** | SELL_READY/FORCE 신호 발동 시 수량 자동 계산 | +| **현재 상태** | 11개 SELL 관련 행 전부 NULL | +| **공식 ID** | `POSITION_SIZE_V1` + `SELL_WATERFALL_ENGINE_V2` | +| **입력** | Account_Holding_Qty × Sell_Ratio_Pct / Tick_Unit | +| **상태** | 미구현 | + +**성공 하네스 (데이터 기준)**: +``` +검증: Final_Action = 'SELL_READY' 인 행에서 Rule_Sell_Qty IS NOT NULL AND Rule_Sell_Qty > 0 + Rule_Sell_Qty = floor(Account_Holding_Qty × Sell_Ratio_Pct / 100) ≥ 1 +현재: 000660 holding=56, SELL_RATIO=50% → Rule_Sell_Qty = 28 (현재 NULL → FAIL) +``` + +--- + +#### WBS-1.5 공식 lifecycle 레지스트리 완결 (149개 → 100%) + +| 항목 | 내용 | +|------|------| +| **작업** | `spec/51_formula_lifecycle_registry.yaml` 전체 공식 이관 | +| **현재 상태** | 13개 등록 (9%) | +| **목표** | 149개 전부 등록 + lifecycle_state 명시 | +| **우선순위** | ACTIVE 공식 먼저, DEPRECATED 표시 후 제거 | +| **상태** | 진행 중 | + +**성공 하네스 (데이터 기준)**: +``` +검증 명령: python tools/validate_formula_version_lifecycle_v1.py +목표: spec/13_formula_registry.yaml 의 모든 formula_id가 51_formula_lifecycle_registry.yaml에 존재 + lifecycle_state in [ACTIVE, DEPRECATED, DATA_GATED, PENDING] +현재 미등록 수: 136개 → 목표: 0개 +``` + +--- + +### WBS-2: 신호 엔진 완성 (Phase 2) + +#### WBS-2.1 펀더멘털 데이터 피드 완성 (40개 NULL 컬럼) + +| 항목 | 내용 | +|------|------| +| **작업** | Yahoo Finance / DART API 연동으로 40개 NULL 컬럼 채움 | +| **NULL 컬럼 목록** | EPS_Growth_1Y_Pct, Beta, High52W, Low52W, ROE_Pct, Operating_Margin_Pct, Debt_To_Equity, Current_Ratio, FCF_B, Revenue_Growth_Pct, Earnings_Date 등 | +| **데이터 소스** | DART(국내주), yfinance/Alpha Vantage(선택), Naver 금융 확장 | +| **담당 파일** | `tools/ingest_fundamental_raw.py` → `src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs` | +| **상태** | 스키마 정의 완료, 수집 미구현 | + +**성공 하네스 (데이터 기준)**: +``` +목표 컬럼별 채움 기준: + Beta: KR 주식 60일 일간 수익률 vs KOSPI 회귀계수 → |Beta| > 0 + High52W: 최근 252 거래일 최고가 → High52W ≥ Close + ROE_Pct: DART 반기보고서 최신 → ROE_Pct ∈ (-50%, 100%) + EPS_Growth_1Y: 전년 동기 EPS 대비 % → IS NOT NULL + Earnings_Date: DART 공시 일정 → 향후 90일 이내 존재 시 기재 + +검증: NULL 컬럼 수 ≤ 10 (현재 40 → 목표 10) + 핵심 4개(Beta/High52W/ROE/EPS) 완전 채움 = 100% +``` + +--- + +#### WBS-2.2 US 주식 가격 피드 (GOOGL/MSFT/NVDA) + +| 항목 | 내용 | +|------|------| +| **작업** | US 주식 종가 수집 — Naver 대신 Yahoo Finance API 또는 Alpha Vantage | +| **현재 상태** | GOOGL/MSFT/NVDA market_value=0, Weight_Pct=0 (완전 누락) | +| **구현 방법** | `gdf_01_price_metrics.gs` 에서 알파벳 ticker 감지 시 별도 URL 분기 | +| **대안** | `settings` 탭에 당일 환율 + 전일 US 종가 수동 입력 → GAS 자동 계산 | +| **상태** | 미구현 | + +**성공 하네스 (데이터 기준)**: +``` +검증: data_feed에서 GOOGL.Close > 0, MSFT.Close > 0, NVDA.Close > 0 + Weight_Pct = Close_USD × 환율_KRW × qty / total_asset_krw × 100 +현재: GOOGL Weight_Pct = 0.00% (qty=0.502주, Close=0 → FAIL) +목표: GOOGL Weight_Pct ≈ 0.502 × 200,000 / 405,489,183 × 100 ≈ 0.02% (IS NOT NULL) +``` + +--- + +#### WBS-2.3 RS(상대강도) 신호 V2 완성 + +| 항목 | 내용 | +|------|------| +| **작업** | RS_Verdict_V1_Raw, RS_Line_20D_Slope, RS_Line_60D_Slope 컬럼 채움 | +| **공식 ID** | `RS_MOMENTUM_V1`, `RS_VERDICT_V2` | +| **현재 상태** | 컬럼 존재하나 전부 NULL | +| **입력** | Close / MA20 / KOSPI 지수 대비 상대 퍼포먼스 | +| **담당 파일** | `src/gas_adapter_parts/gdf_01_price_metrics.gs` | +| **상태** | 스키마만 생성, 로직 미구현 | + +**성공 하네스 (데이터 기준)**: +``` +RS_Pct_20D = (Close_t - Close_t-20) / Close_t-20 × 100 - KOSPI_Ret_20D +RS_Line_20D_Slope = RS_Pct_20D의 5일 이동평균 변화율 + +검증: 보유 5개 종목 중 RS_Verdict_V1_Raw ∈ ['LEADER','MARKET','LAGGARD'] 100% + RS_Line_20D_Slope IS NOT NULL 100% +현재: NULL 100% → FAIL +``` + +--- + +#### WBS-2.4 PEG_SCORE_V1 실데이터 검증 및 ACTIVE 전환 + +| 항목 | 내용 | +|------|------| +| **작업** | PEG = P/E ÷ EPS_Growth_Rate 산출 → PEG_Gate 결정 | +| **공식 ID** | `PEG_SCORE_V1` | +| **현재 상태** | PEG, PEG_Gate 컬럼 NULL. lifecycle: ACTIVE 등록됨. 데이터 미입수 | +| **입력** | Forward_PE (data_feed), EPS_Growth_1Y_Pct (WBS-2.1 완료 필요) | +| **판정 기준** | PEG ≤ 1.0 → BUY_GRADE, 1.0~1.5 → HOLD, > 1.5 → CAUTION | +| **상태** | DATA_GATED (WBS-2.1 선행) | + +**성공 하네스 (데이터 기준)**: +``` +검증: 코스닥 종목(0182R0 등) PEG_Gate IS NOT NULL + PEG = Forward_PE / max(EPS_Growth_1Y_Pct, 1) + Forward_PE 미입수 시 TTM_PE 대체 사용 +목표: PEG_Score NULL 비율 ≤ 20% (데이터 부분 입수 허용) +``` + +--- + +#### WBS-2.5 섹터 플로우 신호 고도화 (SMART_MONEY_FLOW_V2) + +| 항목 | 내용 | +|------|------| +| **작업** | sector_flow_history 탭 30일 이상 누적 → 섹터 모멘텀 신호 산출 | +| **공식 ID** | `FLOW_CREDIT_V1`, `SECTOR_ROTATION_MOMENTUM_V1` | +| **현재 상태** | sector_flow_history 탭 존재, 데이터 누적 중 | +| **신호 로직** | 최근 5일 기관 순매수 상위 섹터 → Flow_Credit 가중치 부여 | +| **상태** | 부분 구현 (일일 누적 필요) | + +**성공 하네스 (데이터 기준)**: +``` +검증: sector_flow_history 행 수 ≥ 30 × 섹터 수 + Flow_Credit IS NOT NULL for 보유 종목 100% + Flow_Credit 범위: [0.0, 1.0] +현재: Flow_Credit 일부 NULL → 30일 데이터 누적 후 재검증 +``` + +--- + +### WBS-3: 실행·리스크 관리 (Phase 3) + +#### WBS-3.1 리밸런싱 엔진 V1 GAS 배포 및 검증 ✅ 코드 완성 + +| 항목 | 내용 | +|------|------| +| **작업** | `gdf_06_rebalance.gs:runRebalanceSheet_()` GAS 배포 | +| **현재 상태** | 코드 완성 + Logger.log/getSpreadsheet_() 수정 완료 | +| **산출물** | rebalance 시트: SUMMARY/BUCKETS/TICKERS/ORDERS 4섹션 | +| **상태** | GAS 배포 후 실행 확인 필요 | + +**성공 하네스 (데이터 기준)**: +``` +REGIME_PRELIM = RISK_ON 조건: + Core band: 51~81% → 현재 75.0% → WARN (PASS) + Satellite band: 2.5~32.5% → 현재 19.2% → WARN (PASS) + FORCE_TIME_STOP 주문: TIGER조선TOP10 337주 3단계 → orders_count = 3 + +검증: rebalance 시트 updated 타임스탬프 IS NOT NULL + orders[0].reason = 'TIME_STOP' + rebalance_needed = false (RISK_ON, 밴드 내) +``` + +--- + +#### WBS-3.2 리밸런싱 엔진 V2 — equal_weight 개선 (비중 기반 목표배분) + +| 항목 | 내용 | +|------|------| +| **작업** | V1의 `equal_weight_within_bucket` → 신호 강도·MDD 가중 목표 배분 | +| **한계** | V1: 코어 2종목 각 33% 고정. 실제 삼성(43%) > SK하이닉스(31%) 불균형 | +| **개선 방법** | SS001 점수 × 리스크 예산 → 종목별 목표 비중 동적 산출 | +| **공식 ID** | `POSITION_SIZE_V1` + `RISK_BUDGET_CASCADE_V1` | +| **상태** | 설계 중 | + +**성공 하네스 (데이터 기준)**: +``` +목표 배분 알고리즘: + ticker_target_pct = bucket_target_pct × (SS001_Score / Σ(SS001_Score in bucket)) + +검증: 모든 ticker target_pct ∈ (0%, bucket_max%) + Σ(ticker target_pct per bucket) = bucket_target_pct ±0.1% + 삼성전자 target > SK하이닉스 target iff SS001_삼성 > SS001_SK +``` + +--- + +#### WBS-3.3 주문 실행 시뮬레이터 (EXECUTION_SIMULATOR_V1) + +| 항목 | 내용 | +|------|------| +| **작업** | rebalance orders → HTS 지정가 주문 형식 변환 + 슬리피지 추정 | +| **공식 ID** | `TICK_NORMALIZER_V1`, `EXECUTION_QUALITY_SCORE_V1` | +| **입력** | orders 배열 + 호가 단위 테이블 | +| **산출물** | `Temp/execution_simulator_v1.json` — HTS 입력용 주문표 | +| **상태** | `spec/55_execution_simulator_contract.yaml` 존재, 구현 미완 | + +**성공 하네스 (데이터 기준)**: +``` +검증: 지정가 = floor(Close × (1 - 0.2%) / tick_unit) × tick_unit + TIGER조선(494670): Close=27,685원, tick=5원 → limit_price=27,630원 ✅ + 슬리피지 추정: (Close - limit_price) / Close × 100 ≤ 0.2% + execution_simulator.json orders 수 = rebalance orders 수 +``` + +--- + +#### WBS-3.4 드로우다운 가드 & 포트폴리오 MDD 모니터링 + +| 항목 | 내용 | +|------|------| +| **작업** | 포트폴리오 MDD 실시간 모니터링 → 임계(15%) 초과 시 강제 현금화 | +| **공식 ID** | `PORTFOLIO_DRAWDOWN_GATE_V1`, `SMART_CASH_RECOVERY_V9` | +| **현재 상태** | Smart_Cash_Recovery_V9 ACTIVE, 포트폴리오 MDD 계산 부분 구현 | +| **입력** | total_asset_krw 시계열 (일별 누적 필요) | +| **상태** | 일별 자산 기록 테이블 필요 | + +**성공 하네스 (데이터 기준)**: +``` +MDD = (peak_total_asset - current_total_asset) / peak_total_asset × 100 +검증: MDD IS NOT NULL (daily 기록 테이블 필요) + MDD ≥ 15% → CASH_RAISE_FORCED = true 트리거 + 현재: settings.total_asset_krw 단일값 → 시계열 없음 → FAIL +``` + +--- + +### WBS-4: 성과 인텔리전스 (Phase 4) + +#### WBS-4.1 T+20 아웃컴 레저 구축 (DATA_GATED) + +| 항목 | 내용 | +|------|------| +| **작업** | 매수 신호 발생 후 20 거래일 뒤 수익률 자동 기록 | +| **공식 ID** | `ALPHA_FEEDBACK_LOOP_V2` (lifecycle: DATA_GATED) | +| **활성화 조건** | live_t20_count ≥ 30 건 (~2026-07-15 예상) | +| **담당 파일** | `tools/build_operational_t20_outcome_ledger_v1.py` | +| **현재 상태** | 스키마 완성, 데이터 0건 | + +**성공 하네스 (데이터 기준)**: +``` +활성화 체크: + python tools/validate_live_data_activation_gate_v1.py + → live_t20_count ≥ 30 → ALPHA_FEEDBACK_LOOP_V2 → ACTIVE 전환 + +T+20 수익률 계산: + outcome_pct = (Close_t+20 - entry_price) / entry_price × 100 + +검증: outcome_ledger 행수 ≥ 30 + Σ(outcome_pct > 0) / total × 100 = win_rate_pct (목표 ≥ 55%) +``` + +--- + +#### WBS-4.2 예측 정확도 하네스 (PREDICTION_ACCURACY_HARNESS_V5) + +| 항목 | 내용 | +|------|------| +| **작업** | 매수/매도 예측 → 실현 결과 매칭 정확도 추적 | +| **공식 ID** | `PREDICTION_ACCURACY_HARNESS_V5` (lifecycle: ACTIVE) | +| **현재 상태** | 하네스 구조 완성, match_rate 데이터 부족 | +| **목표 지표** | match_rate_pct ≥ 55% (은퇴자산 허용 오차) | +| **산출물** | `Temp/prediction_accuracy_harness_v2.json` | + +**성공 하네스 (데이터 기준)**: +``` +match_rate_pct = 예측방향 맞춘 건수 / 전체 예측 건수 × 100 + +검증: Temp/prediction_accuracy_harness_v2.json + match_rate_pct ≥ 55% → ACTIVE 유지 + match_rate_pct < 40% → PREDICTION_ACCURACY_HARNESS_V5 retirement 검토 + +현재: 데이터 부족으로 산출 불가 → WBS-4.1 완료 선행 +``` + +--- + +#### WBS-4.3 알파 보정 루프 (ALPHA_CALIBRATION_V2) + +| 항목 | 내용 | +|------|------| +| **작업** | T+20 수익률 → SS001 점수 가중치 재보정 자동화 | +| **공식 ID** | `ALPHA_FEEDBACK_LOOP_V2` | +| **현재 상태** | DATA_GATED. 30건 이상 후 활성화 | +| **보정 대상** | SS001_P(가격강도), SS001_V(거래량), SS001_F(플로우) 가중치 | +| **상태** | 설계 완성, 데이터 대기 | + +**성공 하네스 (데이터 기준)**: +``` +보정 사이클: 30건마다 1회 실행 + calibrated_weight_P = 기본0.25 × (관측 승률_P 기여도 / 기대치) + +검증: 보정 후 match_rate_pct 개선 ≥ 2%p + calibration_registry_v1.json 업데이트 타임스탬프 IS NOT NULL +``` + +--- + +#### WBS-4.4 성과 모니터링 대시보드 (EVALUATION_DASHBOARD_V1) + +| 항목 | 내용 | +|------|------| +| **작업** | 일별 포트폴리오 수익률, 벤치마크 대비 Alpha, 공식 예측 적중률 시각화 | +| **공식 ID** | `CONTINUOUS_EVALUATION_DASHBOARD_V1` | +| **현재 상태** | `tools/build_continuous_evaluation_dashboard_v1.py` 존재, 미완성 | +| **산출물** | GatherTradingData.xlsx의 evaluation_dashboard 탭 | +| **상태** | 부분 구현 | + +**성공 하네스 (데이터 기준)**: +``` +검증: evaluation_dashboard 탭에 아래 지표 IS NOT NULL + - portfolio_return_1d_pct: (오늘 total_asset - 어제) / 어제 × 100 + - kospi_return_1d_pct: KOSPI 일간 수익률 + - alpha_1d_pct: portfolio - kospi + - cumulative_alpha_pct: Σ(alpha_1d_pct) + - match_rate_pct: WBS-4.2 연동 +목표: 30일 누적 데이터 → CAGR, Sharpe Ratio 산출 가능 +``` + +--- + +### WBS-5: 완전 자동화 (Phase 5) + +#### WBS-5.1 Gitea CI/CD 파이프라인 구축 + +| 항목 | 내용 | +|------|------| +| **작업** | main 브랜치 push → 자동 validate → Temp/ 산출물 갱신 → GAS 배포 패키지 생성 | +| **담당** | `.gitea/workflows/ci.yml` 생성 | +| **단계** | 1) python validate 전체 실행, 2) npm run full-gate, 3) dist/ 번들 생성, 4) 알림 | +| **상태** | 미구현 (저장소 초기화 완료) | + +**성공 하네스 (데이터 기준)**: +``` +CI 게이트: + python tools/validate_specs.py → EXIT 0 + python tools/validate_formula_registry.py → EXIT 0 + python tools/validate_golden_coverage_100.py → EXIT 0 + python tools/build_rebalance_engine_v1.py → rebalance_engine_v1.json 생성 + +검증: CI 전체 소요 시간 ≤ 5분 + main 브랜치 모든 커밋 → CI 통과율 100% +``` + +--- + +#### WBS-5.2 GAS 자동 배포 스크립트 + +| 항목 | 내용 | +|------|------| +| **작업** | `clasp push` 또는 `prepare_upload_zip.py` → GAS 배포 자동화 | +| **현재 상태** | `tools/prepare_upload_zip.py` 존재, 수동 배포 중 | +| **목표** | 코드 수정 → 1개 명령으로 GAS 반영 + run_all 실행 | +| **담당 파일** | `tools/gas_deployment_checklist_v1.py` | +| **상태** | 수동 체크리스트 존재, 자동화 미완 | + +**성공 하네스 (데이터 기준)**: +``` +검증: python tools/run_deployment_checklist_v1.py + → spec 검증 PASS + → dist/retirement_portfolio_bundle.yaml 생성 + → GAS 업로드 패키지 생성 + 소요시간 ≤ 60초 +``` + +--- + +#### WBS-5.3 일일 자율 실행 사이클 완성 + +| 항목 | 내용 | +|------|------| +| **작업** | 장 마감(오후 3:30) → HTS 캡처 → ChatGPT 파싱 → GAS run_all → Python 하네스 → 결정 패킷 → 알림 | +| **현재 자동화 수준** | GAS run_all 63단계 DAG 존재, 수동 트리거 | +| **목표** | 타이머 트리거 설정 → 완전 자율화 | +| **상태** | 타이머 트리거 미설정 | + +**성공 하네스 (데이터 기준)**: +``` +일일 사이클 KPI: + - HTS 캡처 → GAS 반영 소요시간 ≤ 30분 + - run_all 성공률 ≥ 95% (주 5일 기준) + - 수동 개입 필요 횟수 ≤ 1회/주 + - final_decision_packet_active.json 일별 업데이트 100% +``` + +--- + +## 3. 완성도 로드맵 매트릭스 + +| WBS | 우선순위 | 난이도 | 선행조건 | 예상 기간 | 현재 완성도 | +|-----|---------|------|---------|---------|-----------| +| 1.1 소수주 병합 | 🔴 Critical | 낮음 | GAS 배포 | 즉시 | 95% | +| 1.2 총자산 재계산 | 🔴 Critical | 중간 | 없음 | 1일 | 0% | +| 1.3 Time_Stop_Date | 🟠 High | 낮음 | 없음 | 0.5일 | 0% | +| 1.4 Rule_Sell_Qty | 🟠 High | 중간 | 없음 | 1일 | 0% | +| 1.5 Lifecycle 레지스트리 | 🟡 Medium | 낮음 | 없음 | 2일 | 9% | +| 2.1 펀더멘털 피드 | 🔴 Critical | 높음 | DART API | 2주 | 0% | +| 2.2 US 주식 가격 | 🟠 High | 중간 | Yahoo API | 3일 | 0% | +| 2.3 RS 신호 V2 | 🟠 High | 중간 | 없음 | 1주 | 20% | +| 2.4 PEG_SCORE | 🟡 Medium | 낮음 | 2.1 완료 | 0.5일 | 50% | +| 2.5 섹터 플로우 | 🟡 Medium | 중간 | 30일 데이터 | 진행 중 | 40% | +| 3.1 리밸런싱 V1 배포 | 🔴 Critical | 낮음 | GAS 배포 | 즉시 | 100% | +| 3.2 리밸런싱 V2 | 🟡 Medium | 높음 | 3.1 안정화 | 1주 | 0% | +| 3.3 주문 시뮬레이터 | 🟠 High | 중간 | 3.1 완료 | 3일 | 20% | +| 3.4 MDD 가드 | 🟠 High | 중간 | 일별 기록 | 1주 | 30% | +| 4.1 T+20 레저 | 🟡 Medium | 중간 | 30건 대기 | 2026-07 | 10% | +| 4.2 예측 정확도 | 🟡 Medium | 중간 | 4.1 완료 | 2026-08 | 20% | +| 4.3 알파 보정 | 🟢 Low | 높음 | 4.2 완료 | 2026-09 | 5% | +| 4.4 대시보드 | 🟡 Medium | 낮음 | 4.1 완료 | 1주 | 30% | +| 5.1 CI/CD | 🟡 Medium | 중간 | Gitea 연결 | 1주 | 5% | +| 5.2 GAS 자동 배포 | 🟢 Low | 낮음 | 5.1 완료 | 3일 | 40% | +| 5.3 자율 실행 | 🟢 Low | 중간 | 5.1+5.2 완료 | 2주 | 10% | + +--- + +## 4. 엔진 완성도 KPI (데이터 기반 측정) + +```yaml +# 현재 상태 (2026-06-13 기준) vs 목표 + +데이터 품질: + NULL 컬럼 수: 40개 → 목표: 10개 이하 + Weight_Pct 정확도: 95% → 목표: 99% (소수주 병합 후) + 총자산 오차: 5.0% → 목표: 2.0% 이하 + +공식 레지스트리: + lifecycle 등록률: 9% → 목표: 100% + 황금 테스트 커버리지: 미측정 → 목표: 100% + 공식 버전 충돌: 없음 → 유지 + +신호 품질: + RS 신호 커버리지: 0% → 목표: 100% (보유 종목) + Flow_Credit 커버리지: 60% → 목표: 100% + PEG_Gate 커버리지: 0% → 목표: 80% (국내 상장주) + +리밸런싱 엔진: + 레짐 소스 정확도: 100% → 유지 (macro.REGIME_PRELIM 최우선) + 밴드 내 유지 여부: PASS → 유지 + FORCE 주문 자동화: 100% → 유지 + +성과: + T+20 레저 건수: 0건 → 목표: 30건 (2026-07-15) + 예측 적중률: 미측정 → 목표: ≥55% + 알파 (vs KOSPI): 미측정 → 목표: >0%p/분기 + +자동화: + run_all 성공률: 확인 중 → 목표: ≥95% + CI/CD 커버리지: 0% → 목표: 100% + 수동 개입 횟수: 매일 → 목표: ≤1회/주 +``` + +--- + +## 5. 다음 스프린트 실행 목록 (즉시 착수 가능) + +### Sprint-1 (이번 주): 기반 경화 완결 + +``` +[ ] WBS-1.1: GAS 배포 후 Weight_Pct 검증 (005930 ≥ 40%) +[ ] WBS-1.2: totalAssetKrw_ 2-pass 재계산 구현 +[ ] WBS-1.3: Time_Stop_Date 자동 산출 (entry_date + 60일) +[ ] WBS-1.4: Rule_Sell_Qty = floor(qty × Sell_Ratio_Pct / 100) 구현 +[ ] WBS-3.1: rebalance 시트 GAS 실행 확인 (timestamp 확인) +``` + +### Sprint-2 (2주): 신호 완성 + +``` +[ ] WBS-2.3: RS_Verdict_V1_Raw, RS_Line_20D_Slope 로직 구현 +[ ] WBS-2.2: US 주식 가격 settings 수동입력 → 자동 Weight_Pct 연동 +[ ] WBS-3.3: 주문 시뮬레이터 tick 정규화 완성 +[ ] WBS-1.5: lifecycle 레지스트리 149개 중 상위 50개 이관 +``` + +### Sprint-3 (4주): 펀더멘털 + 성과 기반 구축 + +``` +[ ] WBS-2.1: DART 재무데이터 수집 파이프라인 구현 +[ ] WBS-3.4: MDD 일별 기록 테이블 생성 시작 +[ ] WBS-4.1: T+20 레저 첫 30건 달성 (2026-07-15) +[ ] WBS-5.1: Gitea CI/CD 기본 파이프라인 구축 +``` + +--- + +> 이 문서는 `docs/ROADMAP_WBS.md` 에 저장됩니다. +> 스프린트 완료마다 **완성도 KPI 섹션**을 업데이트하세요. +> 모든 WBS 항목의 구현 시 반드시 **하네스 성공 기준**을 먼저 충족 후 다음 단계로 진행합니다. From 63de4b922fbf8675a66e443ceaac1197ba217182 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 13 Jun 2026 13:51:25 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20WBS-1.2=20total=5Fasset=5Fkrw=20?= =?UTF-8?q?=EC=8B=A4=EC=8B=9C=EA=B0=84=20=EC=9E=AC=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gdc_01_fetch_fundamentals.gs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs b/src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs index 2e166f2..515e085 100644 --- a/src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs +++ b/src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs @@ -2054,7 +2054,7 @@ function runDataFeed() { // settings 탭 — 사용자 입력 파라미터 (total_asset_krw, risk_budget_override 등) const settings = readSettingsTab_(); ensureAccountSnapshotConfirmModeSetting_(settings); - const totalAssetKrw_ = Number.isFinite(parseFloat(settings["total_asset_krw"])) + let totalAssetKrw_ = Number.isFinite(parseFloat(settings["total_asset_krw"])) ? parseFloat(settings["total_asset_krw"]) : null; const riskBudget_ = Number.isFinite(parseFloat(settings["risk_budget_override"])) ? Math.min(0.02, Math.max(0, parseFloat(settings["risk_budget_override"]))) @@ -2193,6 +2193,20 @@ function runDataFeed() { }; }); + // WBS-1.2: total_asset_krw 실시간 재계산 (2-pass update cycle) + let liveTotalAssetKrw = Number.isFinite(settlementCashD2_) ? settlementCashD2_ : 0; + for (const ticker of Object.keys(positionStopMap_)) { + const priceMetrics = resolveDataFeedPriceMetrics(ticker); + const qty = positionStopMap_[ticker].quantity; + if (priceMetrics.ok && Number.isFinite(priceMetrics.close) && Number.isFinite(qty)) { + liveTotalAssetKrw += priceMetrics.close * qty; + } + } + if (liveTotalAssetKrw > 0) { + totalAssetKrw_ = liveTotalAssetKrw; + Logger.log(`[WBS-1.2] total_asset_krw 실시간 재계산 완료: ${totalAssetKrw_} KRW (현금: ${settlementCashD2_})`); + } + // Total_Heat 사전 계산 — HF005(≥10% 매수 차단) + caution(7~10% 수량 감액)에 사용 // positionStopMap_ 완성 후 즉시 계산. ATR 추정 폴백: entry_price × 8% (보수적) let globalHeatPct_ = null; // null = 계산 불가, number = heat%