콘텐츠로 이동

S319 — Phase D + Q3 반전 + 퀀트 walk-forward + corp_code 100→200 확장

일자: 2026-05-26 (Tue) 선행: S318 (Phase A+B 완료, Phase C는 별도 보고서) 작업 옵션 1~5 순차 진행: 1. ~~Phase C 매크로~~ → docs/research/2026-05-26_phase_c_macro_walkforward.md 2. Phase D 차트 walk-forward ✅ 3. Q3 반전 룰 재측정 ✅ 4. 퀀트 walk-forward (ea_panel_dart 86종 × 19분기) ✅ 5. corp_code 100→200 확장 (DART 99종 백필) 🔄


1. Phase D — 차트 분석기 walk-forward

1.1 방법

  • t0 9개 (regime별): strong_down 3, down 3, flat 1, up 1, strong_up 1
  • 각 t0 × 247종 OHLCV → discovery.state_classifier.classify_state()_raw_resolution_score
  • ★★ 신호 4개: absorption_score_last, spring_count_20d, vp_up_down_amount_ratio_log, volume_asymmetry_20d
  • forward D+5/+10/+20 KOSPI 차감 alpha

1.2 t0별 spread_d20 (chart_score top decile − bottom)

t0 regime KOSPI D+20 spread_d20
2022-06-21 strong_down -1.58% -9.90pp
2022-07-05 strong_down +4.18% -4.26pp
2022-07-11 strong_down +6.53% -3.05pp
2022-04-21 down -3.26% +8.62pp
2022-08-02 down +1.33% +1.98pp
2024-12-30 down +3.43% -4.47pp
2023-12-12 flat -0.40% -5.17pp
2024-04-16 up +4.41% -0.36pp
2025-12-17 strong_up +20.91% +1.99pp

1.3 ★★ 신호 regime 안정성 (D+20 alpha 평균)

signal down flat strong_down strong_up up
absorption_score_last HIGH (n=21) -1.48% +6.62% +5.15% -19.07% +1.68%
spring_count_20d > 0 (n=1067) +1.92% +1.37% +0.38% -4.68% +5.17%
vp_up_down_amount_ratio_log LOW (n=279) -0.66% -3.72% +0.34% -13.56% +3.53%
volume_asymmetry_20d LOW (n=329) -0.14% -2.16% +0.64% -11.43% +4.00%

1.4 결론

S317 v2 ★★ 신호(67일 강세장)는 regime 의존성 강함, 4년 다시점에서 일관성 부재.

  • absorption_score_last HIGH: flat/strong_down에서 강하나 표본 매우 부족 (각 5건 이하). strong_up에서 역작동
  • vp_up_down_amount_ratio_log LOW: bear 신호로 strong_up·flat에서 가장 강함 (역설). down에서는 미미
  • spring_count_20d > 0: bull 신호로 up regime에서 작동, 강세장에서는 오히려 음수

운영 채택 안 함. 추가 분리: timeframe 차이(67일 vs 4년 → 신호 발화 시점이 단일 시점 vs 평균에서 큰 차이)일 가능성 검토 필요.


2. 옵션 3 — Q3 반전 룰 재측정

2.1 방법

discovery_walkforward summary (64 행 = 16 t0 × 4 horizon)의 in/out 라벨을 swap. spread_inv = -spread_orig.

2.2 결과

전체 spread 양수 비율: - 원본: 17/47 (36%) — 음수 우위 (Q3 룰이 역작동) 확인 - 반전: 30/47 (64%) — 양수 우위

D+20 t0별 반전 spread: - 양수 8/12 (66.7%) - 강한 양수: 2025-02-06 flat +15.44pp, 2024-04-16 up +36.25pp, 2026-04-22 strong_up +20.31pp, 2025-07-03 strong_up +15.03pp - 강한 음수: 2024-06-05 flat -13.31pp, 2025-12-17 strong_up -13.51pp

D+30 반전 양수 비율: 8/11 (72.7%) — 시평이 길수록 안정

2.3 regime 평균 (D+30 기준 spread_inv)

regime n_t0 spread_orig spread_inv
strong_down 3 -14.73% +14.73%
up 3 -19.44% +19.44%
flat 3 -6.44% +6.44%
down 3 +5.72% -5.72%
strong_up 3 +0.96% -0.96%
baseline 1 -9.18% +9.18%

2.4 결론

반전 룰 채택 후보: strong_down / up / flat / baseline에서 양수 (5/6 regime). down·strong_up은 원본 룰이 약하게 작동.

Conditional rule 권장: - HOT = 회피 (대신 cooling/dead 매수), 단 down/strong_up regime에서는 원본 유지 - 다음 cycle에서 시점 6개 더 추가 + 통계 유의성 검정 필요


3. 옵션 4 — 퀀트 walk-forward (ea_panel_dart × 19분기) [v1→v2 N확장]

3.1 방법

  • universe v1 = 86종 / v2 = 196종 (옵션 5 백필 후)
  • 분기 시점 19개 (2021Q2 ~ 2025Q4, n≥10 충족)
  • 발표 시점 = 분기말 + 50거래일 (보수)
  • TOP decile vs BOTTOM decile (각 v1 ~8종 / v2 ~17종) KOSPI-adjusted alpha D+20/D+60

3.2 결과 (regime × horizon 평균 spread) — N확장 비교

regime n_t v1(86종) d20 v2(196종) d20 v1(86종) d60 v2(196종) d60
down 2 +1.24% +4.53% +8.34% +1.25%
flat 7 -0.08% +0.62% -4.36% +1.43%
strong_up 4 -6.08% +4.47% -17.61% +10.29%
unknown 3 +10.89% +7.71% +7.57% +9.23%
up 3 +2.76% +2.12% +9.12% -4.01%

전체: - v1: D+20 -0.19% (양수 8/17 = 47%), D+60 -1.98% (양수 7/16 = 44%) - v2: D+20 +2.67% (양수 11/17 = 65%), D+60 +2.54% (양수 9/16 = 56%)

3.3 결론

N확장 효과 극적 — S312v2 가설(EA TOP alpha) 부활: - 전체 D+20 spread 음수 → 양수 전환 (-0.19% → +2.67%) - strong_up regime D+60 -17.61% → +10.29% (방향 반전, EA 가속 종목이 강세장에서도 outperform 확인) - down regime D+20 +1.24% → +4.53% (회복기 작동 강화) - universe 부족이 알파 noise 원인이었음 검증

채택 가능 (regime conditional): - strong_up·down·flat에서 D+60 양수 → EA TOP decile 진입 - up regime D+60 음수 (-4.01%) 회피 - v3 단계: corp_code 200→300/500 확장 시 추가 정밀도 향상 기대


4. 옵션 5 — corp_code 100→200 확장 ✅

4.1 완료 결과

  • universe_top500의 시총 101~200위 후보 102종 → DART corpCode.xml 매핑 99종 성공
  • data/dart_cache/corp_code_map_v2.parquet (197종 통합), corp_code_add_101_200.parquet (99종)

4.2 백필 결과 (≈12분)

  • 99 corp × 7년(2020~2026) × 4분기 × CFS+OFS fallback
  • 실측 6.5 calls/s, 3,537 calls, 415,461 rows appended, 1,368 errors (대부분 empty)
  • 통합 fs_quarterly_5y.parquet: 853,061 rows (16.5MB) / 196 corps / 4,304 (corp,fy,q)

4.3 metrics + EA 재산출 결과

산출 v1 (98종) v2 (196종)
quarterly_metrics rows 6,180 12,522
≥6분기 EA YoY 측정 가능 86종 178종
≥5분기 EA_QoQ 가능 87종 179종
EA(YoY) panel 건수 4,709 9,507
EA_QoQ panel 건수 5,253 10,604

4.4 corp_code_map 복원

  • v2 (197종)을 corp_code_map.parquet로 영구화
  • 백업 corp_code_map_orig98.parquet 보존

4.5 옵션 4 연쇄 효과

§3.2 v2 컬럼 참조. N확장만으로 전체 D+20 spread -0.19% → +2.67% 전환.


5. 종합 결론

5.1 채택 가능 신호 (3건)

  1. C5 deposit_lev_z LOW × flat (Phase C, n=46 hit 89% -4.43pp) — 한국 자금 dry powder 신호
  2. C5 deposit_credit_ratio_z LOW × down (n=11 hit 91% -3.23pp) — 레버↑+약세 추가하락
  3. EA TOP decile (revenue) regime-conditional ★ — N확장 후 채택
  4. strong_up D+60 +10.29% / down D+20 +4.53% / flat D+60 +1.43%
  5. up regime 회피 (D+60 -4.01%)

5.2 채택 보류 (2건)

  1. Phase D ★★ 차트 신호 — regime 의존성 강해 4년 다시점에서 noise. S317 v2(67일 강세장) 단일 시점 결과는 generalize 안 됨
  2. Q3 반전 룰 — D+30 양수 8/11 (73%) 유망하나 시점 6개 더 필요. conditional 적용 시 strong_down/up/flat 반전 + down/strong_up 원본

5.3 핵심 학습

  • N확장이 alpha noise 해결의 1차 수단 — 86종 → 196종만으로 strong_up D+60 -17.61% → +10.29% 방향 반전
  • 인벤토리 ★★ 신호도 단일 시점/regime 검증으로는 채택 위험. 다시점 walk-forward 필수
  • Q3 룰처럼 단방향 룰은 regime 의존성으로 spread 사인 뒤집힘. conditional 적용 필요

5.4 다음 세션 진입점

  1. regime conditional rule book 작성 (Phase E) — 채택 3건 + 보류 2건 매트릭스화
  2. L_composite_z 합성 (FRED WALCL-TGA-RRP) 재현 → Phase C 보완
  3. KRX 파생 long→wide 변환 → Phase C 확장
  4. corp_code 200→300/500 추가 확장 → 옵션 4 v3
  5. 30분봉 OF 일일 cron 가동 (1년 후 backtest 가능)
  6. 새 루틴 /rs_discovery 골격 PM 승인 — Phase E 종료 조건

6. 산출물

코드 (신규)

  • scripts/backtest/phase_d_chart_walkforward.py
  • scripts/backtest/q3_rule_invert.py
  • scripts/backtest/quant_walkforward_dart.py
  • scripts/backfill/corp_code_expand_to_200.py

데이터

  • data/backtest/phase_d/{per_t0/, summary, regime_spread}.parquet
  • data/backtest/q3_invert/{summary_with_inverted, regime_horizon_summary}.parquet
  • data/backtest/quant_walkforward_dart/{summary, regime_spread}.parquet
  • data/dart_cache/{corp_code_map_v2, corp_code_add_101_200}.parquet