콘텐츠로 이동

종목/테마 발굴 파이프라인 — Walk-Forward 검증 작업 계획

작성: 2026-05-26 (Tue) 선행 문서: - docs/research/2026-05-26_S317_analyzer_inventory.md (분석기 3종 인벤토리) - docs/research/2026-05-26_S317_us_macro_audit.md (US 매크로 4년 점검) - docs/research/2026-05-25_S314_theme_to_leader.md (Q3 1시점 결과) - docs/research/2026-05-26_S316_modules_summary.md (e4 walk-forward 모듈) - docs/planning/theme_stock_selection_logic.md (Q1~Q4 사고 체인)

배경: S313~S316 작업으로 발굴 파이프라인 5개 신규 도구를 만들었으나, 모두 t0=2026-04-06 1시점 강상승장에서만 검증. S314 결과 Q3 룰이 D+30 spread -33.27pp (정반대 작동) → regime 의존성 확인. 새 루틴으로 분리하기 전 walk-forward 검증이 선행되어야 함.


1. 현 상태 진단

1-1. 신규 5개 도구 (개선 완료)

본 작업(2026-05-26 09:40)에서 --date 인자화 + 임계 외부화 + 충돌 해소 완료. 다른 시점 smoke test 통과.

도구 진입점 새 인자 검증 시점
quant/themes/theme_rs.py compute(t0, lookback, min_cover) --date --lookback --min-cover 2024-04-16 OK
quant/themes/theme_state_classifier.py compute(t0, lookback_list, min_cover, thresholds) --date --rs60-strong --rs60-low --rs5-strong 2024-04-16, 2022-07-11 OK
quant/themes/theme_selection.py main() (CLI) --date --k-out --k-in --no-conflict-resolve 2024-04-16 OK + 충돌 해소 적용
quant/themes/theme_leader_select.py main() (CLI) --date 2024-04-16 OK
quant/charts/chart_state_score.py main() (CLI) --date --universe 2024-04-16 OK (77/81)

1-2. 데이터 가용성 점검 결과

일봉 (검증 완료) - KOSPI 1,072 거래일 (2022-01-03 ~ 2026-05-22) — 4.4년 - 종목 OHLCV 247종 × 1,197봉 (2021-07-01 ~ 2026-05-22) — 5년 - regime 분포: strong_down 32 / down 217 / flat 284 / up 239 / strong_up 240

매크로/센티먼트 수집 도구 (4년 fetch 검증 완료, 29 yfinance + 11 FRED 티커 ping) - O 4년 가능: FRED 10/11 (WALCL, TGA, RRP, DGS3MO/2/10, T10YIE, SLOOS, DTWEXBGS=DXY proxy, DEXKOUS), yfinance 28/29 (S&P/NASDAQ/SOX/WTI/Brent/Gold/Copper/Wheat/BTC/KRW/VIX/VIX9D/VIX3M/VVIX/SKEW/AUDJPY/DX-Y.NYB DXY/ES·NQ·YM·RTY·NKD futures/SPY/QQQ), CFTC COT 연도별 ZIP, KOSPI/종목 일봉 (FDR) - Δ 일부: HY OAS 3.0년만 (BAMLH0A0HYM2 FRED 시리즈가 2023-05-23부터), CNN F&G 1년만, 30분봉 ka10080 직전 900봉(과거 X·향후 누적 O), Naver investor flow (검증 미실시) - X 불가: AAII/NAAIM/BofA FMS/II Bulls (paywall·manual), SPY/QQQ 옵션 OI 시계열 (라이브만)

1-3. 본질적 제약

제약 영향 대응
30분봉 OF 과거 데이터 X 5-trigger BUY_STRONG D+20 +27.64% 검증은 67일 강세장만, regime별 walk-forward 불가 운영 진입은 OK / backtest는 향후 누적 cron으로 1년+ 후 가능
ats_main themes=[] 354종 (45%) universe 81 중 19종이 테마 매핑 결손 → 테마 backtest universe 편향 별도 매핑 백필 (정공법) 또는 industry/sector fallback (간이)
퀀트 FnGuide SVD_Main 5분기 EA_QoQ walk-forward 시점 1개만 DART 직접 backfill (인벤토리 §2-6)
HY OAS 3년 2022~2023.5 구간 결손 다른 신용 지표(BAMLH0A0HYM2 대체) 또는 3년만 측정

2. 작업 목표

최종: regime별 발굴 파이프라인 신뢰도 정량화 + 새 루틴(/rs_discovery 등) 분리 가능 상태로 만든다.

중간 게이트: 1. 5 regime × 3 시점 = 15 시점 walk-forward로 Q3 룰 spread 측정 → regime conditional rule 도출 2. 차트/매크로 분석기 4년 walk-forward (HY OAS는 3년) — 인벤토리 단일 시점 신호를 다시점에서 검증 3. 30분봉 OF는 향후 누적 cron 가동, 현 검증은 67일 강세장 한정 명시


3. 작업 단계

Phase A — 데이터 백필 (선행 필수)

작업 도구/소스 산출 비용 추정
A1. ats_main 결손 보강 universe 81 결손 19종 + 전체 354종 themes=[] 매핑. 인접 테마 추론 / industry/sector fallback data/ats_main_v2.json 1~2 세션 (수동 결정 多)
A2. KRX 파생 4년 backfill krx_openapi_client.KRXClient.drvprod_dd_trd(bizdate) 1,000일 루프 (1초 throttle) data/derivatives/historical_*.parquet 1회 17분 + 검증
A3. CFTC COT 4년 backfill 연도별 ZIP 4개 다운로드 + Legacy/TFF Report parsing data/cot/weekly_*.parquet 1회 5분
A4. DXY 시계열 정규화 DX-Y.NYB (yfinance) 또는 DTWEXBGS (FRED) 둘 다 캐시, S317 "미가용" 결손 해소 data/macro/dxy_daily.parquet 1분
A5. yfinance/FRED 4년 캐시 일괄 빌드 29 yf + 11 FRED 티커를 raw parquet으로 일괄 저장 (이후 walk-forward에서 시점별 로드 X, 단일 캐시 query) data/macro/raw_yf_*.parquet, data/macro/raw_fred_*.parquet 10분
A6. Naver investor flow backfill 검증 bizdate 4년 전 ping → 응답하면 1초 throttle 루프, 안 하면 skip data/sentiment_kr/investor_flow_*.parquet ping 1분 + 가능 시 1시간
A7. 한국 고객예탁금 4년 backfill 네이버 금융 finance.naver.com/sise/sise_deposit.naver 페이지 스크래핑 — 가장 간편한 경로, 인증키/playwright 불필요. requests + pd.read_html. KOFIA 데이터 그대로 노출됨. data/sentiment_kr/customer_deposit_normalized.parquet (date, deposit_balance/chg, credit_balance/chg, fund_eq/mix/bond + chg) 완료 — 2,400일 (9.8년, 2016-08-05~2026-05-21), NaN 0%
A8. 매출 등 분기재무 7년 backfill (DART OpenAPI 직접) OpenDART fnltt_singl_acnt_all 직접 호출. 98종 × 7년 × 4분기 = 3,417 실호출 (CFS+OFS fallback 포함). throttle 0.2s, 실측 7.1/s = 약 8분. S312v2의 FnGuide 5분기 한계 극복. Q4 단일분기 = FY누계 - (Q1+Q2+Q3) 수정 적용 data/dart_cache/fs_quarterly_5y.parquet (437,600행) + quarterly_metrics.parquet (매출/영업/순이익 추출, 6,180행) + data/backtest/e1/ea_panel_dart.parquet (EA·EA_QoQ, 6,180행) 완료 — 86종 ≥6분기 (EA YoY 가능), 87종 ≥5분기 (EA_QoQ 가능)

Phase B — 도구 단일시점 → 다시점 일반화

작업 대상 작업 내용
B1. theme_state_classifier regime 임계 매핑 새 도구의 StateThresholds regime별 임계 테이블 작성 (예: strong_up rs60≥+30/rs5≥+5, flat rs60≥+10/rs5≥+1, strong_down rs60≥-5/rs5≥-2). 데이터 기반(KOSPI 60d ret 분위수)으로 도출
B2. theme_rs walk-forward 러너 15 시점 × theme_rs.py scripts/backtest/discovery_walkforward_run.py 신규. compute() 모듈 호출 + parquet 누적
B3. selection→leader→forward alpha 파이프라인 4 도구 chain 15 시점 각각 selection 실행 → leader 추출 → forward D+5/10/20/30 alpha 측정 → spread 누적
B4. ats_main_v2 적용 universe 확장 A1 산출물 적용 후 valid universe 57 → 80+ 확장

Phase C — 매크로 분석기 4년 walk-forward 재측정

S317 us_macro_audit 결과 검증 (DXY 결손 해소 + HY OAS 3년 한계 명시 + 한국 고객예탁금 신규 축 추가).

작업 내용
C1. raw 시계열 통합 캐시 A5 산출물 + DXY + A7 한국 고객예탁금 합쳐 단일 panel parquet (date × 신호 × value)
C2. 발화 → KOSPI forward alpha 재측정 scripts/backtest/s317_us_macro_audit.py 입력만 4년 panel로 교체
C3. regime 분할 spread fold 3분할 대신 regime 5분할로 재집계 — strong_up·up·flat·down·strong_down
C4. DXY 결손 해소 확인 S317 §1-3 결손 신호(usd_fut_chg_z, DXY chg z) 신규 산출
C5. 한국 고객예탁금 신호 산출 신규 축 4개: ① deposit_lev_z (절대값 z) ② deposit_chg_z (5d 변화 z) ③ deposit_credit_ratio (예탁금/신용공여 비율 — 레버리지 강도) ④ deposit_slope_20d (20일 회귀 기울기 — 자금 유입/유출 추세). 각 신호 발화 |z|≥1.5 → KOSPI forward D+5/10/20 부호 일치율 + regime 5분할 spread. 가설: 고객예탁금 급증 = 단기 과열·꼭지 시그널 / 급감 = 매수 dry powder 소진. 검증 대상.

Phase D — 차트 분석기 4년 walk-forward 재측정

S317 v2 module_audit (67일 강세장) → 4년 KOSPI 일봉으로 확장.

작업 내용
D1. 일봉 분석기 한정 walk-forward layer_a / volume_profile / vsa_signals / wyckoff / order_flow(daily) / state_classifier — 일봉 입력만 (30분봉 OF 제외)
D2. 시점 × 종목 발화 panel 4년 × 247종 × 60+ 신호 → 발화 → forward 부호 일치율
D3. regime 5분할 spread C3와 동일 분할 적용. 인벤토리 ★★ 신호(absorption_score_last, spring_count_20d, vp_up_down_amount_ratio_log 등)가 약세장에서도 유효한지 확인
D4. 30분봉 OF는 운영용으로만 명시 backtest 불가 명시, 단 매일 cron으로 향후 1년+ 누적 시작 (별도 작업)

Phase E — 통합 결과 + 새 루틴 설계 결정

작업 내용
E1. regime conditional rule book Q3 룰 + 차트 신호 + 매크로 신호의 regime별 작동 spread 표
E2. 4축 결합 backtest (S313 후속) 퀀트 + 테마 + 차트 + 매크로 — universe 확장 + 다시점
E3. 새 루틴 골격 확정 /rs_discovery 등 분리 여부 결정. 후보 골격: [theme 스캔→후보 풀→대장 판정→차트 검증→재료 검증→퀀트 보정→시나리오] 7단계. PM 결정 대기
E4. 운영 진입 후보 walk-forward 통과한 신호만 운영 (예: chart_state_score 단독이 강세장 +15.41pp, regime별 재현되면 격상)

4. 실행 순서 + 의존성

A1 ats_main 보강 ─────────────────────┐
A2 KRX 파생 4년 ─────────────────────┐│
A3 CFTC COT ─────────────────────────┐││
A4 DXY 캐시 ────────────────────────┐│││
A5 yf+FRED 일괄 ─────────────────┐  ││││
A6 Naver investor (option) ─────┐│  ││││
A7 KOFIA 고객예탁금 4년 ★ ──────┐││  ││││
                                ▼▼▼  ▼▼▼▼
                        Phase C 매크로 walk-forward (C5 한국예탁금 신호 포함)
                        Phase D 차트 walk-forward
                                  │
                                  ▼
                        B1 regime 임계 매핑 (B는 A1 대기)
                        B2~B4 테마 파이프라인 walk-forward
                                  │
                                  ▼
                        Phase E 통합 + 새 루틴 결정

병렬 가능: A1·A2·A3·A4·A5·A6·A7 (서로 독립) / C·D (B와 독립, 일봉만 필요) 필수 선행: B는 A1 완료 후 / C5는 A7 완료 후 / E는 B+C+D 모두 완료 후


5. 산출물 (예상)

5-1. 코드 (신규)

  • scripts/backfill/build_ats_main_v2.py (A1)
  • scripts/backfill/krx_derivatives_4y.py (A2)
  • scripts/backfill/cftc_cot_4y.py (A3)
  • scripts/backfill/macro_panel_4y.py (A4+A5 통합)
  • scripts/backfill/naver_investor_4y.py (A6, 조건부)
  • scripts/backfill/kofia_deposit_4y.py (A7) ★
  • scripts/backtest/discovery_walkforward_run.py (B2+B3)
  • scripts/backtest/regime_conditional_aggregate.py (B+C+D 결과 통합)

5-2. 데이터

  • data/ats_main_v2.json (354종 themes 보강)
  • data/derivatives/historical_kospi200_*.parquet (KRX 4년)
  • data/cot/weekly_legacy_*.parquet, weekly_tff_*.parquet (CFTC)
  • data/macro/panel_4y_daily.parquet (29 yf + 11 FRED 통합)
  • data/sentiment_kr/customer_deposit_4y.parquet (KOFIA 일별 예탁금/신용잔고/RP) ★
  • data/backtest/discovery_walkforward/results_{date}.parquet (15 시점 누적)
  • data/backtest/regime_conditional/spread_table.parquet

5-3. 문서

  • docs/research/2026-05-XX_phase_a_backfill.md (A 완료 시)
  • docs/research/2026-05-XX_phase_bcd_walkforward.md (B+C+D 결과)
  • docs/research/2026-05-XX_regime_conditional_rules.md (E1)
  • docs/planning/2026-05-XX_discovery_routine_v1.md (E3 새 루틴 명세)

6. 시점 선정 (15 시점, regime × 3)

KOSPI 60d ret 기준 분위수 25/50/75% (앞서 점검):

regime t0 #1 t0 #2 t0 #3
strong_down 2022-07-11 (-13.8%) 2022-07-05 (-13.1%) 2022-06-21 (-11.7%)
down 2022-08-02 (-7.7%) 2024-12-30 (-6.3%) 2022-04-21 (-4.7%)
flat 2025-02-06 (-1.6%) 2023-12-12 (-0.1%) 2024-06-05 (+1.6%)
up 2023-04-06 (+4.6%) 2024-02-22 (+5.9%) 2024-04-16 (+7.1%)
strong_up 2025-12-17 (+18.8%) 2025-07-03 (+25.3%) 2026-04-22 (+29.6%)

기존 2026-04-06 (strong_up) 결과는 16번째 시점으로 비교 baseline 유지.

forward window: D+5/10/20/30 — 단 strong_up 2026-04-22는 forward 시계열이 2026-05-22까지만 → D+30 결손, D+20만 유효.


7. 성공 기준 (각 Phase)

Phase 성공 조건
A 백필 데이터 모두 4년 cover 확인 + parquet 캐시 무결성 검증 (NaN ratio, date 연속성)
B 15 시점 walk-forward 산출 완료 + Q3 룰 spread 표 작성. 기존 2026-04-06 결과 재현
C DXY 결손 해소 + regime별 매크로 신호 spread 표. S317 us_macro_audit ★★ 신호(L_composite_z, NET_LIQ_BN_lev_z) 재현 + 한국 고객예탁금 4신호 spread 산출 + 가설(과열/dry powder) 양/부 판정
D 4년 차트 신호 발화 panel + regime별 spread. ★★ 신호(absorption_score_last, vp_up_down_amount_ratio_log) regime 안정성 측정
E regime conditional rule book 작성 + 새 루틴 골격 PM 승인

전체 실패 기준: Phase B에서 Q3 룰이 어느 regime에서도 spread > 0 안 나오면 룰 폐기 → S314 §5 옵션 B "룰 반전" 검토.


8. 리스크 + 대응

리스크 영향 대응
30분봉 OF 약세장 검증 X 5-trigger BUY_STRONG +27.64% 신뢰 1년+ 후로 연기 일봉 OF + 차트 4 trigger 부분 합의로 운영 진입, 향후 누적
ats_main 보강 비용 큼 A1 1~2 세션 소요, B 대기 A1을 industry/sector fallback (간이) 우선, 정공법은 분리 작업
HY OAS 3년 결손 C Phase에서 BAMLH0A0HYM2 신호 2022~2023.5 측정 X 3년만 측정 + 결손 명시. 대체 신용 지표(ICE BofA 다른 시리즈) 탐색
KRX 17분 backfill 중간 실패 A2 재시도 시작/끝 인자 + 이어붙이기 로직
KOFIA OpenAPI 인증키 승인 1~3영업일 지연 A7 시작 지연 (대안) FreeSIS 웹 폼 POST + playwright-stealth-mcp 파싱으로 우회 / (최후) 일일 cron부터 시작 → 1년 후 검증
KOFIA 데이터 일별 결손/공휴일 처리 C5 신호 산출 NaN 다수 forward-fill + 평일만 필터링 + KOSPI 거래일과 정렬
walk-forward 결과 모든 regime에서 noise 룰 자체 폐기 결정 S314 §5 옵션 B/C 적용 — 룰 변형 또는 leader 추출 부품만 운영

9. 다음 액션 (즉시 가능 단위)

  1. A4+A5 (1시간): yfinance 29티커 + FRED 11시리즈 + DXY 통합 panel 빌더. 비용 낮고 모든 후속 작업의 기반.
  2. A7 KOFIA 고객예탁금 (30분~1시간) ★: OpenAPI 인증키 신청 동시에, FreeSIS 웹폼 POST 파싱 우회 경로로 즉시 시작.
  3. A1 (1~2 세션, PM 결정): ats_main 354종 보강 정공법 vs 간이. 정공법은 별도 세션, 간이는 다음 작업으로 즉시.
  4. A2+A3 (30분): KRX 파생 + CFTC COT backfill 스크립트.
  5. B2 (2시간): walk-forward 러너 작성 → 15 시점 일괄 실행 (예상 5분/시점, 총 75분).
  6. C+D 병렬 (2~3시간 각): 매크로/차트 분석기 재측정 (C5 한국 예탁금 신호 포함).
  7. E (1세션, PM 결정): 결과 통합 + 새 루틴 골격.

총 추정: 데이터 백필 5~7시간 + 분석 8~10시간 = 2~3 세션.


10. PM 결정 대기 항목

결정 옵션 영향
A1 ats_main 보강 방식 (a) 정공법 수동 매핑 / (b) industry/sector fallback 자동 / (c) skip universe 확장 범위
A6 Naver investor flow 포함 여부 (a) 검증 후 포함 / (b) skip (KRX·CFTC로 충분) 한국 수급 신호 추가 검증
~~A7 KOFIA 접근 방식~~ 해결됨 — 네이버 금융 페이지 스크래핑으로 9.8년 일괄 수집 완료
C5 한국 예탁금 4신호 가중치 (a) 균등(0.25 × 4) / (b) 가설 기반(deposit_chg_z 더 가중) / (c) 4신호 개별 측정만 (조합 X) 신호 합성 방향
새 루틴 분리 시점 (a) Phase E 완료 후 / (b) Phase B만 완료해도 분리 운영 진입 속도
30분봉 OF cron 가동 (a) 즉시 매일 누적 시작 / (b) 새 루틴 확정 후 약세장 검증 가능 시점 (현재+1년)