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.py8 신호 정의 — Tom Williams 원전 정합- AMT
volume_profile.pyPOC/VA/HVN/LVN — Steidlmayer 원전 정합 - OF
_bvc_buy_ratiot분포 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 결정)¶
- 결함 수정 후 백테스트 재실행 (S307big + S307big+OF, ~70분) — 결과 변화 측정
-
4 Bulkowski 5봉 갭 처리 결정 (제거 / 유지)¶
- 차트 + 시장 + 재료 결합 시스템 본격 설계