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