Skip to content

feat: 일일 리포트 v2 — 시장/설계/일정 대비 지표 추가#429

Merged
easygap merged 1 commit into
mainfrom
feat/daily-report-v2
Jul 2, 2026
Merged

feat: 일일 리포트 v2 — 시장/설계/일정 대비 지표 추가#429
easygap merged 1 commit into
mainfrom
feat/daily-report-v2

Conversation

@easygap

@easygap easygap commented Jul 2, 2026

Copy link
Copy Markdown
Owner

무엇

한 달 운영 리뷰(docs/PAPER_MONTH1_REVIEW_AND_PLAN.md §4 P0-3)의 일일 리포트 v2를 구현합니다. 기존 카드는 절대 수익만 있어 "왜"를 판단할 수 없었는데, 시장 대비 / 설계 대비 / 일정 대비를 한눈에 보이게 했습니다.

추가된 필드

실데이터 예시:

📊 vs KS11        NAV -5.47% vs KS11 +0.71% (격차 -6.18%p)
🎯 주식 배치율     주식 59% / 설계 80% (-21.0%p)
📅 진행률         17/60일 (28%) · 커버리지 94% · 결측예산 2일
💸 누적 비용       누적 0.096% · 연환산 1.43% (참고)
⚠️ 미체결 슬롯     미체결 1개: 000660 1주 2,357,000원 > 슬롯 767,343원 — 자본 결정 대기(#422)

구조 (테스트 용이하게 분리)

  • core/basket_evaluation.py — 순수 포맷터 build_daily_report_extras(). 평가결과에 snapshot_days 노출(결측예산 계산용).
  • core/basket_rebalancer.py — 읽기전용 진단 diagnose_deployment(). 종목별 드리프트가 못 보는 집계 배치율 이탈과 미체결 슬롯을 함께 드러냄.
  • main.py — 일일 사이클에서 배선. 부가필드 계산 실패해도 기본 카드는 항상 발송(채널은 보조).
  • core/notifier.py — 5개 필드 선택 렌더링(값 있을 때만 → 하위 호환).

적대적 리뷰 반영

다중 에이전트로 diff를 검토(11건 제기 → 7건 확정·전부 low, 3건 반증, 1건 불확실). 확정 항목 반영:

  • 스냅샷 결측일에 카드의 '누적 수익률'(오늘 시가)과 벤치마크 격차의 NAV(직전 스냅샷)가 어긋나던 문제 → 동일 소스(카드의 누적 수익률)로 통일.
  • 결측예산이 기간 초과 운영 시 과소 표기 → 게이트와 같은 기준 max(min_days, progress_days)로 정합.
  • min_trading_days=0(무의미 설정)에서 '5/0일' 방어.
  • 경계 테스트 보강: >3 슬롯 요약("외 N개"), min_trade arm, price/total_value 0 경계, 비용 부분 분기.

남은 저순위(별도): KS11 조회 캐시 없음 — 바스켓 N개면 매일 N회 재조회(현재 N=1이라 무해, 공유 함수 변경이라 P1에서).

테스트

  • 신규: tests/test_daily_report_extras.py(포맷터), TestDiagnoseDeployment(진단), notifier 렌더링 2건.
  • 전체 스위트 통과, 실데이터 스모크로 5개 필드 확인(벤치 격차 NAV == 카드 누적 수익률 일치).

한 달 운영 리뷰(docs/PAPER_MONTH1_REVIEW_AND_PLAN.md P0-3)의 처방을 구현했다.
기존 일일 카드는 절대 수익만 있어 -5.47%가 전략 탓인지 판단할 수 없었다.
아래 세 축을 카드에 추가해 왜 그런지 한눈에 보이게 한다.

추가 필드:
- 📊 vs KS11: NAV vs 벤치마크 격차 (시장 대비)
- 🎯 주식 배치율: 실제 주식비중 vs 설계 80% (설계 대비)
- 📅 진행률: n/60일 · 커버리지 % · 잔여 결측예산 (일정 대비)
- 💸 누적 비용: 누적/연환산(기간 미충족 시 참고 표기)
- ⚠️ 미체결 슬롯: 현재 자본으로 못 채우는 슬롯 경고(#422)

구조:
- core/basket_evaluation.py: 순수 포맷터 build_daily_report_extras + 평가결과에
  snapshot_days 노출(결측예산 계산). 테스트 용이하게 분리.
- core/basket_rebalancer.py: 읽기전용 diagnose_deployment — 종목별 드리프트가
  못 보는 집계 배치율 이탈 + 미체결 슬롯을 함께 드러낸다.
- main.py: 일일 사이클 배선. 부가필드 실패해도 기본 카드는 발송(채널 보조).
- core/notifier.py: 값 있을 때만 렌더링(하위 호환).

적대적 리뷰 반영: 스냅샷 결측일 NAV 단일소스화(카드 누적수익률과 일치),
결측예산 게이트 정합(max(min_days, progress_days)), min_trading_days=0 방어,
경계 테스트 보강(>3 슬롯 요약, min_trade arm, 가격/총자산 0).

전체 스위트 1548 통과, 실데이터 스모크 확인.
@easygap easygap merged commit 7574198 into main Jul 2, 2026
1 check passed
@easygap easygap deleted the feat/daily-report-v2 branch July 2, 2026 04:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant