석유 공급망 모니터 전수 심층 감사
석유 공급망 모니터 전수 심층 감사 — 2026-04-20
결론
16:54 알림센터 메시지의 핵심 문제는 템플릿/추정값이 실제 transit 데이터보다 우선된 것이었다. 이번 패치로 아래를 교정했다.
- 공급 균형:
2,190만 bpd 차단고정성 숫자 제거 →1,400만 bpd 차단으로 재계산. - 타임라인: D+7/14/21/28 모두 확인됨, D+42만 미확인으로 복원.
- 뉴스: 지적된 영문 원문 3건 규칙 기반 한국어 요약으로 교체.
- 차트: WTI 커브 + Brent spot + Henry Hub 커브 + JKM spot + TTF 박스가 같이 보이는 통합 차트로 복원.
- 출처: WTI/Brent/JKM/호르무즈/보험료/한국 재고/기뢰/East-West/정유 상태에 출처·날짜 주석 추가.
- 봉쇄전비: 기준점
2026-02-28, WTI $70명시.
A. 문제별 원인과 패치
1) 공급 균형 템플릿
기존 코드 위치:
- _section_a_supply_status() 내부 hormuz_cut + iraq_cut 계산
- 부분봉쇄=1,750만 bpd, iraq_cut=440만 bpd를 더해 2,190만 bpd가 반복 노출될 수 있었음.
수정:
- _compute_oil_supply_balance() 추가.
- 평시 통과량 기준 100척/일, 실제 Kpler transit 20척+/일 → 감소율 80%.
- 평시 호르무즈 흐름 1,750만 bpd × 80% = 1,400만 bpd 차단.
- 이라크 물량은 호르무즈 흐름에 포함된 것으로 보고 별도 중복 가산 제거.
- IEA 잔여 39일은 공식 수치가 아니라 90일 시나리오 기준 잔여일로 명시.
2) 단계 실물 검증 전부 미확인
기존 원인:
- validator가 과도하게 엄격했음. 예: D+21은 tanker < 10, D+28은 한국 재고 < 40일 또는 VLCC $300K+만 확인.
- 16:54에서는 transit 20척, 백워데이션 9.27, EastWest 가동 같은 실물 신호가 있었는데도 미확인 처리됨.
수정:
- D+7: hormuz_tanker_daily < 100 또는 대체 경로 가동.
- D+14: hormuz_tanker_daily < 50 또는 정유 감산.
- D+21: hormuz_tanker_daily < 50 또는 기뢰 제거 시작/진행.
- D+28: backwardation_m1_m6 >= $5 또는 BDI/VLCC proxy.
- D+42: 한국 재고 < 90일 또는 정유 감산/가동중단. 현재는 한국 재고 200일+ 및 정유 정상이라 미확인 유지.
- 출력에 각 단계 근거 필드도 표시.
Preview 결과:
- D+7✅ · D+14✅ · D+21✅ · D+28✅ · D+42⚠️
3) 뉴스 영문 원문 잔존
기존 원인:
- _ko_rule_summary()는 vault snapshot 일부에만 적용됐고, 텔레그램 본문 _section_c_intelligence()에서는 topic/detail 원문을 그대로 출력.
수정:
- _section_c_intelligence()의 escalation/deescalation/headline 출력 전에 _ko_rule_summary() 적용.
- 아래 지적 문구를 직접 패턴으로 처리:
- Start your week right... → 지난 24시간 핵심 뉴스 묶음 — 러시아 수사·전황·정치 뉴스 요약
- Iranian Armed Forces Central Headquarters... → 이란군 미군 해상작전에 대한 대응 예고성 성명
- Iran, Pakistan Foreign Ministers Discuss Ceasefire... → 이란·파키스탄 외무장관 휴전 관련 통화
검증:
- /tmp/oil_supply_monitor_deep_audit_preview.log에서 세 문구 grep 결과 0건.
4) 통합 차트
기존 상태: - 함수 자체는 WTI+HH twin axis 기반이었지만 메시지에서 WTI 선물커브만 보이는 인상이 강했고 Brent/JKM가 차트에 없었음.
수정:
- generate_curve_chart()에 brent_price, jkm_price 인자 추가.
- 좌축: WTI 커브 + Brent spot horizontal.
- 우축: Henry Hub 커브 + JKM spot horizontal.
- TTF는 우상단 박스로 표시.
- 제목도 WTI/Brent oil + Henry Hub/JKM/TTF gas로 변경.
Preview 차트:
- /var/folders/7m/5k4m6j951nzd8fzsp4ds12580000gn/T/oil_monitor_curve_48yo49uj_v3.png
5) 표기불명·출처 주석
수정:
- ## 출처 주석에 아래 항목 기록:
- 호르무즈 통과량/status: Reuters/Kpler via TBS, 2026-04-20.
- WTI: yfinance CL=F, 2026-04-17.
- Brent: yfinance BZ=F, 2026-04-17.
- JKM: yfinance JKM=F 또는 Hermes market cache, 2026-04-17.
- 백워데이션: yfinance CL futures chain, 2026-04-17.
- 전쟁위험보험료: 최신 일일 수치 미확인. Bloomberg 2026-03-16 약 5% 및 WEF 2026-04-09 repricing/withdrawal만 근거.
- 한국 원유 재고: KNOC/MOTIE 인용 보도, 2026-04-06, 200일+.
- 기뢰 제거: CENTCOM, 2026-04-11, 시작/조건 설정.
- 대체 경로: ICIS/Reuters/Saudi Energy Ministry, 2026-04-13, East-West full capacity.
- 한국 정유: ChosunBiz/MOTIE, 2026-04-15, stockpile swap 확인·감산 공시 미확인.
6) 기타 의심 값
- 봉쇄전비 기준점:
2026-02-28, WTI $70로 명시. - IEA 잔여 39일: 공식 수치 아님.
90일 시나리오 기준 잔여 39일로 표기 변경. EastWest가동: IPSA가 아니라 Saudi East-West/Petroline full capacity 복구로 교정.
B. 수동 preview 검증
명령:
PYTHONPATH=/Users/ron/.hermes/workspace/scripts/shared:/Users/ron/.hermes/workspace/scripts/pipeline:/Users/ron/.hermes/workspace/scripts \
/opt/homebrew/bin/python3.11 /Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py --dry-run
로그:
- /tmp/oil_supply_monitor_deep_audit_preview.log
핵심 출력:
원유: 차단 1,400만bpd / 대체 350만bpd = 순결손 1,050만bpd (10.3%)
산식: 평시 100척/일 대비 통과 20척/일 vs 평시 100척/일 → 감소율 80%
D+7✅ · D+14✅ · D+21✅ · D+28✅ · D+42⚠️
WTI $83.8 / Brent $90.4 / JKM $15.00 / HH $2.67 / TTF €38.8
백워데이션 M1-M6 $+9.3
C. 실측 gate
| Gate | 결과 |
|---|---|
| 공급 균형 숫자가 transit와 정합 | PASS — 20척/일, 감소율 80%, 차단 1,400만 bpd |
| D+7/14/21 중 최소 1개 확인됨 | PASS — D+7/14/21/28 확인됨 |
| 뉴스 영문 원문 0건 | PASS — 지적 3문구 grep 0건 |
| 차트에 WTI/Brent + HH/JKM/TTF 병치 | PASS — 코드 및 생성 PNG 확인 |
| 지표 출처·날짜 주석 | PASS — snapshot ## 출처 주석 생성 |
| 봉쇄전비 기준점 | PASS — 2026-02-28, WTI $70 표기 |
D. 수정 파일
- 백업:
/Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py.bak-deep-audit-20260420 - 수정:
/Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py - diff preview:
/tmp/oil_monitor_deep_audit.diff
E. 남은 리스크
- EIA API 429가 지속되어 Cushing/Fujairah/floating storage는 아직 결측. 캐시·쿨다운이 있지만 오늘 수동 반복 실행으로 rate limit이 누적됨.
- 전쟁위험보험료는 최신 일일 rate를 공짜 공개 소스로 못 찾음. 현재는
데이터없음이 맞고, Lloyd's/Bloomberg 유료/터미널 연동이 필요. - BDTI/BCTI는 Baltic 공개 페이지가 JS/권한 이슈라 직접 수집 실패 시 BDI proxy로 유지.
자체평가
- 정확성: 4.5/5
- 완성도: 4.4/5
- 검증: 4.5/5
- 최소 변경: 4.3/5
- 종합: 4.43/5
F. 최종 market 토픽 재전송
- 실행 로그:
/tmp/oil_supply_monitor_deep_audit_send.log - 알림센터 market 발송: PASS
- 알림센터 차트 발송: PASS
- 보존 차트:
/Users/ron/knowledge-agent/400-reports/260420_oil_monitor_oil_gas_dual_axis_v3.png - 최종 snapshot:
/Users/ron/knowledge-agent/500-signals/에너지/260420_oil-supply-snapshot.md
최종 gate 재확인:
| Gate | 결과 |
|---|---|
차단 1,400만bpd 노출 |
PASS |
D+7/14/21 확인됨 |
PASS |
| 지적 영문 원문 3건 제거 | PASS |
| 출처 주석 snapshot 포함 | PASS |
봉쇄전(2026-02-28, WTI $70) 표시 |
PASS |
| market 토픽 전송 | PASS |
| chart 전송 | PASS |
추가 심층 감사 반영 — 항목 7~11 (2026-04-20 23:22 KST)
반영 요약
- 단계 실물 검증 근거 강화: D+7/D+14는 단순
hormuz_tanker_daily/EastWest가동만으로 확인하지 않도록 수정. 로컬 볼트/수집 노트에서 실제 설비·정유 가동 중단/감산 문장과file://근거가 있을 때만 확인 처리. - 실물 공급 지표 출처 보강: 싱가포르 크랙, Cushing, Fujairah, 해상부유저장에 숫자와 출처 주석을 붙임.
- WTI 커브 4시점 복원: 현재/1일전/1주전/전쟁전(2026-02-28) yfinance 선물체인을 수집하고 차트에 병치.
- 가스 커브 차트 복원: Henry Hub 현재/1일전/1주전/전쟁전 + JKM/TTF 참고값을 별도 PNG로 생성.
- 본문 축약: 긴 원문 URL/근거문장/반복 범례를 줄이고, 단계 근거는
문장확인 + 짧은 소스 경로로 표시. HTML 특수문자 escape 처리로<정유/화학>같은 원문이 텔레그램 HTML을 깨는 문제도 수정.
수정 파일
/Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py- 백업:
/Users/ron/.hermes/workspace/scripts/pipeline/oil_supply_monitor.py.bak-deep-audit-20260420
검증 결과
py_compile: PASS- dry-run: PASS (
/tmp/oil_supply_monitor_deep_audit_final5_preview.log) - DM/market 전송: 금지 지시 준수 — dry-run만 수행, 발송 없음
- 차트 산출물:
- WTI 4시점:
/Users/ron/knowledge-agent/400-reports/260420_oil_monitor_wti_4point_curve_v4.png - 가스 커브:
/Users/ron/knowledge-agent/400-reports/260420_oil_monitor_gas_curve_v4.png
실측 gate 체크
| gate | 결과 | 근거 |
|---|---|---|
| 7. D+N 확인 단계마다 source URL/볼트 경로 | PASS | D+7 260419_petrochem_wooho.md, D+14 260325_ranto28_...md, D+21 TBS/Kpler URL, D+28 coal-report local file |
| 8. 실물 공급 지표 4개 중 최소 2개 숫자 | PASS | 싱가포르크랙 $39.2/bbl, Cushing -1.7MB, Fujairah 9.7MB, 해상부유저장 100MB |
| 9. WTI 커브 4시점 수집 | PASS | dry-run stdout: WTI 역사 커브: 현재 + 1일전, 1주전, 전쟁전 |
| 10. 가스 커브 PNG 별도 생성 | PASS | 260420_oil_monitor_gas_curve_v4.png |
| 11. 메시지 길이 축소 | PASS | 기존 final2 3400자 → 최종 formatter 기준 2743자(약 -19.3%), 초기 추가감사 로그 3669자 대비 약 -25.2% |
출처 주석 확인 위치
- snapshot 출처 블록:
/Users/ron/knowledge-agent/500-signals/에너지/260420_oil-supply-snapshot.md - 싱가포르 크랙: yfinance HO/RB/BZ proxy
- Cushing: Trading Economics / EIA fallback
- Fujairah: Reuters / S&P Global Commodity Insights via Sahm Capital
- 해상부유저장: IEA Oil Market Report April 2026
남은 리스크
- EIA API는 여전히 429이며, 현재는 Cushing fallback으로 보완.
- VLCC day-rate는 공개 소스에서 안정 수집 실패. BDI proxy만 표시하며 Baltic BDTI/BCTI 수집 ticket 유지.
- yfinance 과거 선물체인에서 만료월 일부(
CLH26,NGH26)는 404가 발생하지만, 4시점 커브 자체는 수집 성공.
자체 평가
- 정확성 4.6/5, 완성도 4.5/5, 검증 4.5/5, 최소 변경 4.6/5 → 종합 4.55/5