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