feat: Sprint-3 (펀더멘털 피드 완성, MDD 모니터링 구축, Gitea CI/CD 파이프라인 추가) (2026-06-13)

주요 변경 사항:
- tools/ingest_fundamental_raw.py 수정:
  * yfinance 패키지를 활용한 Yahoo Finance 펀더멘털 연동 파이프라인 전면 개편
  * FCF, OCF 및 순부채(totalDebt - totalCash) 자동 폴백 계산을 구현하여 40개 NULL 컬럼 수집 완성
- src/gas_adapter_parts/gdc_01_fetch_fundamentals.gs 수정:
  * 일별 자산 및 MDD를 기록하는 logDailyAssetHistory_ 함수 구현 및 runDataFeed() 연동
- tools/build_realized_performance_v1.py 수정:
  * daily_history 탭으로부터 MDD_realized를 실시간 파싱하여 insufficient_data 제거
- .gitea/workflows/ci.yml 추가:
  * Gitea Actions 용 Spec 검증, 릴리즈 게이트 및 번들 빌드 자동화 파이프라인 구축
- docs/ROADMAP_WBS.md 수정:
  * WBS-2.1, WBS-3.4, WBS-5.1 과업의 체크박스를 완료[x] 상태로 갱신
- 검증 결과: npm run full-gate (55단계 릴리즈 게이트) PASS 검증 완료

Co-Authored-By: Antigravity AI <noreply@google.com>
This commit is contained in:
2026-06-13 14:31:40 +09:00
parent 64e6d54b67
commit eabacde438
5 changed files with 231 additions and 78 deletions
+15 -2
View File
@@ -231,7 +231,18 @@ def main() -> int:
t20_stats = _stats_block(t20_replay_returns, 20, "T+20_replay",
estimated=True, source="REPLAY_FROM_KRX_EOD (estimated=true)")
# ── 현재 포트폴리오 MDD 시나리오 ─────────────────────────────────────────
# ── 현재 포트폴리오 MDD 시나리오 및 daily_history 기반 실현 MDD 산출 ───────
daily_hist = payload.get("data", {}).get("daily_history") or []
realized_max_mdd = None
if daily_hist:
mdd_values = [
_f(r.get("MDD_Pct") or r.get("mdd_pct"))
for r in daily_hist
if _f(r.get("MDD_Pct") or r.get("mdd_pct")) is not None
]
if mdd_values:
realized_max_mdd = round(max(mdd_values), 2)
peak = _f(harness.get("portfolio_peak_krw"))
total = _f(harness.get("total_asset_krw"))
current_dd = {
@@ -241,6 +252,7 @@ def main() -> int:
round((peak - total) / peak * 100, 2) if peak and total and peak > 0
else 0.0
),
"realized_max_drawdown_pct": realized_max_mdd if realized_max_mdd is not None else INSUF,
"worst_case_scenario": _worst_case_mdd(harness),
}
@@ -248,11 +260,12 @@ def main() -> int:
insufficient = {
"CAGR_realized_1y": INSUF,
"sharpe_realized_1y": INSUF,
"MDD_realized": INSUF,
"MDD_realized": realized_max_mdd if realized_max_mdd is not None else INSUF,
"win_rate_realized_closed_trades": INSUF,
"profit_factor": INSUF,
"slippage_impact": INSUF,
"transaction_cost_impact": INSUF,
"in_sample_vs_oos_gap": INSUF,
"reason": "1년 이상 청산 완료 거래 이력 없음 — backdata MAE/MFE/pnl 전 행 공란",
}