차트 발굴 — Layer A/B/C 한국 데이터 매핑¶
작성: 2026-05-23 | 상위 Topic: docs/topics/topic_system_redesign.md
근거 리서치: docs/research/20260522_chart_flow_structuring_research.md (R3)
소관: R3 §5 다음 단계 (1) "Layer A/B/C 통합 스키마를 한국 데이터 가용성에 맞춰 확정 — 어느 필드가 키움 REST/기존 수집기로 즉시 산출 가능한지 매핑."
0. 이 문서의 지위¶
R3 §2가 정의한 통합 스키마(Layer A 정규화 사실값 / B 검출 신호·국면 / C 조건부 확률)의 각 필드를 우리 도구·데이터에 1:1로 매핑한 표. 이 매핑이 확정돼야 차트 발굴기 v0가 어디부터 시작할지가 결정된다.
가용성 범례: ✅ 즉시 산출 / ⚠️ 변형·재보정 필요 / ❌ 부재 버전 범례: v0 = 첫 가동(차트 발굴기) / v1 = 신호·국면 확장 / v2 = base-rate 엔진 결합
원칙 (R3 S1·S6·S7 인용): - 모든 필드는 정규화값(z-score·백분위·비율·ATR 정규화). 절대값 금지. - feature는 시점 t 이전 데이터만. 사후 라벨(ultimate high)은 학습 라벨 전용. - 미국·BTC 캘리브레이션 임계값은 한국 시총·거래대금 tier별 재보정 필수.
1. Layer A — 정규화 사실값 (절대값 0건)¶
1-A. price_level¶
| 필드 | R3 정의 | 산출 도구 | 한국 가용성 | 우리 현황 | v0 |
|---|---|---|---|---|---|
range_pos_52w |
52주 range 내 위치 0~100 | FDR 일봉 252일 | ✅ 즉시 | 수집 가능 | Y |
high_proximity |
현재가 / 52주 고가 | FDR 일봉 252일 | ✅ 즉시 | 수집 가능 | Y |
price_zscore_20d |
(가격 − MA20) / σ | FDR 일봉 20일 | ✅ 즉시 | 수집 가능 | Y |
drawdown_60d |
60일 고점 대비 낙폭 | FDR 일봉 60일 | ✅ 즉시 | 수집 가능 | Y |
→ 전부 일봉만으로 산출. v0 핵심 4필드.
1-B. volume_flow¶
| 필드 | R3 정의 | 산출 도구 | 한국 가용성 | 우리 현황 | v0 |
|---|---|---|---|---|---|
rvol_20d |
거래량 / 20일 평균 | FDR 일봉 | ✅ 즉시 | 수집 가능 | Y |
vol_zscore |
거래량 z-score (log 권장) | FDR 일봉 | ✅ 즉시 | 수집 가능 | Y |
cmf_20d |
Chaikin Money Flow −1~+1 | FDR 일봉(OHLCV) | ✅ 즉시 | 수집 가능 | Y |
obv_slope_z |
OBV 기울기 z-score | FDR 일봉 | ✅ 즉시 | 수집 가능 | Y |
foreign_flow_z |
외인 순매수(거래대금 대비) z | pykrx / flow_series/{code}.json |
✅ | 보유(351종) | Y |
inst_flow_z |
기관 순매수 z | pykrx / flow_series | ✅ | 보유 | Y |
flow_relative_pct |
수급 절대량의 거래대금 대비 백분위 | flow_series + 거래대금 | ✅ | 보유, 신규 산출 | Y |
→ 외인·기관 수급이 한국 강점. v0에 전부 포함.
1-C. vsa (per-bar, 최근 N봉)¶
| 필드 | R3 정의 | 산출 도구 | 한국 가용성 | v0 |
|---|---|---|---|---|
vol_ratio |
vol / SMA(vol, 7) | FDR 일봉 | ✅ 즉시 | Y |
spread_ratio |
(H−L) / SMA(H−L, n) | FDR 일봉 | ✅ 즉시 | Y |
close_pos |
(C−L)/(H−L) ∈ [0,1] | FDR 일봉 | ✅ 즉시 | Y |
err_zscore |
|ΔC| / (vol_ratio × ATR_norm), z-score 음극단=absorption | FDR 일봉 | ✅ 즉시 | Y |
absorption_flag |
err_zscore + close_pos 조건부 | 위 조합 | ✅ | Y |
→ VSA 원시지표는 OHLCV만으로 충분. 임계값(R3 §3-1: vol 2.0/1.2/0.5 등 BTC 캘리브레이션)은 한국 재보정 필요 — v0는 임계 없이 값만 산출, 임계 적용은 Layer B에서.
1-D. order_flow (틱 부재 — 분봉 BVC 근사)¶
원칙 정정: order_flow의 본래 그릇은 분봉. 일봉 BVC는 통계 약함(샘플 1/일). 키움 REST get_minute_chart(5분봉, 장중 ~78봉/일)로 분봉 BVC를 산출하는 게 R3 CF4 의도. 일봉 산출은 fallback.
| 필드 | R3 정의 | 산출 도구 | 한국 가용성 | v0 |
|---|---|---|---|---|
approx_delta_bvc |
표준화수익률 t분포 CDF → 매수비율 (정확도 ~80%, R3 CF4) | 분봉 권장 (키움 5분봉, 일봉 fallback) | ✅ | Y (분봉) |
lower_wick_ratio |
(min(O,C)−L)/(H−L), 봉별 산출 후 일별 통계 | 분봉 또는 일봉 | ✅ | Y |
upper_wick_ratio |
(H−max(O,C))/(H−L) | 분봉 또는 일봉 | ✅ | Y |
cvd_zscore |
분봉 BVC delta 누적 → z-score | 분봉 BVC 누적 | ✅ | Y (분봉) |
cvd_price_divergence |
CVD−가격 발산 ±1/0 | 위 + 가격 시계열 | ✅ | Y |
ofi_zscore_20d |
Multi-Level OFI (호가 quote size 기반, R3 §3-3 arXiv:1907.06230) | 호가 누적 데이터 필요 — 분봉도 불가 | ❌ | v2 보류 |
→ 분봉 BVC는 v0 포함. ofi_zscore_20d만 호가 인프라 부재로 v2.
분봉 수집 — 단계별로 완전히 다름:
| 단계 | 유니버스 | 분봉 사용 | 목적 |
|---|---|---|---|
| 개발/연구 (base-rate 엔진 구축, 패턴 발굴, 임계 한국 재보정) | KOSPI+KOSDAQ 전 종목 (~2,500) × N년 | 광범위 수집 — 통계 표본 최대화 (적을수록 신뢰도↓) | 신호·국면별 D+N 분포 측정, 패턴 발굴 |
| 실전 운영 (일별 후보 추출) | funnel 압축 후 N개 (예: 50) | Stage 2 비싼 계산에만 적용 | 빠른 일일 스캔 |
운영 funnel (R4 CF1 — "싼 필터 먼저 + 무거운 계산 나중"):
- Stage 1 (싼, 전 universe): 일봉 Layer A 12필드 → 횡단면 z-score → 상위 N개 (예: 500 → 50)
- Stage 2 (비싼, 상위 N만): 그 N개에만 분봉 호출 → order_flow 5필드 + 분봉 정밀 VSA → 최종 후보
- 분봉 호출 비용: N=50 × 1 API call ≈ 30초. 일평균 운영 부담 미미.
→ 개발 단계의 분봉 수집은 별도 작업 (코퍼스 구축). 운영 단계의 funnel과 혼동 금지.
2. Layer B — 검출 신호·패턴·국면 + base rate¶
2-A. vsa_signal¶
| 필드 | R3 정의 | 산출 | 한국 가용성 | v0 |
|---|---|---|---|---|
vsa_signal |
8신호 + upthrust/spring (거래량×스프레드×추세×봉방향×종가위치 조합) + strength(2~4) | Layer A 1-C 위 룰엔진 | ⚠️ 한국 임계 재보정 필요 (S7) | v1 |
signal_base_rate |
신호별 D+N 상승률 | base-rate 엔진 | ❌ 외부 미신뢰 (CF2) | v2 |
→ v0는 Layer A 값만 산출, 신호 검출(임계 비교)은 v1. 한국 시총·거래대금 tier별 재보정 후 적용.
2-B. auction_state (Market/Volume Profile)¶
| 필드 | R3 정의 | 산출 도구 | 한국 가용성 | v0 |
|---|---|---|---|---|
auction_state |
balance / imbalance_up / imbalance_down + state_age_bars | 분봉 또는 일봉 집계 | ⚠️ 분봉 필요 | v1 |
poc_pct, vah_pct, val_pct |
POC(최다 거래 가격), VAH/VAL(TPO 70%) | 키움 REST 분봉(get_minute_chart) |
⚠️ 분봉 누적 수집 신규 | v1 |
va_width_atr |
VA 폭의 ATR 정규화 | 위 + ATR | ⚠️ | v1 |
poc_migration_5d |
5일 POC 이동 | 5일치 분봉 누적 | ⚠️ | v1 |
hvn/lvn |
거래량 봉우리/골짜기 | Volume Profile 함수 | ⚠️ | v1 |
nearest_lvn_dist_atr |
현재가에서 가장 가까운 LVN까지 ATR 거리 | 위 + ATR | ⚠️ | v1 |
rotation_factor_20 |
봉별 고저 갱신 ±1씩, 20봉 합산 | FDR 일봉 | ✅ 즉시 (일봉으로 가능) | Y(일봉 한정) |
va_overlap_ratio_1d |
전일 VA와 당일 VA 겹침 비율 | 분봉 필요 | ⚠️ | v1 |
day_type |
Trend / Normal / Neutral / Double Distribution | 분봉 분석 | ⚠️ | v1 |
balance_score |
0~1 | 위 종합 | ⚠️ | v1 |
→ Profile류는 분봉 수집·집계 인프라가 필요해 v1 작업. 일봉만으로 가능한 rotation_factor_20만 v0에 추가.
2-C. wyckoff (4국면)¶
| 필드 | R3 정의 | 산출 도구 | 한국 가용성 | v0 |
|---|---|---|---|---|
phase |
ACC / MARKUP / DIST / MARKDOWN + confidence | Wyckoff 룰엔진 (R3 §3-4) | ⚠️ 임계 한국 재보정 필요 (climax 거래량 MA×2.0/×1.5, range 8%/15%) | v1 |
last_event, events[] |
SC·AR·ST·Spring·SOS·LPS·UTAD·SOW… | 룰엔진 + 가격·거래량 이벤트 | ⚠️ | v1 |
supply_demand_balance |
3법칙 #1 | 거래량-가격 비율 | ⚠️ | v1 |
cause_count |
P&F count (3법칙 #2) | P&F 차트 | ⚠️ | v2 |
effort_result_divergence |
거래량-가격 발산 (3법칙 #3) | err_zscore 시계열 | ✅ Layer A로 부분 산출 | v1 |
ad_line |
MFM = ((C−L)−(H−C))/(H−L), ADL+=MFM×Vol | FDR 일봉 | ✅ 즉시 | Y |
→ Wyckoff 룰엔진 전체는 v1. A/D Line만 v0에 추가(일봉 OHLCV로 산출, R3 §3-4 정의).
2-D. chart_pattern (Bulkowski)¶
| 필드 | R3 정의 | 산출 | 한국 가용성 | v0 |
|---|---|---|---|---|
pattern_id |
Bulkowski 60+ 패턴 매칭 | 패턴 인식 룰엔진 | ⚠️ 구현 부담 | v2 |
bulkowski.fail_rate, avg_rise, perf_rank |
미국 일봉 기준 수치 | base-rate 엔진 자체측정 | ❌ 외부 신뢰 불가 (CF2). 한국 코퍼스로 자체 측정 필요 | v2 |
→ Bulkowski는 base-rate 엔진(v2)과 결합. v0·v1 보류.
3. Layer C — 조건 조합 조건부 확률¶
| 필드 | R3 정의 | 산출 도구 | 한국 가용성 | v0 |
|---|---|---|---|---|
condition_hash |
사실 조합 식별자 | Layer A+B 조합 해시 | base-rate 엔진 후 | v2 |
regime |
레짐 라벨 (조건축 필수 — CF5) | macro_series + risk_on_off | ⚠️ 시점 t 빈티지 필요 | v2 |
n_historical_samples |
조건 만족 사례 수 | 한국 코퍼스 백테스트 | base-rate 엔진 산출 | v2 |
base_rate_up_DN |
P(D+N 상승 | 조건, 레짐) | 위 | base-rate 엔진 산출 | v2 |
return_distribution |
수익률 분포 | 위 | base-rate 엔진 산출 | v2 |
confidence_flag |
샘플 부족 시 low | 위 | base-rate 엔진 산출 | v2 |
→ Layer C 전체 = base-rate 엔진 산출물. 첫 백테스트("큰 상승 다음날", R3 §5(4))가 그 엔진의 첫 가동.
4. v0 채택 필드 (차트 발굴기 첫 시제품)¶
위 매핑에서 v0 = Y 표기된 필드만 발췌. 전부 일봉 OHLCV + 외인·기관 수급(보유)으로 산출 가능, 추가 수집 0.
Layer A — 정규화 사실값 (v0 17필드)
price_level (4) : range_pos_52w, high_proximity, price_zscore_20d, drawdown_60d
volume_flow (7) : rvol_20d, vol_zscore, cmf_20d, obv_slope_z,
foreign_flow_z, inst_flow_z, flow_relative_pct
vsa (5) : vol_ratio, spread_ratio, close_pos, err_zscore, absorption_flag
order_flow (5, 분봉): approx_delta_bvc(분봉 BVC), lower_wick_ratio, upper_wick_ratio,
cvd_zscore(분봉 누적), cvd_price_divergence
※ ofi_zscore_20d 는 호가 quote-size 데이터 필요 → v2 보류
Layer B — 신호·국면 (v0 부분, 2필드)
rotation_factor_20 : 일봉으로 산출 가능한 Profile 지표
ad_line : A/D Line (Wyckoff 3법칙 부분)
Layer C — 조건부 확률
v0 미포함 (base-rate 엔진 = v2)
→ v0 차트 발굴기 = 종목별 Layer A 17필드 + Layer B 2필드 산출 → 횡단면 정규화 → 합성 점수 → 상위 N 후보 + fired_signals 태그.
5. v1·v2 로드맵¶
v1 — Layer B 확장¶
- VSA 8신호 + upthrust/spring 룰엔진 (R3 §3-1 임계 한국 재보정 후 적용)
- Wyckoff phase·event 룰엔진 (R3 §3-4 임계 한국 재보정)
- Market Profile (분봉 수집 인프라 신규 — 키움 REST
get_minute_chart누적) - CVD-가격 발산 산출
v2 — Layer C base-rate 엔진¶
- 한국 종목 일봉·수급 코퍼스 N년 백테스트
- 신호·국면·패턴별 D+N 상승률 측정 (look-ahead 차단)
- 레짐 분리 (R3 CF5 필수) — risk_on_off 시점 t 빈티지 산출 인프라
- Bulkowski 패턴 한국판 fail_rate / avg_rise / perf_rank 측정
- 첫 백테스트: "큰 상승 다음날" (R3 §5(4))
6. 다음 단계¶
- 본 매핑 PM 확정
- v0 차트 발굴기 코드 —
scripts/discovery/chart_scan.py - 입력: 거래대금 상위 N 종목 코드 리스트 + 기준일
- 처리: FDR 일봉 252일 + flow_series → Layer A 17 + Layer B 2 산출 → 횡단면 z-score → 합성 점수
- 출력:
data/discovery/chart_candidates/{date}.json+ 1페이지 md - 결과 보고 → v1 우선순위 결정 (VSA 신호? Wyckoff? Profile?)