virtual-insanity
← 리포트 목록

석유 공급망 모니터 전수 심층 감사

2026-04-20 oil-monitor [oil-supply-monitor, deep-audit, hermes, data-quality]

석유 공급망 모니터 전수 심층 감사 — 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