콘텐츠로 이동

D1 매크로 패키지 재설계 — "변화 중심" (Δ1d/Δ5d/Δ20d)

작성: 2026-05-28 (S329) 배경: 010170 -15.76% 급락 사후 진단. D1이 스팟/z 1점만 제공 → 자금 이동·가속/감쇄 판단 불가. PM 결정: 다기간 증분 세트 (Δ1d/Δ5d/Δ20d) 방식. Status: 📋 설계 — 구현 전 PM 승인 대기


1. 문제 (현행 D1 패키지 실측, 2026-05-26)

종류 현행 필드 한계
스팟(레벨) us_2y 4.08 us_10y 4.57 vix 16.59 hy_oas 2.78 cnn_fng 61.4 방향 없음 — 오르는 중인지 내리는 중인지 모름
z (1점) kr_10y_chg_z 1.48 basis_z 1.37 pcr_vol_z 0.97 표준화 1점 — 부호에 방향이 묻혀 해석 갈림
변화(일부만) delta_20d_b +100.6 cnn_fng_delta_1w +2.03 Fed유동성·CNN만 있고 나머지 불균일

us_10y=4.57 하나로는 "자금이 채권/달러로 회귀하는가, 진정되는가"를 판단할 수 없다.


2. 해결: 모든 핵심 지표에 ChangeSet 부착

2-1. ChangeSet 표준 형태

class ChangeSet(BaseModel):
    spot: Optional[float] = None      # 현재 레벨
    d1: Optional[float] = None        # Δ 1거래일 (전일 대비)
    d5: Optional[float] = None        # Δ 5거래일 (1주 방향)
    d20: Optional[float] = None       # Δ 20거래일 (추세)
    pct_d5: Optional[float] = None    # 5일 변화율 % (레벨 무관 비교용)
    pct_d20: Optional[float] = None
    z_60d: Optional[float] = None     # 현 레벨의 60일 z (극단 판정용, 유지)
  • 단위 주의: 금리(DGS10)는 절대 bp 변화가 의미 있음 → d1/d5/d20는 절대차(%p). 지수(SOX/KOSPI)는 레벨이 크므로 pct_d5/pct_d20(%)로 비교.
  • 거래일 기준: 달력일 아님. panel은 영업일 인덱스이므로 iloc[-1] - iloc[-6]=5거래일.
  • d1=0 처리: panel 최신일이 미갱신(휴일/데이터 지연)이면 d1=0 오인 → data_quality.stale_data에 명시하고 d1=None 반환.

2-2. 지표별 ChangeSet 적용 대상 (panel 컬럼 매핑)

블록 지표 panel 컬럼 ChangeSet 비고
rates US 10Y fred_DGS10 %p 절대차 추세=자금 채권회귀
US 2Y fred_DGS2 %p 절대차 단기금리=Fed 기대
2-10 스프레드 (10y-2y) %p 곡선 정상화/역전 방향
T10YIE 기대인플레 fred_T10YIE %p
HY OAS fred_HY_OAS %p 신용 확대/축소 방향
fx/dollar DXY yf_DXY pct 달러 강세=EM유출
광의달러 fred_DTWEXBGS pct
USD/KRW yf_USD_KRW pct 원화 약세=외인 환손실
risk VIX yf_VIX 절대차 변동성 방향
SOX 반도체 yf_SOX pct 반도체 모멘텀
KOSPI yf_KOSPI pct 한국 추세
commodity WTI yf_WTI pct 경기/인플레
GOLD yf_GOLD pct 안전선호
COPPER yf_COPPER pct 실물경기
liquidity Fed Net Liq (WALCL-TGA-RRP) %p(십억$) 기존 delta_20d 유지+확장

2-3. 파생(derivatives) 블록 — 대폭 보강

현황 점검 (2026-05-28 실측, derivatives_with_features 271행 ~2026-05-27): - 원시 OI/거래량/PCR 컬럼은 257~270개 채워짐 → ChangeSet 산출 가능 - ⚠️ deriv_sent_z, pcr_oi_z = 0/271 (빈 컬럼) → 인용 불가. None 처리 + data_quality 명시 (PM 결정: 종합z 보류, 근거 없는 값 미생성) - ⚠️ 마지막 행(2026-05-27) 전 컬럼 NaN → _deriv_col_asof가 직전 거래일로 fallback. stale_data에 "deriv_last_row_nan" 기록

현행 D1 사용(7개) → 보강 후:

카테고리 소스 컬럼 현행 보강
KOSPI200 선물 kospi200_fut_oi _volume _chg chg만 OI ChangeSet(Δ5d/Δ20d) + volume Δ
VKOSPI 선물 vkospi_fut_oi _volume oi_chg_z OI ChangeSet (변동성 헷지 증감)
USD 선물 usd_fut_oi _volume oi OI ChangeSet (환헷지/달러베팅)
국채10Y 선물 kr_10y_fut_oi _volume chg_z OI ChangeSet
옵션 PCR pcr_oi pcr_vol pcr_vol_z pcr_oi + pcr_vol 둘 다 ChangeSet (포지션 vs 당일거래 괴리)
옵션 구조 call_oi_total put_oi_total max_pain만 call/put OI 총량 + Δ + put/call 비율 (콜편향/풋헤지)
베이시스 basis basis_z basis_z basis 원시값 Δ5d/Δ20d 추가
종합심리 deriv_sent_z (미사용) ❌ 빈 컬럼 → None + 명시 (보류)

산출 헬퍼: _deriv_change_set(deriv, t0, col) — 거래일 기준 Δ5d/Δ20d (OI는 절대 계약수 차, 비율은 그대로).

옵션 구조 신규 해석: - put_call_oi_ratio = put_oi_total / call_oi_total → 1 초과·상승 = 풋 헤지 누적(하방 대비) - pcr_oi(미결제 기준) vs pcr_vol(당일거래 기준) 괴리 → 신규 포지션 방향

2-4. COT flow 블록 (신규 — PM 우선)

소스: data/cot/tff_financial_4y.parquet (CFTC TFF, 주간, 2023-01-03 ~ 2026-05-19). 현재 discover 전체 미사용.

검증 완료 (2026-05-28): 순포지션 계산 가능, 최근값 채워짐. 단 계약명 정확일치 필수 (contains는 cross-rate 혼입 — EURO FX/JAPANESE YEN 등).

대상 계약 (정확명) — 한국 위험선호 연관 핵심:

별칭 정확 계약명 한국 함의
spx E-MINI S&P 500 - CHICAGO MERCANTILE EXCHANGE 미국 주식 투기 포지션
ndx NASDAQ MINI - CHICAGO MERCANTILE EXCHANGE 기술주/반도체 위험선호
jpy JAPANESE YEN - CHICAGO MERCANTILE EXCHANGE 엔캐리 — 숏 누적 후 청산 시 한국 급락 트리거
eur EURO FX - CHICAGO MERCANTILE EXCHANGE 달러 사이클 반대편

주체별 순포지션 (각 계약마다): - am_net = Asset_Mgr_Long - Asset_Mgr_Short (자산운용사 = 기관 큰손) - lev_net = Lev_Money_Long - Lev_Money_Short (레버리지펀드 = 헤지펀드/투기) - am_net_chg / lev_net_chg = 전주 대비 변화 (Change_in_* 컬럼 활용 또는 diff) - 극단 판정: 순포지션의 rolling z (52주) → 투기 포지션 과열/극단

스키마:

class CotContract(BaseModel):
    am_net: Optional[float] = None       # 자산운용사 순포지션
    lev_net: Optional[float] = None      # 레버리지펀드 순포지션
    am_net_chg_1w: Optional[float] = None
    lev_net_chg_1w: Optional[float] = None
    lev_net_z_52w: Optional[float] = None  # 투기 포지션 극단도
    open_interest: Optional[float] = None
    report_date: Optional[str] = None    # 주간이라 D1 date와 다름 — 명시

class D1CotFlowBlock(BaseModel):
    spx: Optional[CotContract] = None
    ndx: Optional[CotContract] = None
    jpy: Optional[CotContract] = None
    eur: Optional[CotContract] = None
    evidence_grade: EvidenceGrade = "?"

빈도 처리: COT는 주간(화요일 기준, 금요일 발표). D1은 일별 → report_date <= t0 가장 최근 1행 사용 + report_date를 패키지에 명시(stale 아님, 원래 주간). data_quality에 "cot_weekly_asof".

2-5. FRED 추가 3개 (별도 — 이번 범위 외, 차기)

DGS3MO / DTWEXBGS / DEXKOUS — 데이터 양호하나 PM이 COT 우선 선택. rates/fx ChangeSet 확장 시 함께. SLOOS_CI는 91% 결측 별도.


3. 해석 규칙 (에이전트 명세에 추가)

ChangeSet으로 새로 가능해지는 판단:

  1. 자금 이동 방향: DXY pct_d5↑ + DGS10 d5↑ + GOLD pct_d5↓ → "위험자산→달러/현금 회귀"
  2. 가속 vs 감쇄: |d5/5| vs |d20/20| 비교 — 일평균 변화가 단기에 커지면 가속, 작아지면 감쇄(진정)
  3. 예: kr_10y d5=+0.05(/5=0.01) vs d20=+0.40(/20=0.02) → 최근 금리상승 감쇄 중
  4. 섹터 쏠림(차기 K항목 연계): SOX pct_d5 vs KOSPI pct_d5 괴리 → 반도체 일극 집중 강도
  5. 선물 포지션 방향: kospi200_fut_oi Δ5d↑ = 선물 매수포지션 누적 / Δ5d↓ = 청산. vkospi_fut_oi Δ5d↑ = 변동성 헷지 증가(공포 선반영)
  6. 옵션 헤지 편향: put_call_oi_ratio 상승 = 하방 대비 누적 / pcr_oi vs pcr_vol 괴리 = 신규 포지션 방향 전환
  7. 글로벌 큰손 포지션(COT):
  8. jpy lev_net 숏 극단(z↓) + 되돌림 = 엔캐리 청산 위험 → 한국 위험자산 급락 선행
  9. spx/ndx lev_net 롱 극단(z↑) = 투기 과열 → 되돌림 취약
  10. am_net(기관)과 lev_net(투기) 방향 불일치 = 의견 분열 신호

4. 구현 범위 (PM 승인 후)

Step 파일 변경
1 schemas.py ChangeSet + CotContract + D1CotFlowBlock 클래스 추가. D1Rates/Sentiment/Deriv 블록에 ChangeSet 필드, D1Input에 cot_flow 추가 (기존 필드 유지=하위호환)
2 build_d1_input.py _change_set(series, t0, pct=bool) 헬퍼 + build_cot_flow(t0) (정확계약명 4종, am/lev 순포지션, 52w z, 주간 asof). 각 블록 ChangeSet 산출. stale 처리
3 .claude/agents/discover/macro-judge.md §3 해석 규칙(자금이동/가속감쇄/선물OI/옵션헤지/COT) 추가
4 검증 2026-05-26 재실행 → ChangeSet + COT 채워짐 + Pydantic 통과 확인

비범위(별도 항목): FRED 3개(DGS3MO/DTWEXBGS/DEXKOUS) rates/fx 확장, 섹터 쏠림 breadth 블록(K), overheat 게이트(L) — 이 작업 후 별도.


5. 하위호환

  • 기존 us_10y, kr_10y_chg_z 등 스팟/z 필드는 유지. ChangeSet은 추가.
  • 에이전트는 스팟+ChangeSet 둘 다 참조. 기존 reasoning 깨지지 않음.