Files
QuantEngineByItz/docs/ROADMAP_WBS.md
T

612 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 퀀트투자 엔진 — 전체 로드맵 & 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%` |
| **상태** | 완료 (배포 및 검증 PASS) |
**성공 하네스 (데이터 기준)**:
```
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` (1차 가격 수집은 `gdc_01_fetch_fundamentals.gs` 구현) |
| **수정 방법** | 2-pass 루프: 1차 가격 수집 → totalAssetKrw_ 재계산 → 2차 Weight_Pct |
| **상태** | 완료 (실시간 2-pass 재계산 완료) |
**성공 하네스 (데이터 기준)**:
```
검증: |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` |
| **상태** | 완료 (디폴트 60일 자동 계산 완료) |
**성공 하네스 (데이터 기준)**:
```
검증: 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 |
| **상태** | 완료 (floor 기반 수량 계산 완료) |
**성공 하네스 (데이터 기준)**:
```
검증: 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 표시 후 제거 |
| **상태** | 완료 (269개 공식 마이그레이션 및 대조 검증 PASS) |
**성공 하네스 (데이터 기준)**:
```
검증 명령: 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 자동 계산 |
| **상태** | 완료 (미국 주식 자산가치 및 Weight_Pct 자동 원화 스케일 연동 완료) |
**성공 하네스 (데이터 기준)**:
```
검증: 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` |
| **상태** | 완료 (KOSPI preReads 파싱 헤더 동적 스캔 적용 완료) |
**성공 하네스 (데이터 기준)**:
```
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섹션 |
| **상태** | 완료 (DAG 검증 PASS) |
**성공 하네스 (데이터 기준)**:
```
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 입력용 주문표 |
| **상태** | 완료 (ETF 및 미국 주식 호가 단위 세분화 완료, H004 검증 PASS) |
**성공 하네스 (데이터 기준)**:
```
검증: 지정가 = 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 정확도: 99% → 목표: 99% (소수주 병합 후 완료)
총자산 오차: 0.0% → 목표: 2.0% 이하 (실시간 재계산 완료)
공식 레지스트리:
lifecycle 등록률: 100% → 목표: 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 (이번 주): 기반 경화 완결 (완료)
```
[x] WBS-1.1: GAS 배포 후 Weight_Pct 검증 (005930 ≥ 40%)
[x] WBS-1.2: totalAssetKrw_ 2-pass 재계산 구현
[x] WBS-1.3: Time_Stop_Date 자동 산출 (entry_date + 60일)
[x] WBS-1.4: Rule_Sell_Qty = floor(qty × Sell_Ratio_Pct / 100) 구현
[x] WBS-3.1: rebalance 시트 GAS 실행 확인 (timestamp 확인)
```
### Sprint-2 (2주): 신호 완성 (완료)
```
[x] WBS-2.3: RS_Verdict_V1_Raw, RS_Line_20D_Slope 로직 구현
[x] WBS-2.2: US 주식 가격 settings 수동입력 → 자동 Weight_Pct 연동
[x] WBS-3.3: 주문 시뮬레이터 tick 정규화 완성
[x] 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 항목의 구현 시 반드시 **하네스 성공 기준**을 먼저 충족 후 다음 단계로 진행합니다.