← 리포트 목록
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.logpreview- 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=1dry-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.mdQC-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. 남은 리스크 / 후속
- macro/fundamental 일부 입력 데이터가 stale이다. 발송 포맷은 이를 드러내게 고쳤지만, 근본 해결은 수집 cron freshness 회복이다.
- PM은 아직 실제 계좌/보유비중 기반이 아니다. 해리 실제 포지션을 연결하지 않으면 “권장 모델 포지션”으로만 봐야 한다.
- technical은 quant_signals와 차트 생성이 빠져 있다. 현재는 RSI/MACD/일목/z-score 중심으로 충분히 보완하지만, 품질을 더 올리려면 quant_signals 수집 실패를 고쳐야 한다.
- 시간 민감 이벤트(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