virtual-insanity
← 리포트 목록

analyst 4개 품질점검 및 wrapper 본문 개선

2026-04-16 qc [analyst, quality-check, telegram, wrapper, market-topic]

결론

07:05~07:40 자동 발송 자체는 정상 도달했다.

analyst 아침 msg_id 도달 최신 산출물
macro 2377 OK memory/analyst-macro/latest.json
fundamental 2378 OK memory/analyst-fundamental/latest.json
technical 2379 OK memory/analyst-technical/latest.json
pm 2380 OK memory/analyst-pm/latest.json

해리 피드백의 원인은 “산출물 자체가 완전 공허”라기보다, 공통 wrapper가 최신 JSON의 중요한 근거·한계·액션을 너무 얇고 기계적으로 잘라 보낸 것이었다. 특히 technical은 섹터명이 빠지고 signal=...만 나오는 식으로 본문이 부실해졌다.

수정 후 개선본을 실제 market 토픽에 재전송했고 message_id를 확보했다.

analyst 개선 재전송 msg_id status
macro 2383 OK
fundamental 2384 OK
technical 2385 OK
pm 2386 OK

1. 실제 본문 확보 방법

Telegram Bot API는 과거 메시지 본문 조회 API를 제공하지 않으므로, 실제 발송 본문을 직접 역조회할 수는 없다. 대신 아래 근거를 조합했다.

  • ~/.hermes/logs/analyst_<name>_common_wrapper.log
  • ~/.hermes/logs/analyst_<name>_last_telegram.tsv
  • ~/.hermes/workspace/memory/analyst-<name>/latest.json
  • ~/.hermes/logs/sector_trace.log preview
  • wrapper에 ANALYST_COMMON_NO_SEND=1 / ANALYST_COMMON_PRINT_BODY=1를 추가해 전체 본문 재구성

본문 캡처:

ANALYST_COMMON_SKIP_RUN=1 ANALYST_COMMON_NO_SEND=1 ANALYST_COMMON_PRINT_BODY=1 \
  /bin/bash ~/.hermes/workspace/scripts/analyst_common_wrapper.sh macro

캡처 파일:

/tmp/analyst_qc_bodies_after.txt

2. 품질 평가

analyst-macro

확인한 지표:

  • WTI/Brent/TTF/Heating Oil/디젤크랙
  • GPR 304
  • VIX 및 VIX 기간구조
  • KRW/USD, DXY, EUR/USD, USD/JPY, USD/CNY
  • US10Y, 2s10s, 실질금리, BEI, FWD 5Y5Y
  • 구리, BDI, HRC, 금/은, 농산물
  • IG/HY/한국 회사채 스프레드

평가:

  • 해석 깊이는 있음. 에너지 급락 vs 산업금속 강세라는 핵심 구도가 반복적으로 잡혀 있다.
  • 다만 산출물 자체가 data_vintage = 2026-04-14 close라고 명시한다. 즉 4/16 아침 리포트지만 시장 데이터는 4/14 마감 기반이다.
  • PMI/고용/소비는 직접 데이터가 없고 산업금속/BDI 같은 프록시를 사용한다.

이상 포인트:

  • “오늘 리포트”처럼 보이지만 실제 가격 데이터는 stale.
  • wrapper가 stale 문구를 충분히 전면에 내지 않았다.

판정: 내용은 있으나 데이터 신선도 경고가 약해서 실전 리포트로 오해 가능.

개선:

  • wrapper 본문 상단에 데이터 신선도 섹션 추가.
  • causal analysis와 금리/물가 핵심값을 본문에 직접 노출.

개선 본문 샘플:

<b>🌍 매크로 리포트</b>
날짜: 2026-04-16

판정: Recovery · 신뢰도 60%
데이터 신선도: 2026-04-14 close (4/15-16 수집 미실행, 동일 데이터 기반)
WTI: -7.3%, Brent -4.2%, TTF -8.4%, Heat Oil -9.3%
VIX: 18.5, 전면 콘탱고
US10Y: 4.26%, 실질금리 1.95%, BEI 2.38%
시나리오: base 60 / bull 20 / bear 20

analyst-fundamental

커버 범위:

  • 17개 산업 사이클 포지션
  • 반도체, 조선, 방산, 소재, 에너지/정유, 석유화학, 배터리/EV 등
  • ASML, TSMC, 삼성전자, AMD, 브로드컴, 셀트리온, 금호석유, 롯데케미칼, SKC, LG화학, 포스코퓨처엠 등

외부 사실 확인:

  • ASML Q1 2026 공식 발표: Q1 순매출 €8.8B, 순이익 €2.8B, 2026 매출 가이던스 €36B~€40B. 산출물의 ASML 핵심 숫자는 공식 발표와 부합한다. 출처: ASML 공식 보도자료.
  • TSMC IR 페이지: Q1 2026 earnings conference는 2026-04-16 14:00 Taiwan time 예정. “TSMC 오늘 발표”는 일정상 맞다. 출처: TSMC IR.

평가:

  • 종목과 이벤트는 충분히 있다.
  • 다만 context-fundamental.json (2026-04-14) 기반이라 일부 밸류에이션/산업 포지션은 전일 데이터다.
  • “오늘 TSMC” 같은 표현은 발표 이후 시간이 지나면 stale 문장이 되므로 시간 조건이 필요하다.

이상 포인트:

  • wrapper가 “상향/하향 종목”을 제한적으로 보여줘 전체 산업 맥락이 잘렸다.
  • 밸류에이션 숫자의 원천/시점이 본문에 약했다.

판정: 원자료는 쓸만하지만, 시간 민감 이벤트와 데이터 시점을 더 강하게 표시해야 함.

개선:

  • sources와 이벤트 일정을 본문에 표시.
  • 상향/하향/밸류에이션/섹터 영향 섹션을 분리.

개선 본문 샘플:

<b>📊 펀더멘탈 리포트</b>
TSMC 실적 오늘(4/16) 발표, 반도체 확장기 최종 확인 이벤트
sources: context-fundamental 2026-04-14; macro 2026-04-16; DART 최근 3일
상향: ASML, 삼성전자, AMD, 브로드컴, 셀트리온, 금호석유
주의: 롯데케미칼, SKC, LG화학, 포스코퓨처엠, 한화에어로
밸류: 삼성전자 PEG 0.19, HD한국조선해양 PEG 0.21, 포스코퓨처엠 FwdPE 185x

analyst-technical

실제 지표:

  • RSI, MACD, 일목균형표, z-score
  • SOXX, IWM, NDX, XLE, XLP, XLV, HYG, IVE, EWJ, DXY, EURUSD, USDCNY
  • VIX 구조, IG/HY/BBB 스프레드, PCR 3.316
  • bearish divergence 3건

평가:

  • 실제 차트/모멘텀 지표는 있다.
  • 하지만 quant_signals가 빈 객체이고 차트는 미생성이다.
  • 기존 wrapper가 sector_rotation dict를 잘못 요약해서 signal=강한유입처럼 섹터/티커가 빠진 문장만 나왔다. 이게 “내용 이상”의 핵심 원인 중 하나다.

이상 포인트:

  • 일반 시황처럼 보였고 실제 종목/지표가 충분히 노출되지 않았다.
  • 섹터 로테이션에서 섹터명/ETF/RSI가 빠지는 포맷 버그.
  • 차트 미생성, quant_signals 실패가 본문에 드러나지 않음.

판정: 산출물은 기술적이지만 wrapper 포맷 버그로 부실하게 보였음.

개선:

  • 섹터 로테이션을 섹터: 신호 / ETF / RSI 형태로 출력.
  • RSI extremes와 divergence도 ticker/rsi/signal을 같이 표시.
  • 데이터 품질 결측을 상단에 표시.

개선 본문 샘플:

<b>📈 테크니컬 리포트</b>
리스크온 지속(score 0.75), 17/22 자산 3중강세
데이터 신선도: quant_signals 빈 객체, 차트 미생성
Top: SOX +18.2%MoM z=2.28 RSI=73.08, LIT z=2.20, RUT z=2.14
Bottom: XLE RSI=38.47 3중약세, NATGAS -13.9%, DSLCRACK -18.5%
섹터: 반도체 SOXX RSI=73.08 과매수 극단유입 / 에너지 XLE RSI=38.47 급격한 이탈
경고: HYG/IVE/EWJ bearish divergence, PCR 3.316

analyst-pm

확인 범위:

  • macro/fundamental/technical 3개 산출물 종합
  • 반도체/조선/방산/소재/에너지전환/정유/바이오/소비재 비중 가이드
  • 트리거: TSMC beat, VIX/HY/DXY, SOXX 급락, GPR/호르무즈, divergence 확산

평가:

  • 포트폴리오형 결론은 있음.
  • 그러나 실제 해리 계좌/보유 포지션 기반은 아니다. analyst 산출물 기반 모델 포지셔닝이다.
  • 기존 wrapper는 이 한계를 표시하지 않아 실제 리밸런싱 지시처럼 오해될 수 있었다.

이상 포인트:

  • 실제 포지션·평단·보유비중 없음.
  • 비중 가이드는 모델 가이드이지 계좌 액션이 아님.
  • action trigger 출력이 action=...만 나오는 포맷 문제가 있었다.

판정: PM 판단은 쓸 수 있지만, “실제 계좌 기반 아님”을 반드시 표시해야 함.

개선:

  • 상단에 “실제 계좌/보유비중 아님” 경고 추가.
  • 섹터 액션을 섹터/액션/비중가이드/확신/근거로 확장.
  • 액션 트리거를 조건 → 행동 (확률) 형태로 출력.

개선 본문 샘플:

<b>🧭 PM 리포트</b>
판정: 적극 · 확신도 72%
주의: 실제 계좌/보유비중이 아니라 analyst 산출물 기반 모델 포지셔닝
합의: 반도체 3레이어 강세, 에너지/정유 3레이어 약세, 소재 강세, 달러 약세→EM/아시아 수혜
섹터 액션: 반도체 공격 20%, 조선 공격 12%, 방산 유지 10%, 소재 적극 8%, 정유 축소 3%
트리거: TSMC beat → 반도체 25% 확대 / VIX>22+HY확대+DXY반등 → 방어 전환

3. 적용한 수정

신규 파일

  • /Users/ron/.hermes/workspace/scripts/analyst_common_sender.py

역할:

  • latest.json → Telegram HTML 본문 생성
  • ANALYST_COMMON_NO_SEND=1 dry-run 지원
  • ANALYST_COMMON_PRINT_BODY=1 전체 본문 출력 지원
  • 실제 발송 시 send_sector_result("market")
  • TSV message_id/status 기록

수정 파일

  • /Users/ron/.hermes/workspace/scripts/analyst_common_wrapper.sh
  • 기존 embedded Python 제거
  • analyst_common_sender.py 호출로 분리
  • /Users/ron/.hermes/workspace/scripts/analyst_macro_prompt.md
  • /Users/ron/.hermes/workspace/scripts/analyst_fundamental_prompt.md
  • /Users/ron/.hermes/workspace/scripts/analyst_technical_prompt.md
  • /Users/ron/.hermes/workspace/scripts/analyst_pm_prompt.md
  • QC-260416 품질 게이트 추가

prompt backup

  • /Users/ron/.hermes/workspace/scripts/analyst_macro_prompt.md.bak-qc-260416-20260416T081430
  • /Users/ron/.hermes/workspace/scripts/analyst_fundamental_prompt.md.bak-qc-260416-20260416T081430
  • /Users/ron/.hermes/workspace/scripts/analyst_technical_prompt.md.bak-qc-260416-20260416T081430
  • /Users/ron/.hermes/workspace/scripts/analyst_pm_prompt.md.bak-qc-260416-20260416T081430

4. 개선 본문 검증

Dry-run:

ANALYST_COMMON_SKIP_RUN=1 ANALYST_COMMON_NO_SEND=1 ANALYST_COMMON_PRINT_BODY=1 \
  /bin/bash /Users/ron/.hermes/workspace/scripts/analyst_common_wrapper.sh technical

실제 개선본 재전송:

for n in macro fundamental technical pm; do
  ANALYST_COMMON_SKIP_RUN=1 \
    /bin/bash /Users/ron/.hermes/workspace/scripts/analyst_common_wrapper.sh "$n"
done

결과:

analyst 개선 message_id body_len status
macro 2383 2067 success
fundamental 2384 1652 success
technical 2385 2065 success
pm 2386 3062 success

최신 TSV:

macro       2026-04-16T08:15:10 OK 2383 market -1003522748967 5 none
fundamental 2026-04-16T08:15:12 OK 2384 market -1003522748967 5 none
technical   2026-04-16T08:15:13 OK 2385 market -1003522748967 5 none
pm          2026-04-16T08:15:14 OK 2386 market -1003522748967 5 none

sector_trace:

2026-04-16 08:15:09 send_sector(market) caller=analyst_common_wrapper.sh:macro
2026-04-16 08:15:10 send_sector(market) caller=analyst_common_wrapper.sh:fundamental
2026-04-16 08:15:12 send_sector(market) caller=analyst_common_wrapper.sh:technical
2026-04-16 08:15:13 send_sector(market) caller=analyst_common_wrapper.sh:pm

5. 남은 리스크 / 후속

  1. macro/fundamental 일부 입력 데이터가 stale이다. 발송 포맷은 이를 드러내게 고쳤지만, 근본 해결은 수집 cron freshness 회복이다.
  2. PM은 아직 실제 계좌/보유비중 기반이 아니다. 해리 실제 포지션을 연결하지 않으면 “권장 모델 포지션”으로만 봐야 한다.
  3. technical은 quant_signals와 차트 생성이 빠져 있다. 현재는 RSI/MACD/일목/z-score 중심으로 충분히 보완하지만, 품질을 더 올리려면 quant_signals 수집 실패를 고쳐야 한다.
  4. 시간 민감 이벤트(TSMC “오늘”, 실적 발표 등)는 발송 시각 이후 stale해질 수 있다. prompt gate에 시점 명시를 추가했지만, 장중 업데이트가 필요하면 별도 이벤트 watcher가 필요하다.

6. 외부 확인 출처

  • ASML 공식 Q1 2026 발표: https://www.asml.com/en/news/press-releases/2026/q1-2026-financial-results
  • TSMC IR Q1 2026 일정: https://investor.tsmc.com/japanese/quarterly-results/2026/q1

자체평가

  • 정확성: 4.7/5 — 4개 최신 산출물·로그·TSV 확인, 품질 문제와 원인을 분리했다.
  • 완성도: 4.6/5 — wrapper 포맷 개선, no-send 본문 캡처, prompt quality gate, 실제 재전송까지 완료.
  • 검증: 4.8/5 — dry-run 본문 확인 + 실제 market topic message_id 2383~2386 확보.
  • 최소 변경: 4.5/5 — analyst 원본 py는 수정하지 않고 wrapper/sender/prompt만 보강.
  • 종합: 4.65/5