콘텐츠로 이동

S307 차트 분석 모듈 결함 수정

Date: 2026-05-24 (Sun) Topic: L (시스템 재설계) Predecessor: S307big 백테스트

점검 범위

차트 분석 모듈 8개 파일 — vsa_signals / vsa_trigger / wyckoff_trigger / wyckoff (compute_wyckoff) / amt_trigger / volume_profile / bulkowski_trigger / order_flow / of_trigger / _retracement / _thresholds.

결정적 결함 (수정 완료)

#1 + #2 _retracement.py impulse_pct / retrace_pct 분모 불일치 → distance 비율로 일관화

문제: - UP impulse: impulse_pct = (high-low)/low (저점 분모), retrace_pct = (high-cur)/high (고점 분모) - DOWN impulse: impulse_pct = (high-low)/high (고점 분모), retrace_pct = (cur-low)/low (저점 분모) - 같은 100원 움직임이 UP/DOWN에서 다른 % 산출 → ratio = retrace_pct / impulse_pct에서 4가지 분모 조합으로 표준 Fibonacci와 어긋남. - 수치 예시: UP impulse 100→200, 145 회복 시 표준 ratio 55%여야 하는데 코드 27.5% 산출.

수정: - 표준 Fibonacci 정의 ratio = |retrace_distance| / |impulse_distance| 적용 - impulse_distance = abs(swing_high - swing_low) (UP/DOWN 동일) - retrace_distance_current/max = abs(impulse_end - cur_close 또는 extreme) - retrace_ratio = retrace_distance / impulse_distance (분모 무관 일관) - 표시용 impulse_pct / retrace_pct는 기존 형식 유지 (가독성)

위치: _retracement.py:86-126 + 144-148

#3 wyckoff_trigger.py Spring/UT support_tr 자기참조 → last_segment 제외

문제: - support_tr = min(전체 125봉) — 마지막 3봉 중 신저점 형성 시 자기 자신이 support_tr - Spring 조건 last_segment_lows < support_tr * 0.99이 자기 자신 99% 비교 → 침범 조건 미충족 - 신저점인데 Spring 미발화 버그

수정: - support_for_event = min(last_segment 제외 122봉) 신규 산출 - Spring/UT 침범 비교는 support_for_event / resistance_for_event 사용 - 반환 dict의 support_tr / resistance_tr는 기존(전체 min/max) 유지 (다른 측정자 호환)

위치: wyckoff_trigger.py:91-128

잠재 결함 (주석 표시만, PM 결정 대기)

#4 bulkowski_trigger.py today_idx와 패턴 seg 사이 5봉 갭

문제: - df.tail(n+5), seg = slice(0, n), today_idx = len(df)-1 → 패턴 구간(첫 n봉)과 today(-1) 사이 5봉 갭 - 표준 Bulkowski는 패턴 종료 직후 봉으로 breakout 확인 (갭 없음) - 5봉 갭은 원전 출처 불명

조치: - 코드에 결함 주석만 추가, 변경은 PM 결정 대기 (변경 시 백테스트 재실행 필요)

위치: bulkowski_trigger.py:55-65

사소한 자기참조 (영향 미미, 변경 없음)

  • VSA vol_sma30 (1/30 = 3.3% 자기영향)
  • OF vol_z (1/21 = 4.7%)
  • cp 동적 임계 (1/26 = 3.8%)
  • 모두 percentile 기반 시스템 표준 패턴 — 의도된 동작

정합 확인 (변경 없음)

  • vsa_signals.py 8 신호 정의 — Tom Williams 원전 정합
  • AMT volume_profile.py POC/VA/HVN/LVN — Steidlmayer 원전 정합
  • OF _bvc_buy_ratio t분포 df=0.25 — Easley/LdP/O'Hara 2012 표준
  • OF _exhaustion 단조감소 — R3 §3-3 정합

Smoke Test (5건 케이스, 수정 후)

Case 수정 전 verdict 수정 후 verdict retrace_ratio 변화
A3 한화에어로 MIXED_BUY_LEAN MIXED_BUY_LEAN cur 4.18% → 5.95%, max 14.62% → 20.83%
B1 삼전 MIXED_SELL_LEAN MIXED_SELL_LEAN cur 14.55% → 12.04%, max 20.14% → 16.67%
B3 LGES MIXED_SELL_LEAN MIXED_SELL_LEAN cur 1.62% → 1.08%, max 12.93% → 8.67%
D1 KT&G AVOID_STRONG AVOID_STRONG cur 2.14% → 1.72%, max 8.56% → 6.87%
E1 카카오 MIXED_SELL_LEAN MIXED_SELL_LEAN (sell vote 2→3) cur 19.75% → 11.08%, max 20.23% → 11.35%
  • 4건 verdict 동일, E1 sell vote 증가 (Bulkowski가 SELL 추가)
  • retrace_ratio 값 모두 변경 — 의도된 결과 (DOWN impulse는 분모 변경으로 ratio 감소, UP은 증가 또는 동일 방향)

영향 평가

  • 결함 #1+#2는 S304 도입 이후 모든 백테스트(S304/S305/S307/S307big/S307+OF/S307big+OF)의 retrace_label, retrace_override 결과에 영향.
  • 결함 #3은 Wyckoff trigger의 spring_event_3d / upthrust_event_3d 발화 빈도에 영향.
  • 수정 후 백테스트 재실행 권장 (PM 결정 시 진행). 본 세션은 수정만 완료, 재실행은 다음 세션 대상.

산출

  • scripts/discovery/triggers/_retracement.py — 수정 완료
  • scripts/discovery/triggers/wyckoff_trigger.py — 수정 완료
  • scripts/discovery/triggers/bulkowski_trigger.py — 결함 주석 추가
  • docs/research/2026-05-24_S307_defects_fix.md (본 문서)

다음 (PM 결정)

  1. 결함 수정 후 백테스트 재실행 (S307big + S307big+OF, ~70분) — 결과 변화 측정
  2. 4 Bulkowski 5봉 갭 처리 결정 (제거 / 유지)

  3. 차트 + 시장 + 재료 결합 시스템 본격 설계