# 방법론: fear-flow-v5

## 측정 대상

거래일 `t`의 KOSPI 수익률 `r_t`와 **거래대금 대비 개인 순매수 비율**인 `flow_share_t`를 사용한다. 이 값은 개인 순매수대금을 당일 KOSPI 거래대금으로 나눈 부호 있는 비율이며, 화면과 문서에서 간단히 `개인 순매수율`이라고 표시한다.

`flow_share_t = individual_net_purchase_t / KOSPI_trading_value_t`

서버가 발행하는 정식 기준 결과는 현재일을 제외한 직전 252거래일만으로 실전 후보는 Huber IRLS 강건 회귀, 감사 기준선은 OLS를 적합한다.

`flow_share_i = alpha_t + beta_t * r_i + epsilon_i`

현재 잔차는 학습 잔차의 중앙값과 MAD로 강건 표준화하고, 같은 학습 잔차에서의 경험적 백분위로 상태를 정한다. 최소 200개 완전 관측치, 음의 기울기, 0이 아닌 MAD가 필요하며 `R² < 0.20` 또는 `beta >= 0`이면 값을 표시하되 신규 거래는 만들지 않는다.

`fear-flow-v5`의 통합 사용자 시나리오는 같은 공개 일별 입력으로 회귀창 60~756거래일, 최소 R² 0~0.8(0.05 간격), 극단 꼬리 1~20%, 최대 보유 1~60거래일을 브라우저에서 다시 계산할 수 있다. 각 거래일 `t`의 회귀는 전체 공개 이력 중 `t`보다 앞선 행만 사용하며 최소 학습 관측치는 `min(lookback, max(40, min(200, ceil(lookback*0.8))))`로 결정한다. 페이지 권장 시작값 196일은 최소 157개 관측을, 서버 정식 252일 설정은 최소 200개 관측을 요구한다. 사용자가 고른 시작·종료일은 성과 평가 구간일 뿐 학습 데이터의 시작점이 아니다. 엔진은 선택 시작일 이전 구간에서도 같은 walk-forward 계산을 먼저 수행한 뒤 평가 구간을 잘라내므로, 시작일 carry-in 상태를 보존하면서도 선택 종료일 이후 데이터나 현재일을 학습에 넣지 않는다.

이 브라우저 재계산은 최신 공개 원자료로 가정을 탐색하는 **사용자 시나리오**다. 페이지는 절대수급·196일·R² 0.40·극단 2%·최대 20일·YTD·전체 사건으로 시작한다. 서버가 발행한 252일·R² 0.20·극단 5%·최대 20일의 정식 스냅샷, 사건 표본과 기본 백테스트를 덮어쓰지 않으며 공개 JSON의 정식 연구 결과로 승격되지 않는다.

아래 표는 서버 정식 5/95 상태 경계다. 페이지 사용자 시나리오는 상단의 극단 꼬리 입력값을 양쪽에 대칭 적용한다.

| 백분위 | 연구 상태 |
| --- | --- |
| 0~5 | 극단적 공포 |
| (5, 20] | 공포 |
| (20, 80) | 중립 |
| [80, 95) | 탐욕 |
| 95~100 | 극단적 탐욕 |

절대수급 OLS 비교 모델은 개인 순매수대금을 1조원 단위로 회귀한다.

`raw_flow_t = individual_net_purchase_t / 1조원`

두 입력은 같은 현상의 단순 대체물이 아니다. 절대대금은 실제 원화 순수요의 크기를, 거래대금 대비 비율은 당일 시장 활동 규모에 상대적인 개인 수급을 묻는다. 장기 시계열 비교 가능성을 위해 비율을 기본 입력으로 사용하지만, 절대대금보다 이론적으로나 실증적으로 항상 우월하다고 주장하지 않는다. 강건 회귀를 기본 후보로 둔 것도 과거 성과가 좋아서가 아니라 극단 관측이 다음 회귀선을 과도하게 당기는 영향을 사전에 줄이기 위해서다.

### 입력 정규화 감사

`fear-flow-v4` 정식 기본값의 공개 이력 완전 관측 4,070일(2010-01-05~2026-07-16)을 동일 OLS·252일 학습창으로 다시 계산한 결과는 다음과 같다. 2026년 값은 완결 연도가 아닌 7월 16일까지의 부분기간이다.

| 감사 항목 | 거래대금 대비 개인 순매수 비율 | 절대 순매수대금 | 해석 |
| --- | ---: | ---: | --- |
| 신호 산출 가능일 | 3,870 | 3,870 | 공개 상태와 재계산 상태가 양쪽 모두 3,870일 일치 |
| 음의 기울기 비율 | 100% | 100% | 두 입력 모두 개인의 동시점 역행매매 관계를 유지 |
| `R² >= 0.20` 비율 | 100% | 100% | 비율만 품질 게이트를 통과하는 것은 아님 |
| 롤링 R² 중앙값·평균 | 0.471 · 0.453 | 0.447 · 0.452 | 적합도 차이는 작음 |
| 유효 극단 상태 일수 | 447 | 538 | raw가 극단 상태를 더 자주 생성 |
| 20일 비중첩 극단 사건 | 123 | 126 | 사건 수 차이는 작음 |
| 극단적 공포 뒤 20일 평균·중앙값 | +0.18% · +0.23% | +0.36% · -0.55% | 평균과 중앙값의 우열이 엇갈림 |
| 방향 불일치 | 502/3,870 (12.97%) | 동일 | 두 모델의 공포·중립·탐욕 방향이 다를 수 있음 |
| 226490 롱/현금, 2015-08-24~2026-07-16, 10bp·청산 80 | -19.84%, 83거래 | +20.24%, 104거래 | OLS끼리 정규화만 바꾼 사후 진단 |
| 069500 롱/현금, 2010-01-04~2026-07-16, 10bp·청산 80 | -33.32%, 118거래 | -19.00%, 146거래 | 어느 입력의 보편적 성과 우월성도 입증하지 않음 |

연간 KOSPI 거래대금 중앙값은 2010년 5.58조원에서 2026년 부분기간 32.65조원으로 약 5.85배 증가했다. 같은 기간 raw의 연간 표준편차는 0.248조원에서 2.829조원으로 약 11.4배, 비율의 표준편차는 4.37%에서 7.42%로 약 1.70배 증가했다. 연도별 표준편차의 변동계수는 각각 1.177과 0.209였고, 일별 절대값과 거래대금의 Spearman 상관은 raw 0.542, 비율 0.141이었다. 따라서 거래대금 정규화가 시장 규모 의존성을 크게 줄인다는 근거는 있지만, 없애지는 않는다.

거래대금은 뉴스·변동성·시장 스트레스와 동시에 변하는 내생적 분모다. 비율은 저거래일의 수급을 확대하고 고거래일의 절대 충격을 축소할 수 있다. 실제로 거래대금 상위 25%에서 극단 상태 비율은 raw 22.59%, 비율 14.24%였고 하위 25%에서는 각각 4.81%, 7.96%였다. 2026-03-03에는 KOSPI -7.24%, 개인 +5.80조원, 비율 +10.98%였지만 raw는 극단적 탐욕(96.83), 비율은 극단적 공포(1.19)로 정반대였다. 이는 절대 수요와 거래 규모 대비 수요가 서로 다른 경제적 질문임을 보여준다.

학술 문헌에도 하나의 보편적 분모는 없다. Lo·Wang은 비교 가능한 거래활동 측정치로 turnover의 필요성을 제시했고([NBER](https://www.nber.org/papers/w7625)), Dorn·Huberman·Sengmueller는 투자자군 순매수를 전체 거래량으로 나눈 order imbalance와 발행주식수 정규화 대안을 함께 검토했다([Journal of Finance 논문](https://business.columbia.edu/sites/default/files-efs/pubfiles/1872/jofi_1334.pdf)). 반면 Chordia·Roll·Subrahmanyam은 거래량과 유동성을 통제한 뒤에도 절대 시장 order imbalance가 별도 정보를 가진다고 보고했다([Journal of Financial Economics](https://www.sciencedirect.com/science/article/pii/S0304405X02001368)). Cont·Kukanov·Stoikov는 초단기 주문장 가격 충격이 시장 depth에 반비례함을 보였지만([Journal of Financial Econometrics](https://academic.oup.com/jfec/article-abstract/12/1/47/816163)), 이는 KRX의 일별 투자자 유형별 체결대금과 같은 측정치는 아니다. Barber·Lin·Odean도 단순 비율, 표준화와 거래강도·가중 방식에 따라 retail-flow 결론이 크게 바뀔 수 있음을 보였다([JFQA](https://doi.org/10.1017/S0022109023000601)).

따라서 본 프로젝트의 `flow_share`는 미시구조 문헌의 buyer-initiated 주문흐름과 동일한 `order flow imbalance`라고 부르지 않는다. KRX 체결 후 투자자 유형별 순매수대금을 사용한 **거래대금 대비 개인 순매수 비율**이다. 기본 규모보정 모델과 절대수급 OLS 모델을 병렬 공개하고, 방향 또는 극단 진입이 다르면 `mixed`로 표시한다. 불일치 자체를 매매 금지 규칙으로 바꾸려면 별도 방법론 버전과 사전 정의된 out-of-sample 검증이 필요하다.

세 모델의 정식 최신 상태·백분위·잔차·강건 z·회귀계수·적합도·학습 표본 수·품질·거래 가능 여부를 병렬로 공개한다. 화면의 통합 입력에서 연구 트랙이나 회귀창을 바꾸면 브라우저는 공개된 수익률·수급 열로 해당 사용자 시나리오의 회귀·잔차·백분위·거래 가능 여부와 전략 경로를 walk-forward로 다시 계산한다. 이 결과에는 사용자 시나리오 표지를 붙이고 서버 스냅샷이나 정식 사건 연구로 표현하지 않는다.

산점도의 공포·탐욕 영역은 최신 회귀의 252개 학습 잔차를 정렬하고 경험적 CDF의 상태 전이 순서통계량 `q5`, `q20`, `q80`, `q95`로 정한다. 각 경계는 `flow = alpha + beta * return + q`인 회귀선 평행선이다. 정식 화면은 서버가 공개한 경계를 사용하며 반올림된 산점도 좌표로 다시 추정하지 않는다. 사용자 시나리오는 `history.json`의 원정밀도 공개 입력으로 선택 회귀창과 극단 꼬리에 맞는 잔차 경계를 별도로 계산하고 사용자 시나리오임을 표시한다. 어느 쪽이든 해당 회귀가 `unavailable`이면 영역도 표시하지 않는다.

## 사건과 전략

연속된 같은 극단 상태는 첫날만 사건으로 센다. 공급자 결측이나 `low_model_fit`은 기존 극단 상태를 리셋하지 않으므로 장애 뒤 같은 상태가 다시 나타났다고 새 사건을 만들지 않는다. 정식 기본 사건 표본은 20거래일 창이 겹치지 않게 만들고, 전체 사건은 보조로 둔다. 1·5·10·20거래일 선행수익률마다 사건 수, 평균, 중앙값, 양의 수익률 비중과 시계열 의존성을 완화한 10,000회 이동블록 bootstrap 평균 95% 신뢰구간을 공개한다. 모든 거래일의 평균 선행수익률을 무조건부 벤치마크로 두고 평균 초과수익과 그 신뢰구간을 별도로 공개한다. 이 무조건부 평균만 전달된 경우 초과수익 신뢰구간은 벤치마크 평균 추정치를 고정한 조건부 구간이며, 벤치마크 평균 자체의 추정 오차는 포함하지 않는다. `meanExcessReturnCi95BenchmarkTreatment=fixed_external_mean`으로 이를 기계 판독 가능하게 표시한다. 사건별 벤치마크 수익률을 함께 재표집한 경우에는 `paired_event_returns`, 초과수익 구간이 없으면 `unavailable`을 사용한다. 20개 미만 표본은 소표본으로 표시한다.

통합 사용자 시나리오는 동적으로 다시 산출한 극단 진입과 선택 평가기간으로 탐색용 사건 표도 함께 계산할 수 있다. 이 브라우저 표의 신뢰구간은 고정 seed의 iid bootstrap이며, 시계열 의존성을 완화한 서버 이동블록 결과와 동일하지 않다. 화면은 계산 위치와 bootstrap 방식을 구분하고, 사용자 시나리오 사건 결과를 정식 서버 사건 연구나 미래 예측력의 증거로 표현하지 않는다.

기본 롱/현금 정책은 유효한 극단적 공포 최초 진입을 확인한 다음 거래일 조정시가에 선택 페어의 롱 ETF를 매수한다. 기본 청산선은 백분위 80 회복이며, 그 신호 다음 거래일 시가 또는 진입 후 최대 20거래일 규칙에 따라 다음 시가에 청산한다. 기존 백분위 50 청산은 10bp 고정 민감도 진단으로만 남기며 결과가 좋아도 기본 규칙으로 되돌려 승격하지 않는다. 동시 포지션은 하나이고 보유 중 같은 방향의 반복 신호는 무시한다. 따라서 차트의 극단 공포 관측일 수는 실제 진입 수와 같지 않다.

신호 날짜와 체결 날짜는 합치지 않는다. `signalDate=t`는 KOSPI 종가와 수급이 확정되어 상태를 관측한 한국 거래일이고, `executionDate`는 그 뒤 처음 열리는 해당 ETF 거래일이다. 사건·신호 마커는 `t`, 진입·청산 마커와 포지션 보유 구간은 실제 익일 시가 체결일에 표시한다. 주말·휴장·프록시 세션 결측으로 두 날짜가 달라져도 달력 다음 날로 임의 이동하지 않는다.

롱/인버스/현금 정책은 같은 롱 규칙에 더해 유효한 극단적 탐욕 최초 진입을 확인한 다음 거래일 시가에 선택 페어의 인버스 ETF를 매수한다. 기본 인버스 청산선은 백분위 20 이하 회복이며 최대 보유기간은 동일하게 20거래일이다. 보유 중 반대 극단이 나타나면 다음 공통 거래일 시가에 기존 ETF를 매도하고 반대 ETF를 매수한다. 이 전환은 매도 1측과 매수 1측, 총 2측의 거래비용을 부과한다. 일반 회복 청산에는 모형 적합도가 낮아도 유효한 백분위를 사용할 수 있지만, 신규 진입·전환에는 거래 가능 품질 게이트를 요구한다. 결측 시에는 새 거래를 만들지 않고 최대 보유기간 규칙만 계속 적용한다.

실행 페어는 1X의 KODEX 200(069500)·KODEX 인버스(114800), 2X의 KODEX 레버리지(122630)·KODEX 200선물인버스2X(252670)다. 각 방향은 진입비용을 차감한 가용자본으로 해당 ETF의 양의 수량을 매수하고, 청산까지 수량을 유지한다. 조정 총수익 OHLC를 사용하므로 분할과 분배금뿐 아니라 보수·일간 재조정·선물 롤·추적차이에서 나타난 실제 경제효과가 가격 경로에 반영된다. 대차 가능 수량·리콜·공매도 증거금은 필요 없지만 시장충격과 호가 스프레드는 별도로 모형화하지 않는다. 2X는 기간수익률의 고정 ±2배가 아니라 일간 목표 ±2배 상품이며 변동성 끌림과 경로의존성이 더 크다.

| 페어 | 공포 시 보유 | 탐욕 시 보유 | 공식 상품 명세 |
| --- | --- | --- | --- |
| 1X 기본 | KODEX 200(069500) | KODEX 인버스(114800) | [069500](https://www.samsungfund.com/etf/product/view.do?id=2ETF01) · [114800](https://www.samsungfund.com/etf/product/view.do?id=2ETF20) |
| 2X 비교 | KODEX 레버리지(122630) | KODEX 200선물인버스2X(252670) | [122630](https://www.samsungfund.com/etf/product/view.do?id=2ETF25) · [252670](https://www.samsungfund.com/etf/product/view.do?id=2ETF70) |

노출도는 두 ETF의 가격과 전략 포지션을 모두 산출할 수 있는 공통 거래일 중 롱·인버스·현금 보유일 비율로 각각 공개한다. 상장 전 행이나 한쪽 가격이 없는 행을 현금으로 세지 않는다. `총 보유비율`과 `순 자본배분`은 보유기간 기준 자본 배분이며 KOSPI200 베타나 2X 배율 보정 노출이 아니다. 배율의 경제효과는 별도 배수로 근사하지 않고 실제 ETF 가격 변화로 계산한다. 편도 비용은 0·5·10·20bp 전체 격자를 공개하고 10bp를 기본으로 한다. 현금 수익률은 0%다. 1X와 2X 결과는 네 ETF의 공통 가능기간을 기본 비교 구간으로 사용한다. 50일 이격도가 과거 756거래일 하위 10%일 때만 롱 진입하는 결과는 롱/현금 강건성 변형이며 대칭적인 인버스 필터가 없으므로 롱/인버스 정책에는 적용하지 않는다. 신호 기준일 뒤의 ETF 가격은 현재 포지션이나 성과에 포함하지 않는다.

서버 검증 기본 결과는 robust 신호와 1X 실제 ETF 페어의 회귀창 252, 최소 R² 0.20, 극단 꼬리 5%, 최대 보유 20거래일, 롱 청산 80·인버스 청산 20이다. 화면의 사용자 청산 입력은 정수 50~94이며 인버스 청산선은 `100 - 롱 청산선`으로 대칭 설정한다. 50 미만은 공포에서 중립 이상으로 회복한다는 의미가 약해지고, 95 이상은 극단적 탐욕·인버스 진입 규칙과 중첩되므로 허용하지 않는다. 브라우저는 공개된 전체 일별 수익률·수급·네 ETF 조정가격을 이용해 선택한 연구 트랙, 회귀창, 최소 R², 극단 꼬리, 최대 보유기간과 청산선의 회귀·상태·포지션·손익 경로를 하나의 사용자 시나리오로 다시 계산한다. 매 거래일에는 그 전 행만 쓰며, 선택 평가기간의 종료 뒤 행은 어떤 신호에도 사용하지 않는다. 서버의 기본 사건 연구와 기본 결과는 이 동작으로 변경되지 않는다.

여러 기간과 파라미터를 반복해서 보고 가장 좋은 조합을 고르면 동일 데이터에 대한 다중검정·데이터 스누핑이 발생한다. 화면 결과는 예측력의 증명이나 자동 최적화 결과가 아니다. 후보를 선택했다면 선택에 사용하지 않은 이후 구간 또는 순차적인 walk-forward 구간에서 다시 검증하고, 선택 규칙과 시점을 기록해야 앞으로의 시장 적용 근거로 사용할 수 있다.

사용자 지정 시작·종료 기간은 신호와 포지션을 시작일에 초기화하는 새 백테스트가 아니다. 엔진은 선택한 파라미터로 시작일 이전의 전체 가용 이력부터 회귀 신호, 대기 주문, 포지션 방향, 진입가격과 최대 보유기간을 순서대로 계산한 뒤 요청 구간을 잘라낸다. 따라서 평가 시작일을 늦춰도 해당 시점의 학습창을 잘라내지 않으며, 시작 전에 진입해 구간 첫날 보유 중인 포지션은 `carry-in`으로 표시하고 임의로 현금화하거나 시작일 가격에 재진입시키지 않는다. 구간 성과곡선은 비교를 위해 구간 경계 평가액을 1로 재기준화하되 실제 진입일·거래비용·보유일수는 원래 경로를 유지한다. 거래 수는 구간 내 체결 수와 구간 시작 전 진입한 carry-in 포지션을 구분해 공개해야 한다. 요청 시작일이 휴장일이면 그 이후 첫 공통 프록시 거래일, 종료일이 휴장일이면 그 이전 마지막 공통 프록시 거래일까지 표시하며 실제 사용된 날짜를 함께 노출한다.

완결 거래 수·승률과 평가 종료일의 미청산 거래는 분리한다. `openTrade`는 실제 보유 ETF, 진입 신호일과 다음 시가 체결일, 조정 진입시가, 원래 경로의 보유 거래일, 진입 편도비용을 포함한 평가 종료일 미실현손익을 공개한다. `pendingAction`이 있으면 확인된 종가 신호와 다음 시가 행동을 우선 표시하고, 없으면 사용자 청산선 또는 최대 보유기간까지 보유 유지 조건을 표시한다. 미래 청산비용이나 종료일 이후 가격은 미실현손익에 선반영하지 않는다.

## 시간 정렬

모든 회귀 학습창은 현재일을 제외한다. ETF 체결은 신호를 종가 후 확인한 다음 거래일 조정 시가다. ETF 조정가격 세션은 전 구간 KRX 공식 거래 세션과 대조하고, 누락일 앞뒤의 조정계수가 0.5% 이내로 안정적일 때만 공식 OHLC를 같은 스케일로 보정한다. 미해결 세션이 하나라도 있으면 해당 프록시 사건 연구와 백테스트를 공개하지 않는다. Micron과 USD/KRW는 해당 KRX 거래일과 같은 날짜의 미국 세션을 쓰지 않고, 날짜 라벨이 KRX일보다 엄격히 이전인 마지막 관측만 `merge_asof`로 정렬한다.

반도체 진단은 `MU 종가 × USD/KRW`와 SK하이닉스 종가를 각각 진단창 첫 관측=100으로 지수화한다. `MU/Hynix 비율지수`와 `MU 지수 - Hynix 지수`인 상대 스프레드를 함께 공개하며, 상대 스프레드 단위는 수익률이 아니라 지수포인트다. 삼성전자·SK하이닉스의 최신 yfinance 조정종가는 같은 `dataAsOf`의 KRX Open API 원종가와 0.5% 이내일 때만 진단을 공개한다.

## 해석 한계

- 무료 데이터 공급자의 정정, 생존편향, ETF 추적오차와 체결 가정이 결과를 바꿀 수 있다.
- 실제 ETF 결과도 호가 스프레드·시장충격·세금 및 계좌별 비용을 모두 반영하지 않으므로 실제 체결성과와 다를 수 있다.
- 2X ETF는 일간 목표배율·선물 롤·변동성 끌림 때문에 장기간 KOSPI200 누적수익률의 정확한 ±2배가 아니다.
- 화면에서 여러 청산선을 탐색하면 다중검정·선택편향이 생기며, 선택한 값은 사전 정의 규칙의 검증 결과가 아니다.
- 회귀창·R²·극단 꼬리·보유기간·평가기간까지 반복 탐색하면 데이터 스누핑 위험이 더 커지며, 화면상 최고 성과는 미래 예측력의 증거가 아니다.
