콘텐츠로 이동

수학적 렌즈 — 실측·구현 판정

작성일: 2026-06-23 성격: 공리·수식 사양(수학적렌즈_공리사양.md)을 우리 데이터·도구로 실제 어디까지 구현 가능한지 실측한 문서. 원논문 대조(웹검증) + 키움 API/로컬 데이터 직접 확인.

공리 정초는 별도: 수학적렌즈_공리사양.md. 이 문서는 그 사양의 실현 가능성 판정.


PART 1. 수식 정의 보정 (원논문 대조)

A-#1. CKS depth 정의 정정 [검증완료]

원본 L225 문제:

ΔP ≈ β·OFI ,  β ≈ 1/(2·depth)   # depth(거래대금/잔량)는 분모
검증 결과 (Cont·Kukanov·Stoica 2014, JFEC 12(1):47-88): - 원논문: "price changes ~ OFI, slope inversely proportional to market depth" - depth = 최우선호가(best bid/ask)의 평균 잔량, 단위는 주식수(shares)거래대금 아님. - 출처: Oxford JFEC, Markwick 구현

정정:

ΔP_τ ≈ β · OFI_τ
β = c / D ,   D = (Σ best-bid 잔량 + Σ best-ask 잔량) / 2N   # 단위: 주식수
c = 회귀 적합 계수 (이론 상수 아님, 종목·기간 의존)            # '2'는 못 박지 말 것
- 핵심: 분모 D는 주식수 기준 호가 잔량. "거래대금/잔량" 주석 삭제. - 계수 1/2의 2는 이론 상수가 아니라 회귀 적합값 → c로 표기, 값은 데이터로 추정. - ⚠ 이 D는 A3의 ρ 분모(signed OFI)와 다른 양. 혼용 금지(원본 L271 "두 역할 분리"와 정합).

A-#2. 일봉 골격의 분기 분해능 한계 명시 [구조 보강]

원본 L316-318 문제: "정밀도만 forward, 골격은 일봉서 섬"이라 했으나, 분기 분해 자체(흡수 vs markup)가 일봉서 약해지는 것을 경고 안 함.

정정 — 부록 종합에 추가할 경고문:

[일봉 골격의 분해능 한계]
3장 표(체결강도 AI × 저항 ρ)의 흡수 분리는 '진짜 aggressor(틱)' 전제다.
일봉 프록시(MFM=종가위치, Amihud=|r|/거래대금)로 대체하면:
  - AI → MFM: aggressor 방향이 아니라 '종가가 고저 어디서 끝났나'. 갭·꼬리에 취약.
  - ρ → Amihud: 부호 없는 분모라 '받아친 주체 방향'을 못 봄.
→ 일봉은 흡수 '후보'를 거르는 1차 필터까지. 흡수/markup '확정'은 틱 forward 필요.
  일봉 단계에서 분기를 확정했다고 주장하면 안 됨(모호도 U가 항상 높게 남음).

A-#3. Amaya realized skewness 스케일 인자 [검증완료]

원본 L269 문제:

skew = m3 / m2^{1.5}   (m_k = k차 중심모멘트)
검증 결과 (Amaya et al. 2015, JFE):
RDSkew = (√N · Σ r_i³) / (Σ r_i²)^{3/2}      # N = 일중 표본수, √N 스케일 인자
출처: ScienceDirect S1059056022000570 (Amaya 2015 재현)
정정: 원본의 m3/m2^1.5는 √N 인자가 빠진 단순 표준화 왜도. - 부호·횡단면 상대비교엔 무방(같은 N이면 단조). - 절대값·종목 간 비교 시엔 √N 필수 — 일중 표본수 다른 종목 비교하면 왜곡. - 주석 추가: "본 사양은 부호/상대비교용 단순형. 절대 비교 시 √N 곱할 것."

A-#4. EMA의 고정 α vs 비정상성 긴장 [구조 보강]

원본 L295: P_{s,t} = (1−α)·P + α·p # EMA (베이즈 아님)

문제: 6장이 "레짐 바뀌면 분포 바뀜=사양"인데, EMA의 고정 α는 레짐 전환 속도를 따라간다는 보장 없음. 느린 α면 전환 늦게 잡고, 빠른 α면 노이즈.

정정 — α를 레짐 변동성에 연동:

α_t = clip( α_base · (σ_recent / σ_baseline) , α_min, α_max )
  # 변동성↑(레짐 전환 의심) → α↑ (빨리 갱신)
  # 안정 → α↓ (천천히, 노이즈 억제)
σ_recent = 최근 k일 실현변동성,  σ_baseline = 장기(60d) 실현변동성
- 단, 이건 [미검증] 설계 제안. EMA 자체는 표준이나 α 적응식은 우리 선택. - 대안: 베이지안 변화점 탐지(BOCPD) — 무겁지만 레짐 전환을 정식 모델링. 일봉선 과함.

A-#5. 합의식의 0-붕괴 / 재료부재 vs 상충 구분 [버그 수정]

원본 L304 문제:

A = (sign v_micro == sign v_mat) ? min(|v_micro|, |v_mat|) : 0
재료 prior 없는 종목(v_mat=0)이 항상 "불일치"로 떨어져 미시 신호 영원히 강화 안 됨. "재료 없음"과 "재료 상충"이 같게 처리되는 결함.

정정 — 3-way 분기:

재료 부재:   |v_mat| < ε        → A = 0,  단 U 증가 안 함 (미시 단독, prior 중립)
                                   P_final = P_base (강화/약화 없이 미시값 그대로)
재료 일치:   sign 같음          → A = +min(|v_micro|, |v_mat|),  P_final ∝ P_base·(1+κA)
재료 상충:   sign 반대          → A = 0,  U 증가 (판단 유예)
                                   P_final = P_base·(1−κ·min(|·|))  # 적극적 디스카운트
- 핵심: 재료 부재(중립)는 미시 신호를 살려두고, 상충만 디스카운트+유예. - ε = 재료강도 노이즈 임계 (예: 0.1). 값은 forward 보정.

A-#6. 검정 트레이드 상관 보정 — 방법 명시 [검증완료, 최우선]

원본 L185, L236 문제: "트레이드 상관 보정 필요"만 적고 방법 없음. 이게 흐름 렌즈 kill의 통계 핵심 함정일 가능성.

검증 결과 (overlapping returns / persistent regressor 문헌): - 겹치는 누적수익 + persistent regressor → t-stat 발산, 허위 유의 (arXiv 2512.12924) - 표준 처방: Purged/Embargoed K-Fold, CPCV/CSCV (López de Prado), block bootstrap, Newey-West HAC (backtest overfitting)

정정 — 검정 하니스 명세:

H0: E[초과수익 | S] = 0
초과수익 = R_trade − E[R_random | 종목, 보유일]

(1) 트레이드 독립성:
    - 보유기간 겹치는 트레이드는 독립 표본 아님 → block bootstrap
      (블록 길이 = max 보유일, 겹침 구간 통째로 리샘플)
    - 또는 Newey-West HAC (lag = 보유일−1)로 t-stat 보정
(2) overfitting 방지:
    - 윈도/임계값 탐색 시 → Purged K-Fold + embargo(보유일+1)
    - 다중 임계값 시도하면 → CSCV로 PBO(Prob of Backtest Overfit) 보고
(3) 벤치 독립성:
    - E[R_random]은 같은 종목·같은 보유일·랜덤 진입시점 N=1000 부트스트랩
(4) 풀 rolling:
    - IS/OOS 부호 반전 = kill (원본 6장 유지). 단 '레짐 전환'과 구분 위해
      OOS를 시간순 rolling으로 쪼개 부호 안정성 추적.

A-#7. 임계값 미정 파라미터 — 추정 프로토콜 [구조 보강]

원본: P_exit, κ, α, max_hold, ε, P_base 전부 기호만.

정정 — "구현 가능" 주장과 정합되게, 초기값 + 추정법 명시:

파라미터    | 초기값(일봉)      | 추정법
α_base      | 0.3              | forward 50트레이드 후 변동성 연동(A-#4)
κ           | 0.5              | 합의 효과 grid search (CSCV로 PBO 체크)
P_exit      | P_entry − 0.15   | 가변보유 백테스트 OOS
max_hold    | 20일             | 원본 falsification 보유일과 일치
ε           | 0.1              | 재료강도 분포 하위 10%ile
P_base      | μ_S 로지스틱 매핑 | 상태별 조건부 기댓값에서 직접

주의: 이 표는 초기 시드값일 뿐. 모두 forward 수집으로 재보정 대상. "일봉서 구현 가능"의 정확한 의미 = '돌릴 수 있다'이지 '검증됐다' 아님.


PART 2. 수집도구 해상도 판정

근거: 키움 REST API 문서 PDF (528p, 2026-05-12) 직접 대조 + .claude/AGENT_TOOL_CATALOG.md.

중대 정정 (2026-06-23): 최초 판정은 카탈로그 §9만 보고 "틱/호가 수집 불가(🔴)"로 적었으나, 키움 REST API 원문서 대조 결과 틱·호가·체결강도·체결정보가 전부 제공됨을 확인. 카탈로그 §9는 키움 함수의 일부만 기재한 것이었다. 아래는 원문서 기반 정정 판정.

C-0. 키움 API ↔ 사양 미시구조 매핑 [PDF 직접 확인]

API ID API명 응답 핵심 필드 사양 매핑
ka10079 주식틱차트조회 cntr_tm(체결시간)+OHLCV, tic_scope 1/3/5/10/30틱, cont-yn 페이징 A3' realized skew 원천
ka10080 주식분봉차트조회 OHLCV, 1/3/5/10/15/30/45/60분 A3' POC변위·A3'' nested
ka10003 체결정보요청 tm+cur_prc+cntr_trde_qty+sign(체결부호)+pri_sel/buy_bid_unit AI(aggressor) 직접 근사
ka10004 주식호가요청 매도/매수 10단계 호가+잔량(sel/buy_Nth_pre_req) A1 OFI depth 원천
ka10046 체결강도추이시간별 cntr_str(체결강도)+cntr_str_5min+시간별 시계열 AI 축 — 키움 산출 체결강도
ka10047 체결강도추이일별 일별 체결강도 시계열 AI 축 일별
ka10025 매물대집중요청 가격대별 매물 집중(prps_cnctr) Volume Profile / POC
ka10064 장중투자자별매매차트 시간별 외국인/기관/투신/보험/은행 수급 프록시 시계열
0B/0C/0D 실시간 체결/호가/호가잔량 WebSocket 실시간 forward 틱 스트림

핵심: ka10003sign(체결부호) + ka10004의 10호가 잔량 = OFI(A1)를 직접 계산 가능. 체결강도(ka10046)는 키움이 이미 산출한 AI 축. 틱차트(ka10079)는 realized skewness 원천. → 사양이 "틱 forward 필요"라 했던 항목 대부분이 키움 REST로 즉시 조회 가능.

C-1. 사양 요소별 데이터 요구 ↔ 키움 REST API 매핑 [PDF 확정]

사양 필요 입력 키움 API (PDF 확인) 해상도
A2 조건부 기댓값 일봉 OHLCV + 상태라벨 ka10081 일봉차트, FDR OHLCV 완전
A3 일봉 MFM(종가위치) 일봉 H/L/C ka10081 완전
A3 일봉 Amihud ρ |r| / 거래대금 OHLCV + 거래대금 완전
A3' POC변위 가격대별 거래대금 ka10080 분봉(1분~) + ka10025 매물대집중 완전
A3'' nested divergence 20/60/120 POC변위 분봉 누적으로 산출 완전
A4 모호도 U P(흡수)/P(분산) 체결강도(ka10046)+호가(ka10004)로 분기 분해 완전(틱 조회 시)
5장 합의 (재료 prior) v_mat news-curator/NC-3, macro, fund 에이전트 완전
7장 상태확률+EMA 일봉 피처 OHLCV + 수급(SEN-1) 완전
8장 사이징+가변보유 U + prior기울기 위 조합 완전
A1 OFI 호가갱신 e_n 시퀀스 ka10004 10호가잔량 + ka10003 체결 sign 계산가능
AI aggressor imbalance 체결 부호 ka10003 sign + ka10046 체결강도 직접제공
A3 틱 진짜 ρ(Kyle λ) signed OFI ka10003(체결부호·수량) + ka10079 계산가능
A3' realized skew 일중 고빈도 수익 ka10079 틱차트(1틱~) 완전

C-2. 해상도 3단계 판정 [정정]

✅ 완전 (지금 키움 REST로 가능):
   A2·A3(일봉+틱)·A3'(POC+skew)·A3''·A4·5장·7장·8장 + A1 OFI + AI
   → 사양의 거의 전부. 일봉 골격은 물론 미시구조(OFI·체결강도·틱 skew)까지 조회 가능.

🟡 주의 (제공되나 운영 비용/제약):
   - OFI 정밀 계산: ka10003(체결)+ka10004(호가)를 시간정렬해 e_n 재구성해야 함.
     키움 REST는 '스냅샷/조회'라 호가 변화 시퀀스(placement/cancel)는
     실시간(0D 주식호가잔량 WebSocket)으로 받아야 진짜 OFI. REST 조회는 근사.
   - 틱차트 과거 깊이: cont-yn 페이징은 되나 보관 기간·rate limit 미확인(PDF에 기간 명시 없음).
   - 체결강도(cntr_str) 산식: 키움 내부 정의(매수체결/매도체결 비율 추정)라
     '진짜 aggressor imbalance'와 동일한지는 키움 산식 확인 필요.

🔴 불가:
   (없음) — 사양의 모든 수식 입력이 키움 REST 또는 기존 에이전트로 커버됨.
   유일한 진짜 제약은 'forward 실시간 호가 스트림 저장 인프라'(0D WebSocket 수집기)가
   아직 우리 scripts/에 있는지 미확인 — 있으면 OFI까지 풀해상도, 없으면 REST 근사.

C-3. 결론 — 어느 해상도까지 가능한가 [정정]

최초 판정(✅60%/🟡25%/🔴15%)은 틀렸다. 키움 REST 원문서 대조 결과:

지금 당장 (키움 REST + 기존 에이전트): - 일봉 골격(A2·7·8·5장): 즉시 가능. (변동 없음) - 분봉 미시(A3'·A3''·POC·Volume Profile): ka10080+ka10025즉시 가능. - 틱 미시(realized skew·AI·체결강도): ka10079+ka10003+ka10046으로 즉시 가능. - OFI(A1): ka10004 10호가 + ka10003 체결부호로 계산 가능(REST 근사).

유일하게 남는 정밀도 격차: - 진짜 OFI는 호가의 변화 시퀀스(취소/신규 placement)가 필요 → 실시간 0D WebSocket. REST 조회는 '현재 호가 스냅샷'이라 e_n의 placement/cancel 분해가 근사적. - 즉 사양 A1의 "체결 없이도 움직이는 호가"를 정밀 포착하려면 실시간 수집기 필요. 단 이건 forward 인프라 한 개(0D 구독+저장)의 문제이지 '데이터 부재'가 아님.

한 줄 판정 [정정]:

사양의 수식 입력은 키움 REST 하나로 사실상 전부(✅ ~95%) 조회 가능하다. 일봉 골격 + 분봉 POC + 틱 realized skew + 체결강도(AI) + 10호가(OFI 근사)까지. 진짜 풀해상도 OFI(호가 변화 시퀀스)만 실시간 0D WebSocket 수집기 1개가 더 필요. → 원본 9장 "forward 수집이 필수"의 정확한 범위 = '전부 새로 깔아야 함'이 아니라 실시간 호가 스트림 저장기 1개. 나머지는 REST 조회로 backfill 가능.

C-4. 코드 구현 현황 — 확정 [scripts/kiwoom_rest_api.py 직접 확인]

PDF로 API 존재 확정 + 우리 코드 구현 여부까지 확인 완료 (2026-06-23).

구현됨 (scripts/kiwoom_rest_api.py, "Rebuilt 2026-05-15 from live API verification"):

get_daily_chart(ka10081)          ✅ 일봉
get_minute_chart(ka10080)         ✅ 분봉 (1/3/5/10/15/30/45/60분)
get_inst_trading_trend            ✅ 기관/외인 수급
get_program_trading_daily_all     ✅ 프로그램매매
get_stock_basic_info / 등락률·거래대금 상위 / 섹터지수  ✅

미구현 (PDF엔 있으나 우리 코드엔 메서드·엔드포인트·사용흔적 0건scripts/ 전체 grep 확인):

ka10079 주식틱차트         ❌ → realized skewness(A3') 원천. 미구현.
ka10003 체결정보(sign)     ❌ → AI aggressor·OFI 체결부호. 미구현.
ka10004 주식호가(10단계)   ❌ → OFI depth. 미구현.
ka10046 체결강도추이       ❌ → AI 축 직접값. 미구현.
ka10025 매물대집중         ❌ → Volume Profile/POC. 미구현.
WebSocket 0D 실시간호가    ❌ → 진짜 OFI(호가 변화 시퀀스). 미구현.

확정 결론:

  • 일봉 골격(A2·5·7·8장): 코드까지 지금 바로 가능. (일봉/분봉/수급 메서드 존재)
  • 분봉 미시(A3' POC·A3''): 분봉 메서드(get_minute_chart)는 있으나 매물대집중(ka10025) 미구현 → POC는 분봉 OHLCV로 근사 자작 필요(가격대 버킷팅).
  • 틱 미시(realized skew·AI·OFI 근사): API는 있으나 메서드 6종 전부 미구현. → ka10079/ka10003/ka10004/ka10046 래퍼 추가가 선결 과제(각 수십 줄, 난이도 낮음).
  • 진짜 OFI: WebSocket 0D 수집기 신규 — 유일한 인프라급 작업.

C-5. 작업 우선순위 (확정 사실 기반)

단계 작업 데이터 코드 해상도 획득
0 일봉 상태모델 PoC ✅ 있음 ✅ 있음 A2·5·7·8장 (골격) — 즉시
1 분봉 POC 자작 ✅ 분봉 메서드 🟡 버킷팅 추가 A3'·A3'' (변화신호)
2 틱/체결/호가/체결강도 래퍼 4종 ✅ API 존재 ❌ 신규(쉬움) AI·realized skew·OFI 근사
3 WebSocket 0D 수집·저장기 ✅ API 존재 ❌ 신규(인프라) 진짜 OFI (풀해상도)

병목은 데이터가 아니라 코드다. 단계 0은 오늘 가능, 1~2는 래퍼 추가(저난이도), 3만 실시간 인프라. 원본 9장 "forward 필수"의 정확한 실체 = 단계 3 하나. 단계 0~2는 키움 REST 조회만으로 backfill 가능(과거 틱도 cont-yn 페이징).


PART 3. 섹터 ETF 배치 PoC

근거: scripts/research/lens_etf_poc.py 실행 (2026-06-23), data/research/lens_etf_poc.json.

D-1. 테스트 설계

  • 차원 압축 전략: 종목 풀 수백 개 대신 섹터 대표 ETF 11개(KODEX 섹터 시리즈)로 렌즈 일봉 골격(A2 조건부기댓값 + A3 흡수프록시)을 배치 실행.
  • 렌즈 상태: "흡수 후보" = MFM>0.3(강세 종가) AND Amihud<중앙값×0.7(자금 대비 안 오름).
  • 출력: 흡수상태 진입 후 5일 forward 수익 μ_S vs 무조건부 μ0, Δμ_S = μ_S − μ0.

D-2. 실측 결과 [동작 확인]

조회 성공:  11개 중 10개 (098560은 ETF 코드 폐지/변경으로 1 bar만 옴 — 코드 문제)
데이터 깊이: 각 600 거래일(2.4년) 일봉 — 충분
호출/시간:   11콜 / 10.9초 (rate limit 1s/req → ETF당 1초, 선형)
ETF 처리:    종목과 100% 동일 (ka10081에 ETF 코드 그대로 입력, 별도 처리 0)

렌즈 출력 (흡수상태 후 5일 Δμ_S, 횡단면 정렬):

266370 KODEX IT        Δμ_S = +0.0191   (상태 113/594회)   ← 흡수=매집 방향
091160 KODEX 반도체    Δμ_S = +0.0134   (상태 100/594회)
117460 KODEX 에너지화학 Δμ_S = +0.0030
069500 KODEX 200(벤치)  Δμ_S = -0.0002   ← 시장 전체는 중립
117680 KODEX 철강      Δμ_S = -0.0008
091170 KODEX 은행      Δμ_S = -0.0013
266360 KODEX 자동차    Δμ_S = -0.0019
140710 KODEX 운송      Δμ_S = -0.0059
102960 KODEX 기계장비  Δμ_S = -0.0062
244580 KODEX 바이오    Δμ_S = -0.0091   ← 흡수=분산 방향

D-3. 판정 — 무엇이 검증됐나

✅ 검증됨: 1. ETF 차원 압축이 작동한다. 종목 풀 대신 섹터 ETF로 렌즈가 돈다. 호출 11초. → 다종목 배치가 무거우면 섹터 ETF 10~15개가 실용적 대안임을 실측 확인. 2. 렌즈가 섹터를 갈라낸다. 같은 "흡수 후보 상태"인데 IT/반도체는 Δμ_S 양(+), 바이오/기계는 음(−). 벤치(KODEX200)는 중립(0). → 사양 2장 E[R|S] vs E[R]이 ETF 횡단면에서 방향성 있는 신호로 분리됨. (단 통계 유의성은 미검정 — 아래 한계) 3. 시스템 정합. ETF 단위 출력 = "어느 섹터로 자금이 가는가"라 기존 자금흐름 프레임(retro/flow-tracker, market-synthesizer)과 바로 연결됨.

🟡 한계 (이번 PoC 미해결): 1. 통계 유의성 미검정. Δμ_S 부호만 봄. A-#6(block bootstrap/Newey-West)을 아직 안 댐. → 흐름 렌즈를 죽인 그 함정. Δμ_S=+0.0134가 노이즈인지 신호인지 아직 모름. 2. IS만, OOS 없음. 600일 전체로 in-sample 계산. 원본 6장의 IS/OOS 부호반전 미검증. 3. 단일 horizon(5일)·단일 임계값(0.3/0.7). 파라미터 grid 미탐색 → 과적합 위험 미측정. 4. 흡수/markup 분해 약함(A-#2). 일봉 MFM이라 흡수 후보까지. 확정은 틱(단계 2) 필요.

D-4. 다음 단계 (PoC → 실전 접목)

단계 0+ (지금 코드 확장 가능):
  - A-#6 검정 하니스 부착 → Δμ_S 통계 유의성 (block bootstrap N=1000)
  - rolling OOS 분할 → IS/OOS 부호 안정성
  - horizon/임계값 grid + CSCV → PBO(과적합 확률) 측정
  → 이것까지 통과해야 'ETF 섹터 렌즈'가 흐름 렌즈처럼 안 죽는다는 증거가 됨.

규모 판정:
  - ETF 11개 = 11초. 50개 = 50초. 종목 200개 = 200초(3.3분) + 결측 처리.
  - 분봉/틱 추가 시 종목당 콜 수 ×N → 다종목은 비현실적, ETF는 여유.
  → 결론: 미시구조(분봉 POC·틱 skew)까지 갈거면 ETF 차원 압축이 rate limit상 거의 필수.

PoC 한 줄 결론: 섹터 ETF 배치는 데이터·호출·계산 전부 동작하고 렌즈가 섹터를 방향성으로 갈라낸다. 단 지금은 "부호가 갈린다"까지의 증거. 통계 검정(A-#6)을 부착하기 전엔 흐름 렌즈와 같은 운명을 피했다고 말할 수 없다. 그게 단계 0+의 핵심 과제.


PART 4. 다종목 배치 + 통계 검정

근거: scripts/research/lens_multistock_test.py 실행(2026-06-23), data/research/lens_multistock_test.json.

E-0. 결정적 발견 — 로컬 parquet 유니버스 존재

data/universe_ohlcv/2,342종목 일봉 parquet(각 ~1,473행/6년, OHLCV+Amount) 보유. → API 호출 0건으로 전 종목 배치 가능. rate limit 병목 소멸. → 다종목 vs ETF는 '가능/불가능'이 아니라 '둘 다 즉시 가능'으로 판명. (C-5 단계0 갱신)

E-1. 실측 결과

처리 종목:   2,290 / 2,342 (유동성<1억·길이<250일 제외)
트레이드:    무조건부 2,999,844건 / 흡수상태 337,468건
Delta_muS:   -0.00470   (흡수상태 진입 후 5일 = 평균보다 0.47%p 낮음)
block-bootstrap p = 0.0000   (겹침 보정 후에도 강한 유의)
CI95(muS) = [-0.00275, -0.00190]   → mu0(+0.00239) 완전 배제
rolling OOS (부호 안정성):
  cut 2023-01  IS -0.00595  OOS -0.00513  부호일치 O
  cut 2024-01  IS -0.00566  OOS -0.00495  부호일치 O
  cut 2025-01  IS -0.00530  OOS -0.00435  부호일치 O
판정: 통계유의 True + OOS안정 True

E-2. 해석 — 렌즈가 작동했다 (단, 부호가 사양 예상과 반대)

사양 가설(3장): 흡수(MFM>0.3 + 자금대비 저저항) = 매집 → forward 양(+) 기대. 실측: 다종목 전체에서 흡수 후보 상태 후 forward 음(−), p<0.0001, OOS 안정.

→ 이것은 렌즈가 죽은 게 아니라 작동한 증거다 (원본 0장 L24 "가려내는 게 렌즈의 일"). - 흐름 렌즈를 죽인 함정(겹치는 트레이드 허위유의)을 block bootstrap으로 정직히 통과. - 신호는 통계적으로 진짜이고 3개 OOS 구간에서 부호 안정. - 방향만 가설과 반대: "강세 종가인데 자금 대비 안 오른 날" 다음은 평균 약세 = 이 상태는 매집보다 분산(분배) 우세. → 음(−) 신호로 회피/숏 활용 가능.

가장 중요한 교차 발견 — 비정상성(원본 6장)의 실증:

ETF 배치(PART D):  IT/반도체 흡수상태 Delta_muS = 양(+)
다종목 배치(PART E): 전체 흡수상태 Delta_muS = 음(-)
→ 같은 상태정의, 정반대 부호. 섹터/레짐에 따라 갈린다.
  원본 6장 "분포가 레짐 따라 변하는 것 = 버그 아니라 사양"이 데이터로 확인됨.
  ⇒ 단일 전역 부호로 쓰면 안 되고, 섹터/레짐 조건부로 부호를 매번 다시 매겨야 함(7장).

E-3. 무엇이 확정됐나 (질문 직답: "다종목에도 가능한가 + 검정")

질문 답 (실측)
다종목 배치 가능? 2,290종목 API 0콜로 즉시. 로컬 parquet 유니버스 보유.
통계 검정 가능? block bootstrap + rolling OOS 동작. 300만 트레이드.
흐름 렌즈 함정 통과? 겹침 보정 후에도 p<0.0001, OOS 안정. 허위유의 아님.
신호 방향? 사양 가설과 반대(음). 흡수=분산 우세. 단 이건 렌즈 정상 작동.
ETF vs 다종목 차이? 🔑 부호가 갈림(ETF 양 / 전체 음) = 비정상성 실증. 조건부 필수.

E-4. 남은 과제 (이제부터가 진짜)

1. 부호 반전 원인 규명: 왜 ETF는 +, 전체는 -인가?
   - 가설: 대형주(ETF 구성)는 흡수=매집, 소형주는 흡수=분산? → 시총분위 층화 검정.
   - 가설: 거래대금 상위/하위로 갈리나? → Amihud 분위 층화.
2. 7장 조건부화: 전역 부호 금지. 섹터/시총/레짐별 Delta_muS 따로 추정 후 사용.
3. 임계값 grid + CSCV: MFM_TH=0.3, AMIHUD_RATIO=0.7은 임의값. PBO 측정 전엔 과적합 미확인.
4. 재료 prior 결합(5장): 음(-) 미시신호 x 재료 부호 합의 → 회피 정밀도 향상.

PART E 한 줄 결론: "다종목 가능한가"는 ✅ — 2,290종목을 API 0콜로 돌렸다. "검정 통과하는가"는 ✅ — block bootstrap·OOS 둘 다 통과, 흐름 렌즈 함정 회피. 단 신호는 음(−)이고 ETF와 부호가 갈린다. 이게 실패가 아니라 핵심 발견: 렌즈는 작동하며, 부호는 섹터/레짐 조건부다(6·7장). 다음은 부호 반전의 층화 규명.

PART D·E의 범위 명확화: 위 D·E는 OHLCV 일봉 프록시(MFM·Amihud)만 검증. 사양의 본질인 호가/Order Flow(A1 OFI·A3 진짜 ρ·체결강도 AI)는 아직 미측정. 그게 PART F다 — 진짜 미시구조 데이터의 가용성·깊이 실측.


PART 5. 호가 / Order Flow 데이터

근거: scripts/research/of_probe.py 실제 키움 호출(2026-06-23 10:33), data/research/of_probe.json. 대상: 069500(ETF) + 005930(삼성전자).

핵심 구분: OHLCV(PART D·E)는 로컬에 6년치 있음. 호가/OF는 로컬에 0. OF는 '이미 쌓인 과거'가 없어 가용성·깊이를 실제 호출로 측정해야 한다.

F-1. 5개 OF API 실측 — 동작 + 과거 깊이

API 동작 응답 LIST 실측 깊이 사양 매핑
ka10047 체결강도일별 ✅ ETF+종목 cntr_str_daly 60행 과거 60일 (0326~0623) AI 축 backfill 가능!
ka10046 체결강도시간별 cntr_str_tm 60행 당일 분단위만 AI 당일
ka10003 체결정보 cntr_infr 30행 당일 최근 30틱(~1초) OFI 체결부호 sign
ka10079 1틱차트 stk_tic_chart_qry 900행 당일 최근 900틱(~30초), next-key realized skew
ka10004 호가 스냅샷 현재 10호가 1개 OFI depth

필드 실측: - ka10047: cntr_str + cntr_str_5min/20min/60min체결강도 4종을 종목당 1콜로 60일치. - ka10003: sign(체결부호) + pri_sel/buy_bid_unit(우선호가) + cntr_trde_qty — OFI 원재료. - ka10079: OHLCV + cntr_tm(초단위) — realized skewness 원천.

F-2. 결정적 발견 — OF는 '한 덩어리'가 아니라 3층으로 갈린다

[backfill 가능 — 지금 다종목/ETF 배치 즉시]
  ka10047 체결강도 일별 60일.  AI(aggressor) 축의 일별 시계열을 종목당 1콜로 확보.
  → OHLCV처럼 과거 없는 게 아님. AI 축은 60일 backfill 됨.
  ⚠ [정정 2026-06-23] cntr_str은 '하루 전체 aggressor'가 아니라 '조회 순간(EOD면 종가
    무렵) 스냅샷'임을 실측 확인(cntr_str_semantics.py): 삼성전자 일별 75.28 = 그 순간
    최신분 75.22와 일치, 일중 평균 85와 불일치. 일별 동봉 5/20/60min도 '최근 N분 평활'.
    → 즉 MFM(종가위치)과 같은 '하루의 한 점' 한계를 공유. '진짜 aggressor지만 종가시점'.
    'MFM 문제 부분해소'라던 앞선 서술은 과대평가였음 — 둘 다 하루를 한 점으로 압축.
    하루 전체 aggressor는 1분봉 cntr_str을 장중 내내 forward 수집해야만 얻음.

[forward 누적 필요 — 당일만, 매일 EOD 긁어 저장]
  ka10003 체결(30틱) / ka10079 틱(900틱).  과거 일자로 못 넘어감(당일 장중만).
  → A1 OFI 정밀·진짜 ρ·realized skew는 '지금부터' 매일 수집해야 누적.
  → 원본 9장 "forward 필수"의 정확한 대상 = 이 두 개.

[실시간 스트림만 — REST 근사 한계]
  ka10004 호가는 '현재 10호가 스냅샷' 1개. 호가 변화 시퀀스(e_n: 취소/신규) 없음.
  → 진짜 OFI(A1 본래 정의)는 WebSocket 0D 구독으로만. REST 폴링은 1초 rate라 거침.

F-3. OF 해상도 최종 판정 (사양 본질 기준)

사양 요소 데이터 깊이 다종목/ETF 배치 판정
AI 축(체결강도) ka10047 과거 60일 ✅ 종목당 1콜 🟢 즉시 가능
OFI 근사(체결 sign) ka10003 당일 30틱 forward만 🟡 누적 필요
realized skew ka10079 당일 900틱 forward만 🟡 누적 필요
진짜 OFI(호가변화) 0D WebSocket 실시간 인프라 신설 🔴 수집기 필요

배치 규모 (OF 기준):

체결강도 일별(ka10047): 종목당 1콜 → 2290종목 = 2290초(38분) 1회 backfill, 이후 일 1콜.
                        ETF 11개 = 11초. → ETF 배치는 매일 갱신도 여유.
틱/체결(forward): 종목당 장중 다수 콜 → 다종목 비현실적. ETF 10~15개면 EOD 수집 현실적.
→ 결론: OF 미시구조까지 가면 'ETF 차원 압축'이 rate limit상 사실상 필수(D-4 재확인).

F-4. 정정 — 이전 판정에서 틀렸던 것

PART D·E는 OHLCV 프록시였고, 그것을 "렌즈 골격 검증"이라 했으나 사양의 본질(OF)은 아니었다. F에서 실측한 진짜 그림:

  • ~~AI 축(체결강도)은 backfill 60일 가능 → 즉시 업그레이드 (가장 실용적 다음 수)~~ ⚠ [철회 G-4] 체결강도 60일은 일별 '한 점'(F-2)이라 backfill 가치 없음. 종목을 줄인 목적이 '소수에 고해상도 forward'인데, 한 점 60일은 어정쩡한 중간 데이터. → forward로 1분봉/틱 체결강도를 제대로 모으는 게 맞음. backfill 단계 삭제(G-4).
  • OFI·skew·AI(하루 전체)는 forward 누적 → 선별 소수에 EOD 틱 수집기로 직행.
  • 진짜 OFI(호가변화)는 WebSocket 0D → 유일한 인프라급, 그러나 사양 A1의 정수.

PART F 한 줄 결론 [G-4 정합 정정]: "호가/OF를 쓸 수 있나"의 답은 층마다 다르다: 체결강도(AI)는 60일 backfill 되긴 하나 일별 '한 점'이라 쓸 자리 없음(G-4 삭제), 틱 기반 OFI·skew·하루전체 AI는 🟡 forward 누적(선별 소수면 EOD 현실적), 진짜 호가변화 OFI는 🔴 WebSocket 0D 수집기 신설. 데이터는 다 있다. 단 OF는 과거가 없어 — 소수 선별 후 고해상도를 지금부터 모은다.


PART 7. 분포 패러다임 — edge·cross-quantile·gross 신뢰도

PART 4의 "박스 평균(Δμ_S)" 검증을, 원전 리서치(바슐리에·소프 edge / Wasserstein / cross-quantile)와 대조하며 분포 패러다임으로 재검증한 줄기. 결론: net×gross 좌표는 유효하되, gross가 net의 신뢰도를 결정하는 비대칭이다. 공리(A1·A2·A3)는 수정 없음.

7-1. 원전 결정 논리 (리서치)

원전 분포→매매 결정 논리
바슐리에 1900 분포로 기댓값 계산. 시장가가 기댓값(공정가)과 벌어지면 행동
에드 소프 edge = 내 분포 기댓값 − 시장가. edge 있을 때만 진입. 사이징=Kelly(μ/σ²)
Wasserstein(arXiv 2110.11848) 롤링윈도 경험분포 거리. 모델프리(A3 정합). 단 진입신호는 미정의
cross-quantile(Econ Modelling 2025) 거래량→수익 인과 부호가 분위마다 갈림(점예측 아님)

→ 공통: 점예측 ✗. edge(조건부 기댓값과 기준의 괴리)로 진입. 우리 2장과 동일. 우리 출력 μ_S+U가 곧 Kelly 입력(μ/σ²). 사이징은 PM 지시로 보류.

7-2. 곁길과 철회 (정직 기록)

  • Wasserstein 분포변화량 검증(lens_distribution_shift.py): "분포가 변한 크기"를 신호로 봄 → 거의 음수. 원전 논리는 '변화량'이 아니라 'edge'였음 → 곁길, 폐기.
  • dollar bar gross 분위 검증(lens_edge_dollarbar_quantile.py): "거래량폭발 상승 =음edge, 추격금지" 결론 도출 → 철회. dollar bar는 거래대금을 균등화하므로 (amount CV 일봉 3.5 → K=2 1.5) gross가 시계로 흡수돼 그 분위는 인공물. PM 지적("거래대금으로 나눴는데 gross가 어떻게 나뉘냐")로 발각.

7-3. 확정 (lens_revalidate_gross.py, 2272종목, 5일 fwd, mu0=+0.00236)

일봉(거래폭발일 보존)에서 gross를 진짜 측정축으로 cross-quantile:

gross 상위20%(거래량多)·상승 → edge +0.00079  p=0.002  유의   ← 진입좌표
gross 중간                   → edge −0.00002  p=0.87   무의미
gross 하위20%(거래량少)·상승 → edge −0.00014  p=0.36   무의미  ← 빈 움직임
gross = net의 신뢰도 가중치 (A1 귀결, 양방향 확정): 거래량 많은 봉의 net만 유의, 적은 봉의 net은 0과 구분 안 됨. 앞 박스평균 "격렬·상승 +0.0023"과 같은 방향 — 박스평균이 틀린 게 아니라, 분위로 보니 "거래량 적은 net은 못 믿는다"는 구조가 추가로 드러남.

7-4. 진입·이탈·기여 분해 (세션 후반)

이탈 — Optimal Stopping 근사 (lens_dynamic_exit / lookahead_check / attribution): - PM 직관 "사후조정도 기댓값으로" = 학계 Optimal Stopping(갱신 continuation value가 청산가치 밑이면 이탈). 내가 쓴 고정 Triple Barrier는 학계가 'myopic'이라 비판. - 1차 검증서 동적 μ가 고정의 6.6배 → 룩어헤드 누수로 부풀려짐(A/B=1.64) → 철회. - 2x2 기여분해(중위 그룹): μ이탈이 고정20봉보다 오히려 −0.027 깎음(일찍 팔아 추세 잘림). 진입좌표 순기여 +0.001(미미). 무작위진입+고정20봉 기준선 +0.016. → 수익 대부분은 렌즈 알파가 아니라 종목·기간 상승베이스(베타)·보유효과.

렌즈의 위치 (PM 확정): - 수학적 렌즈는 단독 수익기가 아님. 재료·실적·시장과 함께 보는 여러 렌즈 중 하나. - 검증 목적 = 수익 성적표 ✗ / 논리적·정합적 일관성 ✓. 모든 상승·하락 못 맞힘(A3). - 정합성 재검증(다른 종목·기간, lens_consistency_recheck): gross_hi>gross_lo 방향성은 7/9 재현(정합), 단 통계 유의성은 작은 표본서 약화, 2/9(2020~23 전반) 역전. → 경향은 정합, 보편법칙은 아님. 보조 렌즈로서 타당.

데이터 전제: universe_ohlcv = 2020-06-01~2026-06-02 (6년 1봉, 전종목 균일). 코로나 저점 직후 시작 → 상승베이스 내재. 한 사이클(유동성→긴축→회복)만. 생존편향 가능.

7-5. 미해결 → 다음 세션

  • 🔴 OF(Order Flow) 구현 — 다음 세션 과제 (PM 지정 2026-06-23). 호가잔량비(ka10004)·체결정보(ka10003)·체결강도(ka10046/47) 래퍼 미구현. 지금까지 검증은 전부 일봉 net×gross. OF는 net·gross가 못 보는 '선행 호가압력' (체결강도=사후 한 점이 못 보는 축, PART 5 참조)을 forward 누적 수집해야 함. → 선별 소수(lens_universe: 삼성전자·하이닉스 개별 + 세분ETF)에서 WebSocket 0D 수집.
  • 호라이즌 의존성(1·10·20일) gross 신뢰도 유지 여부 미검증.
  • dollar bar gross 시계흡수: event clock과 net×gross 좌표 양립 방식 미정.
  • 레짐 분해: 6년을 유동성/긴축/회복장으로 갈라 역전(2020~23)의 정체 규명.

PART 6. 종합 결론

이 세션은 "사양이 데이터로 실현되는가, 어느 해상도까지"를 전부 실측으로 규명했다. PART A(수식 보정)는 그대로 유효. C~F의 실측을 하나로 묶은 최종 그림:

G-1. 확정된 사실 (전부 실측 근거)

질문 근거
다종목 일봉 배치? ✅ 2,290종목 API 0콜 universe_ohlcv 로컬 parquet 6년 (PART E)
일봉 렌즈 통계검정? ✅ block bootstrap+OOS 통과 300만 트레이드, p<0.0001 (PART E)
신호 부호? gross 큼·상승 +(유의)/ 적음 무의미 cross-quantile (PART 7). ※구버전 '비정상성' 결론은 수식결함으로 철회
OF/호가 데이터? API 다 있음, 층마다 backfill 다름 of_probe.py (PART F)
체결강도 해상도? 일별 60일·분단위·하루의 한 점 cntr_str_semantics.py (F-2 정정)
모든 종목 틱? ❌ 당일만, backfill 불가 ka10003/79 30~900틱 (PART F)
종합 ETF vs 개별? 개별 압도(삼성10조·하이닉스13조) individual_vs_lev.py (PART F)

G-2. 실현 가능한 렌즈의 최종 사양

관측 격자:   일봉 (확정). 틱/분봉 OF는 forward 누적만, backfill 불가.
신호 원천:   가장 깨끗한 OF가 찍히는 곳 — 거래대금 기준 선별:
             - 반도체: 삼성전자·SK하이닉스 개별주 (종합 바스켓 폐기)
             - 그 외: 거래대금 >=100억 세분 ETF (전/후공정·전력·로봇·2차전지·자동차…)
일봉 피처:   MFM(종가위치) + Amihud(저항) + cntr_str(체결강도, 단 '종가시점 한 점')
             + 일별 수급(외인/기관) + 재료 prior(에이전트 7종)
미시 정밀:   OFI·realized skew·진짜 λ = forward 수집 후 (틱은 선별 소수에만 현실적)
출력:        상태별 조건부 기댓값 μ_S (7장), 섹터/레짐 조건부 부호 (6장 비정상성)
검정:        block bootstrap(겹침 보정) + rolling OOS (A-#6, PART E에서 작동 확인)

G-3. 핵심 교훈 3가지

  1. 데이터는 병목이 아니다, 코드가 병목이다. 일봉·OF API 다 있음. 미구현 래퍼(틱/호가/ 체결강도 4종) + WebSocket 0D 수집기만 신설하면 됨. (C-5)
  2. 해상도 천장은 "일봉의 한 점". 체결강도조차 하루 전체가 아니라 종가시점 스냅샷. 하루 전체 OF는 forward 1분봉/틱 누적으로만 — 그래서 소수 선별이 필수. (F-2)
  3. 선별 기준은 시총 아닌 거래대금. 종합 바스켓(희석)·저거래 ETF 폐기. 개별 대형주와 거래대금 충분한 세분 ETF가 OF 신호 원천. 레버리지는 집행 전용(OF 오염). (PART F, G)

G-4. 다음 단계 (구현 로드맵 — forward 인프라) [정정 2026-06-23]

정정: 앞서 넣었던 "ka10047 체결강도 60일 backfill" 단계를 삭제. 이유: 종목을 줄인 목적 자체가 '소수에 고해상도 OF를 forward 수집'하려는 것인데, 체결강도 60일 backfill은 일별 '한 점'(F-2)이라 — 일봉 골격엔 이미 6년 OHLCV가 있어 너무 짧고, 고해상도 목적엔 해상도가 안 맞는 어정쩡한 중간 데이터다. 소수 선별 후엔 forward로 1분봉/틱 체결강도를 제대로 모으므로, 한 점짜리 60일 backfill은 낄 자리가 없다. (forward 쌓이기 전 임시 프록시로도 표본·해상도 부족.)

[즉시 가능, 코드만]   일봉 상태모델(A2·5·7·8) + 거래대금 선별 유니버스(lens_universe.json)
                     → 6년 OHLCV로 골격은 지금 돈다 (체결강도 backfill 불요)
[forward 수집 — 핵심] 선별 소수(삼성·하이닉스 + 세분ETF 10종)에 고해상도 OF 직행:
                     · EOD 틱(ka10079) + 체결(ka10003 sign) + 1분봉 체결강도(ka10046)
                     · 매일 누적 → 1~2달 후 OFI·realized skew·AI(하루 전체) 검정
[인프라 신설]         WebSocket 0D 호가 구독·저장 → 진짜 OFI(A1) — 사양의 정수, 최후 단계

핵심: 일봉 골격(있는 데이터)소수에 고해상도 forward(목적)0D 실시간(정수). 중간에 저해상도 backfill을 끼우지 않는다. 종목을 줄인 이유와 정합.

G-5. 생성 산출물 (이 세션)

문서:  docs/research/2026-06-23_수학적렌즈_사양서_보정판.md (본 문서, PART A~G)
스크립트: scripts/research/
  lens_etf_poc.py          ETF 일봉 렌즈 PoC (PART D)
  lens_multistock_test.py  다종목 배치+통계검정 (PART E)
  of_probe.py              OF API 깊이 실측 (PART F)
  cntr_str_resolution.py   체결강도 해상도 (F-2)
  cntr_str_semantics.py    체결강도 '한 점' 검증 (F-2 정정)
  etf_universe_probe.py    ETF 메타 가용성
  etf_select.py            섹터 ETF 선정
  etf_liquidity.py         거래대금 측정
데이터: data/research/
  lens_universe.json       ★ 확정 신호 유니버스
  etf_holdings.json / etf_granular.json  구성종목
  etf_liquidity.json / individual_vs_lev.json  거래대금
  lens_etf_poc.json / lens_multistock_test.json / of_probe.json  실측결과

세션 한 줄 결론: 수학적 렌즈는 일봉 격자에서 즉시 구현 가능하고 통계검정도 통과한다. 사양의 본질인 OF는 API에 다 있으나 과거가 없어, 하루 전체 해상도는 forward 수집이 필수다. 그래서 모든 종목이 아니라 거래대금으로 선별한 소수(삼성·하이닉스 개별 + 세분 ETF)에 OF를 집중하는 것이 유일하게 현실적인 경로다. 데이터는 준비됐고, 남은 것은 수집·저장 코드와 forward 시간이다.