feat: DAG T+20 추적 인프라 + 섹터 추세 시계열 개선
DAG (step_count 83→86): - update_proposal_evaluation_history (wave_5): 일간 실행 — core_satellite 제안 기록 + T+1/T+5/T+20 자동 평가 - build_operational_eval_queue (wave_5): T+20 평가 대기 큐 — due_date 초과 종목 목록 - build_operational_outcome_lock (wave_5): 실운영 T+20 성과 잠금 — 30건 이상 누적 후 활성화 - build_algorithm_guidance_proof depends_on에 build_operational_outcome_lock 추가 - validate_specs.py: 41_release_dag.yaml 50KB 예외 추가 (DAG 확장 예정) 렌더러/워크북: - render_operational_report.py: 섹터 상위 3개 최근 5기 추세 테이블 추가 (score/ret20d/smart_money sparkline) - update_workbook_sector_insights.py: sector_flow_history 기반 섹터 시계열 차트 추가 (score + smart money) 운영: update_proposal_evaluation_history 최초 실행 — 75건 core_satellite 제안 기록 완료 (T+20 ~2026-07-12) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -580,6 +580,26 @@ def _sector_trend_analysis_v1(data_root: dict, hctx: dict, se: list) -> str:
|
||||
"sector", "score_trend", "smart_money_trend", "latest_score", "latest_smart_money_5d",
|
||||
"sector_ret20d", "smart_money_direction", "flow_alignment_state",
|
||||
], max_rows=6)
|
||||
top3 = [r.get("sector") for r in rows_data[:3] if r.get("sector")]
|
||||
top3 = [s for i, s in enumerate(top3) if s and s not in top3[:i]]
|
||||
if top3:
|
||||
trend_rows = []
|
||||
for sector in top3:
|
||||
series = sorted(sector_histories.get(sector, []), key=lambda r: str(r.get("Snapshot_Date") or ""))[-5:]
|
||||
trend_rows.append({
|
||||
"sector": sector,
|
||||
"score_trend": _sparkline([r.get("Sector_Score") for r in series]),
|
||||
"ret20d_trend": _sparkline([r.get("Sector_Ret20D") for r in series]),
|
||||
"smart_money_trend": _sparkline([r.get("SmartMoney_5D_KRW") for r in series]),
|
||||
"latest_score": series[-1].get("Sector_Score", "") if series else "",
|
||||
"latest_ret20d": series[-1].get("Sector_Ret20D", "") if series else "",
|
||||
"latest_smart_money_5d": series[-1].get("SmartMoney_5D_KRW", "") if series else "",
|
||||
})
|
||||
md += "\n\n**상위 섹터 최근 5기 추세**\n\n"
|
||||
md += _tbl(trend_rows, [
|
||||
"sector", "score_trend", "ret20d_trend", "smart_money_trend",
|
||||
"latest_score", "latest_ret20d", "latest_smart_money_5d",
|
||||
], max_rows=3)
|
||||
md += "\n\n**포트폴리오 / 자금 맥락**\n\n"
|
||||
beta_gate = _sj(hctx.get("portfolio_beta_gate_json", {}))
|
||||
corr_gate = _sj(hctx.get("portfolio_correlation_gate_json", {}))
|
||||
|
||||
Reference in New Issue
Block a user