개요
Stochastic Oscillator (스토캐스틱 오실레이터)는 1957년 George C. Lane이 시카고 선물 트레이더 연구 그룹과 함께 개발한 모멘텀 오실레이터다1. 현재 종가가 최근 기간의 고저 범위(High-Low Range) 내 어디에 위치하는지를 0~100 사이의 백분율로 표현한다.
핵심 아이디어: "Momentum always changes direction before price." (모멘텀은 항상 가격보다 먼저 방향을 바꾼다) -- George C. Lane2
스토캐스틱은 두 개의 선으로 구성된다:
- %K: 메인 오실레이터 라인. 종가의 범위 내 상대 위치를 나타낸다.
- %D: %K의 단순이동평균(SMA). 시그널 라인 역할을 한다.
Lane은 1984년 TASC 기고문에서 이렇게 설명했다: "가격이 하락하면 일일 종가가 해당 범위의 저점 근처에 집중되고, 가격이 상승하면 고점 근처에 집중된다"2. 스토캐스틱은 이 경향을 수치화한 지표다.
창시자
George C. Lane(1921~2004)은 미국 일리노이주의 증권 트레이더이자 교육자로, "스토캐스틱의 아버지(Father of Stochastics)"로 불린다. 1950년대 E.F. Hutton & Co.에서 커리어를 시작했으며, 1954년 Ralph Dystant가 설립한 Investment Educators Inc.에 합류하여 기술적 분석 교육에 전념했다3.
스토캐스틱의 기원에 대해서는 학술적 논쟁이 존재한다. CMT Association의 George A. Schade Jr.(2011)가 상세히 조사한 바에 따르면, 스토캐스틱은 Lane 단독이 아니라 시카고 MidAmerica Commodity Exchange의 약 7명의 선물 트레이더 연구 그룹이 공동으로 개발한 것이다3. 이 그룹은 낮에 트레이딩하고 장 마감 후 연구를 진행했다. 공식의 원형은 그룹 멤버 중 한 명의 할아버지(체코 출신)가 철강 제조 시 석회석 배합 비율을 결정하는 공식에서 착안한 것이며, 이를 시장 데이터에 적용한 것이 스토캐스틱의 시초다.
Lane이 이 지표를 가장 널리 보급하고 대중화한 공로는 분명하며, 1957년 저작권 등록된 8페이지 교육 자료 "Stochastic Process"가 최초의 문서화된 기록이다1.
개발 동기와 시대적 맥락
1950년대 시카고 선물 시장(곡물, 금속 등)에서 트레이더들은 가격 전환 이전에 모멘텀 약화를 감지할 실용적 도구가 필요했다. Lane의 핵심 통찰은 상승 추세에서 종가가 범위의 상단에, 하락 추세에서 종가가 범위의 하단에 형성되는 경향이었다. 이 경향이 약화되는 순간 -- 즉, 가격이 신고점을 기록하지만 종가가 더 이상 범위 상단에 위치하지 않을 때 -- 이 모멘텀 약화가 곧 다가올 가격 반전을 예고한다고 보았다2.
"Stochastic"이라는 명칭은 그리스어 "stochos"(목표)에서 유래한다. Investment Educators의 교육 자료에 "stochastic process"라는 용어가 손으로 적혀 있었고, 이후 트레이딩 소프트웨어에 그 이름이 그대로 사용되었다. 확률론(stochastic process)의 수학적 의미와 직접적 관련은 약하며, 가격의 "무작위적" 위치를 측정한다는 개념적 연결이 있을 뿐이다.
컴퓨터 이전 시대에 수작업 차트 분석이 주류였던 환경에서, 단순한 사칙연산만으로 계산 가능한 스토캐스틱은 실용적 강점을 가졌다.
수학적 정의
%K 기본 공식
스토캐스틱의 핵심인 %K는 현재 종가가 최근 기간의 고저 범위 내 어디에 위치하는지를 백분율로 나타낸다2.
여기서:
- = 현재 기간의 종가 (Close)
- = 최근 기간 중 최저가,
- = 최근 기간 중 최고가,
- = 룩백 기간 (Lane 기본값: 14)
이 공식은 min-max 정규화(normalization)의 특수한 형태다. 통계학에서 변수 를 로 변환하는 min-max 정규화:
스토캐스틱은 이것을 범위로 확장하고, (종가), (기간 최저가), (기간 최고가)로 적용한 것이다.
%D (시그널 라인)
%D는 %K의 기간 단순이동평균(SMA)이다2:
여기서 = 평활 기간 (기본값: 3). Lane은 %D를 %K보다 중요한 지표로 취급했다. 매매 신호는 %K와 %D의 교차보다 %D의 다이버전스에서 나온다고 강조했다2.
3가지 변형
스토캐스틱 오실레이터는 평활화 정도에 따라 3가지 변형으로 분류된다45.
1. Fast Stochastic -- 가장 원시적인 형태. 평활화 없이 Raw %K를 직접 사용한다.
노이즈가 많아 실전에서는 거의 사용하지 않는다.
2. Slow Stochastic -- Fast %D를 한 번 더 평활한 것. 가장 널리 사용되는 표준 형태다.
기본값: , . 이중 평활(double smoothing)이 적용된 셈이다.
3. Full Stochastic -- Slow Stochastic의 일반화. 사용자가 3개 파라미터를 모두 조정할 수 있다.
파라미터: -- 각각 룩백 기간, %K 평활, %D 평활. Full Stochastic(14, 1, 3) = Fast Stochastic, Full Stochastic(14, 3, 3) = Slow Stochastic. 즉, Fast와 Slow는 Full의 특수 케이스다.
| 변형 | %K | %D | 파라미터 |
|---|---|---|---|
| Fast | Raw %K | SMA(Raw %K, 3) | (14, 1, 3) |
| Slow | SMA(Raw %K, 3) | SMA(Slow %K, 3) | (14, 3, 3) |
| Full | SMA(Raw %K, ) | SMA(Full %K, ) | (14, , ) |
단계별 계산 예시
14기간 Slow Stochastic(14, 3, 3) 계산 과정을 실제 수치로 전개한다.
Step 1: Raw %K 계산 (기간 14의 데이터가 모이면 계산 시작)
, , 이라면:
같은 방식으로 , 를 구한다.
Step 2: Slow %K 계산 (Raw %K를 3기간 SMA로 평활)
Step 3: Slow %D 계산 (Slow %K를 다시 3기간 SMA로 평활)
Slow %K가 72.52, 69.41, 73.88이면:
계산 흐름을 요약하면:
Raw %K → [SMA(3)] → Slow %K → [SMA(3)] → Slow %D
↑ ↑ ↑
민감/노이즈 많음 표준 메인 라인 시그널 라인
비유적 설명: 공과 중력
Lane 자신이 가장 즐겨 사용한 비유다2:
"공을 위로 던지면 떨어지기 전에 속도가 먼저 줄어든다." ("If you imagine a ball being thrown in the air, before the ball can turn down, it must slow down.")
가격이 상승 추세에 있을 때, 종가는 범위의 상단에 위치한다 -- 공이 올라가는 도중이다. 가격이 고점을 갱신하더라도, 종가가 범위의 중간쯤으로 내려오기 시작하면(%K 하락), 이는 공의 "속도가 줄어드는" 순간이다. 가격(공의 높이)은 아직 꼭대기에 있지만, 모멘텀(공의 속도)은 이미 감소하고 있다. 이것이 "모멘텀은 항상 가격보다 먼저 방향을 바꾼다"의 물리적 비유다.
RSI와의 수학적 차이
스토캐스틱과 RSI는 모두 0~100 범위의 모멘텀 오실레이터지만, 측정하는 대상이 근본적으로 다르다64.
| 비교 | Stochastic %K | RSI |
|---|---|---|
| 측정 대상 | 종가의 범위 내 위치 (position) | 상승/하락의 상대적 크기 (magnitude) |
| 수식 핵심 | ||
| 사용 데이터 | 고가, 저가, 종가 (HLC) | 종가만 (C) |
| 정규화 방식 | Min-max 정규화 | 비율 정규화 |
| 반응 속도 | 빠름 (Raw %K 기준) | 느림 (SMMA 평활) |
직관적으로: RSI는 "최근 줄다리기에서 상승 팀이 얼마나 이기고 있는가"를 묻고, 스토캐스틱은 "지금 가격이 최근 경기장의 어디쯤 서 있는가"를 묻는다. 따라서 같은 시점에서 RSI = 70, Stochastic = 30이 동시에 가능하다 -- 상승폭이 하락폭보다 크지만(RSI 높음), 종가가 범위의 하단에 있을 때(Stochastic 낮음) 발생하는 괴리다.
StochRSI (Chande & Kroll, 1994)
Tushar Chande와 Stanley Kroll이 1994년 The New Technical Trader에서 제안한 지표로, RSI 값에 스토캐스틱 공식을 적용한 것이다7.
RSI는 SMMA 평활 특성상 장기간 3070 사이에서 진동하며 극단값에 도달하는 빈도가 낮다. StochRSI는 RSI의 민감도를 극대화하기 위해 RSI 자체를 min-max 정규화한 것이다. 범위는 01(일부 구현에서 0~100), 과매수 0.80 이상, 과매도 0.20 이하다. 본질적으로 이중 변환(double transformation) -- 종가를 RSI로, RSI를 StochRSI로 변환 -- 이므로 원래 가격 데이터의 미세한 변동까지 증폭되어 반영된다.
특수 케이스
분모 = 0 (): 기간 동안 고가와 저가가 모두 같으면 분모가 0이 되어 정의 불가다. 대부분의 구현에서 %K = 50(중립) 또는 %K = 0으로 처리한다. 암호화폐 시장에서는 유동성이 극히 낮은 알트코인 외에는 거의 발생하지 않는다.
추세장 고착(Sticking): 강한 상승 추세에서 이면 , 강한 하락 추세에서 이면 으로 장기간 고착된다4. 이것이 스토캐스틱의 대표적 구조적 한계다.
파라미터
기본값: 14/3/3
Lane이 원래 사용한 설정이다2. 각 파라미터의 근거는 다음과 같다.
(룩백 기간): Lane은 선물 시장에서 약 28일(4주) 주기의 가격 사이클을 관측했고, 그 절반인 14일이 사이클 전환점을 포착하기에 적합하다고 판단했다. 이는 Wilder가 RSI에서 동일한 14일을 채택한 논리(28일 사이클의 반주기)와 일치한다6.
(%K 평활): 3기간은 SMA에서 최소한의 평활화를 제공하는 기간이다. 2기간은 노이즈가 많고, 5기간 이상은 전환점 인식이 과도하게 지연된다.
(%D 평활): 시그널 라인도 동일하게 3기간 SMA. %K와 %D의 교차 타이밍이 시장의 리듬과 맞도록 설계되었다.
Fast vs Slow vs Full 선택 가이드
| 유형 | 노이즈 | 지연 | 적합 용도 |
|---|---|---|---|
| Fast | 높음 | 최소 | 극단기 스캘핑, 알고리즘 트레이딩의 원시 입력값 |
| Slow | 중간 | 중간 | 가장 범용적. 일반 트레이딩, 스윙 매매 |
| Full | 조정 가능 | 조정 가능 | 특정 시장/전략에 최적화할 때 |
대부분의 트레이더에게 Slow Stochastic이 적합하다. Fast는 노이즈가 과다하여 수동 트레이딩에 부적합하며, Full은 파라미터 과적합(overfitting) 위험이 있다. Lane 자신도 후기 교육에서 Slow Stochastic을 주로 사용했다.
타임프레임별 조정
| 타임프레임 | 권장 설정 | 근거 |
|---|---|---|
| 1분~5분 | (5, 3, 3) 또는 (8, 3, 3) | 짧은 주기에서 14기간은 과도한 평활. 반응 속도 우선 |
| 15분~1시간 | (14, 3, 3) | Lane의 표준 설정이 가장 적합한 범위 |
| 4시간 | (14, 3, 3) 또는 (21, 5, 5) | 중기 스윙에서 평활 증가로 허위 신호 감소 |
| 일봉 | (14, 3, 3) | Lane의 원래 의도. 28일 사이클 반주기 |
| 주봉 | (14, 3, 3) 또는 (21, 7, 7) | 장기 사이클 포착을 위해 기간 확대 가능 |
암호화폐 시장 고려사항
암호화폐는 24시간/365일 거래되므로 전통 시장의 "14거래일 = 약 3주"라는 가정이 성립하지 않는다. 14기간은 암호화폐에서 연속 14일을 의미하며, 전통 시장 대비 약 28%의 추가 데이터를 포함한다.
| 시나리오 | 권장 설정 | 이유 |
|---|---|---|
| BTC/ETH 일봉 | (14, 3, 3) | 대형 코인은 표준 설정 유지 가능 |
| BTC/ETH 4시간봉 | (14, 3, 3) 또는 (21, 5, 5) | 6캔들/일, 노이즈 적당 |
| 알트코인 일봉 | (14, 3, 3) 또는 (10, 3, 3) | 변동성 높은 알트코인은 짧은 기간 고려 |
| 알트코인 1시간봉 | (9, 3, 3) | 빠른 반전 포착 필요 |
| 급등/급락장 | (21, 5, 5) | 평활 강화로 허위 신호 감소 |
과매수/과매도 기준을 80/20에서 85/15로 확대하여 추세장 고착 문제를 완화하는 방법도 있다4.
해석 방법
1. 과매수/과매도 영역
Lane은 80과 20을 경계값으로 설정했다2:
| 구간 | 상태 | 의미 |
|---|---|---|
| %K > 80 | 과매수 | 종가가 기간 범위의 상위 20% 이내. 상승 에너지 극대화 |
| %K 20~80 | 중립 | 방향 판단 어려움. 추가 확인 필요 |
| %K < 20 | 과매도 | 종가가 기간 범위의 하위 20% 이내. 하락 에너지 극대화 |
Lane의 원래 의도: 과매수/과매도 영역 진입 자체는 매매 신호가 아니다. 이 영역은 "설정(Setup)" 단계일 뿐이며, 실제 매매 트리거는 교차 또는 다이버전스다.
2. %K/%D 교차
Lane이 가장 중시한 신호다2:
| 신호 | 조건 | 의미 |
|---|---|---|
| 매수 (골든크로스) | %K가 %D를 아래에서 위로 교차 | 상승 모멘텀 시작 |
| 매도 (데드크로스) | %K가 %D를 위에서 아래로 교차 | 하락 모멘텀 시작 |
교차 신호의 위치가 강도를 결정한다4:
- 과매도(20 이하) 영역에서 골든크로스 = 강한 매수 신호
- 과매수(80 이상) 영역에서 데드크로스 = 강한 매도 신호
- 중립 영역(20~80)에서 교차 = 약한 신호 (단독 사용 비권장)
3. 다이버전스
1984년 TASC 기고에서 Lane은 다이버전스를 "유일하게 유효한 신호(the only signal that really matters)"로 강조했다2:
| 유형 | 가격 | %D | 의미 |
|---|---|---|---|
| 정규 상승 다이버전스 | Lower Low | Higher Low | 하락 모멘텀 약화, 반전 가능성 |
| 정규 하락 다이버전스 | Higher High | Lower High | 상승 모멘텀 약화, 반전 가능성 |
| 히든 상승 다이버전스 | Higher Low | Lower Low | 상승 추세 지속 (조정 후 재상승) |
| 히든 하락 다이버전스 | Lower High | Higher High | 하락 추세 지속 (반등 후 재하락) |
히든 다이버전스는 Lane의 원저에는 없으나, 추세 추종 전략에서 조정 구간의 재진입 타이밍을 포착하는 데 유용하다.
4. "설정(Setup)과 트리거(Trigger)" 시스템
Lane의 매매 시스템은 2단계 구조로, 설정 없이 트리거만으로 진입하는 것은 Lane의 의도와 다르다.
Bull Setup (상승 셋업):
- %D가 과매도 영역(20 이하)에 진입 -- 설정(Setup) 단계
- %D가 반등 후 다시 하락하여 두 번째 저점을 형성
- 두 번째 저점이 첫 번째보다 높음 (상승 다이버전스 형성)
- %K가 %D를 상향 교차 -- 트리거(Trigger) 단계
Bear Setup (하락 셋업):
- %D가 과매수 영역(80 이상)에 진입 -- 설정(Setup) 단계
- %D가 하락 후 다시 상승하여 두 번째 고점을 형성
- 두 번째 고점이 첫 번째보다 낮음 (하락 다이버전스 형성)
- %K가 %D를 하향 교차 -- 트리거(Trigger) 단계
5. 추세별 기준 조정
Constance Brown은 추세 방향에 따라 과매수/과매도 경계를 조정해야 한다고 제안했다:
- 상승 추세: 과매도 경계를 20 → 40으로 상향. 스토캐스틱이 40까지만 내려가도 충분한 조정으로 간주한다.
- 하락 추세: 과매수 경계를 80 → 60으로 하향. 스토캐스틱이 60까지만 올라가도 과매수로 간주한다.
이 조정은 강한 추세에서 "과매수/과매도 함정"에 빠지는 위험을 줄여준다.
6. Kaufman의 수학적 관찰
Perry Kaufman은 double-smoothed stochastics의 수학적 특성을 분석하며, 평활 기간(smoothing)을 추가할수록 신호는 안정되지만 지연이 비선형적으로 증가한다고 지적했다5. 즉, 평활 기간을 3에서 5로 늘리면 노이즈 감소보다 지연 증가의 비용이 더 커질 수 있다.
실용적 활용
매매 전략
추세 방향 매수 (Trend-Following Entry)
| 단계 | 조건 | 역할 |
|---|---|---|
| 1 | 상위 타임프레임에서 상승 추세 확인 (예: 일봉 EMA 50 위) | 추세 필터 |
| 2 | 현재 타임프레임 스토캐스틱이 과매도(20 이하) 진입 | 설정(Setup) |
| 3 | %K가 %D를 상향 교차 | 트리거(Trigger) |
| 4 | 교차 시점의 %K가 20 이상으로 회복 | 확인(Confirmation) |
다이버전스 기반 진입
- 가격이 Lower Low를 형성하는데 %D가 Higher Low → 상승 다이버전스 확인
- %K가 %D를 상향 교차 → 매수 트리거
- 가격이 직전 고점 돌파 → 최종 확인 (보수적 접근)
신호 강도 분류
| 강도 | 조건 | 신뢰도 |
|---|---|---|
| 매우 강함 | 다이버전스 + 과매수/과매도 영역 교차 + 추세 방향 일치 | 높음 |
| 강함 | 과매수/과매도 영역 교차 + 추세 방향 일치 | 중상 |
| 보통 | 과매수/과매도 영역 교차 (추세 미확인) | 중간 |
| 약함 | 중립 영역(20~80) 교차 | 낮음 |
지표 조합
RSI + Stochastic
RSI와 스토캐스틱은 모멘텀을 측정하지만 접근 방식이 다르다. RSI는 가격 변화의 크기(상승폭 vs 하락폭 비율)를, 스토캐스틱은 종가의 고저 범위 내 위치를 측정한다6. 같은 "과매수" 상태라도 두 지표가 서로 다른 계산으로 동일한 결론에 도달하면 신호의 신뢰도가 높다.
- RSI 70+ 이면서 Stochastic 80+ 이면서 %K/%D 데드크로스 → 강한 매도 신호
- RSI 30- 이면서 Stochastic 20- 이면서 %K/%D 골든크로스 → 강한 매수 신호
- 두 지표 다이버전스 동시 발생 → 매우 강한 반전 신호
EMA/MACD + Stochastic
스토캐스틱은 "언제 진입할지"(타이밍)를 알려주지만 "어느 방향으로 진입할지"(추세)에 대해서는 약하다. 추세 지표와의 조합은 "방향 + 타이밍"의 역할 분담이다.
- EMA 50/200 배열로 추세 방향 결정 후, 추세 방향과 일치하는 스토캐스틱 신호에서만 진입한다.
- MACD 히스토그램이 양수이면서 감소 중(상승 추세 조정 구간)일 때, Stochastic 과매도 골든크로스 → 조정 후 재진입 타이밍
- 핵심: 추세 반대 방향의 스토캐스틱 신호는 무시한다.
볼린저 밴드 + Stochastic
볼린저 밴드는 변동성을, 스토캐스틱은 범위 내 위치를 측정한다. 가격이 하단 밴드를 터치하면서 스토캐스틱이 과매도 골든크로스를 보이면, 변동성과 모멘텀 양쪽에서 과매도가 확인되는 이중 검증이 된다.
- 가격이 볼린저 하단 밴드 터치 + Stochastic < 20 + 골든크로스 → 매수
- 볼린저 밴드 수축(squeeze) + Stochastic 중립(40~60) → 돌파 대기 (방향 미정)
멀티 타임프레임 분석
Murphy가 강조한 하향식(top-down) 접근4:
- 일봉: 스토캐스틱 > 50 → 상승 추세 확인
- 4시간봉: 스토캐스틱이 과매도(< 20) → 조정 구간 진입
- 1시간봉: 골든크로스 발생 → 매수 진입
Williams %R과의 관계
Williams %R은 스토캐스틱 %K의 수학적 역변환이다:
| 비교 | Stochastic %K | Williams %R |
|---|---|---|
| 범위 | 0 ~ 100 | -100 ~ 0 |
| 과매수 | > 80 | > -20 |
| 과매도 | < 20 | < -80 |
학술적 검증
실증 연구 결과
Brock, Lakonishok & LeBaron (1992) -- 랜드마크 연구
DJIA 약 90년간(1897~1986) 데이터로 기술적 트레이딩 규칙을 테스트했다. 이동평균, 거래범위 돌파 등의 규칙이 랜덤워크, AR(1), GARCH-M, EGARCH 4개 귀무 모델 모두와 불일치하는 통계적으로 유의미한 예측력을 보였다8. 스토캐스틱을 직접 테스트한 것은 아니나, 기술적 분석 전반의 학술적 정당성을 부여한 최초의 대규모 실증 연구로서 이후 모든 기술적 지표 연구의 벤치마크가 되었다.
Ni, Liao & Huang (2015) -- 중국 시장
SSE 50 구성종목에서 스토캐스틱 오실레이터의 과매수 신호를 활용한 모멘텀 전략이 수익성 있음을 확인했다9. 개인 투자자가 거래량의 80%를 차지하는 중국 시장의 군집 행동(herding behavior)과 과도한 낙관주의가 모멘텀 수익의 원천으로 분석되었다.
Rosillo, de la Fuente & Brugos (2013) -- 스페인 시장
IBEX-35 기업에 RSI, MACD, 모멘텀, 스토캐스틱 4가지 규칙을 테스트한 결과, 혼재된 결과가 나왔다10. 유효성이 분석 대상 기업과 적용 지표에 따라 달랐으며, 기술적 지표의 유효성이 종목 특성에 의존한다는 실증적 근거를 제시했다.
통계적 유효성 요약
| 연구 | 시장 | Stochastic 직접 테스트 | 결과 | 거래 비용 |
|---|---|---|---|---|
| Brock et al. (1992) | DJIA | 간접 | 유의미한 예측력 | 미반영 |
| Ni et al. (2015) | SSE 50 (중국) | 직접 | 수익성 확인 | 부분 반영 |
| Rosillo et al. (2013) | IBEX-35 (스페인) | 직접 | 혼재 (종목 의존) | 반영 |
종합 판단: 스토캐스틱 오실레이터를 직접 테스트한 연구에서 양의 수익성이 확인되었으나, 모든 종목과 시장에서 일관되게 작동하지는 않는다. 거래 비용을 반영한 연구에서는 수익성이 감소하는 경향이 있으며, 다른 지표와의 조합 전략이 단독 사용보다 우수한 성과를 보이는 것이 일관되게 관찰된다.
RSI vs Stochastic: 시장 조건별 비교
| 비교 항목 | RSI | Stochastic Oscillator |
|---|---|---|
| 우수한 시장 조건 | 추세 시장 -- 추세 강도 측정에 유리 | 횡보/레인지 시장 -- 범위 내 반전 포착에 유리 |
| 신호 빈도 | 낮음 (다이버전스 빈도 적음) | 높음 (%K/%D 교차가 빈번) |
| 민감도 | 상대적으로 낮음 (평활화 효과) | 상대적으로 높음 (단기 가격 변동에 민감) |
| 적합 스타일 | 중장기 (스윙/포지션) | 단기 (데이 트레이딩/스캘핑) |
양자를 "어느 것이 더 좋은가"로 비교하는 것보다 시장 레짐에 따라 선택적으로 적용하는 것이 학술적으로 지지되는 접근법이다.
효율적 시장 가설(EMH)과의 관계
Fama(1970)의 EMH 약형(weak-form)에 따르면, 과거 가격 정보만으로는 미래 수익을 예측할 수 없다. 스토캐스틱은 순전히 과거 가격 데이터(HLC)만 사용하므로, 약형 EMH가 성립하면 무용해야 한다. 그러나 Brock et al.(1992)은 90년간의 데이터에서 기술적 규칙의 예측력을 확인했고8, Ni et al.(2015)은 시장 비효율성의 원천으로 개인 투자자의 군집 행동을 지목했다9. 이는 행동재무학(Behavioral Finance) 프레임워크 -- 과잉 반응, 군집 행동, 앵커링 -- 로 스토캐스틱의 유효성을 설명할 수 있음을 시사한다.
Lane의 "모멘텀 선행" 주장에 대한 학술적 평가
Lane의 핵심 주장인 "모멘텀은 항상 가격보다 먼저 방향을 바꾼다"에 대한 학술적 평가는 다음과 같다:
- 수학적 타당성(부분적): 가격 상승폭이 줄어들면 모멘텀(1차 미분)이 감소하고, 이것이 최종적으로 가격 반전에 선행할 수 있다. 미적분학적으로 자명하나, "항상"이 아니라 "종종" 성립한다.
- 실증적 타당성(혼재): 다이버전스가 반전에 선행하는 사례는 다수 관찰되지만, 다이버전스가 발생해도 반전이 일어나지 않는 허위 다이버전스도 빈번하다.
- Lane 자신의 보정: Lane은 자신의 "선행" 주장을 다이버전스라는 구체적 현상으로 한정하여, 과매수/과매도 단독 신호보다 모멘텀-가격 괴리를 중시했다.
암호화폐 시장 검증의 공백
현재까지 스토캐스틱 오실레이터를 암호화폐 시장에서 직접 테스트한 peer-reviewed 학술 연구는 극히 부족하다. 기존 연구 대부분은 주식 시장(미국, 중국, 스페인 등)에서 수행되었으며, 암호화폐 시장의 고유한 특성(24시간 거래, 극단적 변동성, 높은 개인 투자자 비중)을 반영한 검증이 필요하다.
한계점
1. 강한 추세장에서 과매수/과매도 함정
강한 상승 추세에서 스토캐스틱은 80 이상에 장기 체류하며, 이 구간에서 발생하는 모든 데드크로스가 매도 신호로 작동하면 수익 기회를 놓친다. 비트코인이 20% 이상 랠리하는 동안 Slow Stochastic(14,3,3)이 8595 범위에서 3주 이상 체류할 수 있다. 이 기간 동안 %K/%D 데드크로스가 23회 발생하지만, 가격은 계속 상승한다.
대안: 추세 필터(EMA, ADX)와 병행한다. ADX > 25이고 추세 방향이 확인된 상태에서는 추세 반대 방향의 과매수/과매도 신호를 무시한다. Constance Brown의 추세별 기준 조정(상승 추세 시 과매도 40, 하락 추세 시 과매수 60)을 적용한다.
2. 횡보장에서의 Whipsaw (톱날 효과)
가격이 좁은 범위에서 횡보할 때 스토캐스틱은 20과 80 사이를 빠르게 오가며 빈번한 교차 신호를 발생시킨다. 각 신호에 따라 진입하면 수수료 + 슬리피지 비용만 누적된다.
대안: 볼린저 밴드 폭(Bandwidth)이나 ATR로 변동성 수준을 확인한다. 변동성이 극히 낮은 구간에서는 스토캐스틱 신호를 무시하고, 20 이하 또는 80 이상의 극단 영역 교차만 사용한다.
3. %D Smoothing으로 인한 후행성
Slow Stochastic의 이중 평활은 노이즈를 줄이지만, 실제 가격 전환점 대비 13기간의 지연을 발생시킨다5. 4시간봉 기준 812시간, 일봉 기준 2~3일의 지연이다.
대안: 급반전 예상 구간에서 %K의 과매도 영역 진입 자체를 사전 경고로 활용하고, 가격 패턴(핀바, 엔걸핑)으로 트리거를 보완한다.
4. 거래량 미반영
스토캐스틱은 고가, 저가, 종가만 사용하며 거래량 정보를 포함하지 않는다. 높은 거래량을 동반한 진정한 모멘텀 변화와 낮은 거래량의 가격 노이즈를 구분하지 못한다.
대안: OBV(On-Balance Volume), VWAP, 또는 거래량 이동평균과 병행한다. 거래량이 동반되지 않은 스토캐스틱 신호는 신뢰도를 낮춰 평가한다.
5. 변동성 미반영
스토캐스틱의 고저 범위()는 절대적 범위만 측정하며, 그 범위가 "정상적"인지 "비정상적"인지를 판단하지 않는다. 한 캔들이 비정상적으로 큰 범위를 형성하면, 이후 14기간 동안 이 극단적 값이 범위 계산에 포함되어 스토캐스틱이 왜곡된 값을 유지할 수 있다.
대안: ATR 또는 볼린저 밴드와 함께 사용한다. 비정상적 변동성 구간(ATR이 평소의 2배 이상)에서는 스토캐스틱 신호의 신뢰도를 낮춰 평가한다.
6. 범위(Range) 의존성
스토캐스틱은 기간의 최고가와 최저가에 절대적으로 의존한다. 14기간 중 1개 캔들만 극단적으로 높거나 낮았다면, 나머지 13기간의 "정상적" 가격에 대해 왜곡된 값을 보인다. 단일 outlier 캔들이 전체 범위를 지배하는 구조적 취약점이 있다.
대안: Full Stochastic에서 %K 기간을 늘려 outlier의 영향을 희석시키거나, 극단적 캔들 이후 해당 구간에서는 신호를 보류한다.
흔한 오용
| 오용 | 교정 |
|---|---|
| 과매수 = 즉시 매도, 과매도 = 즉시 매수 | 과매수/과매도 진입은 "설정(Setup)"일 뿐이다. Lane은 교차/다이버전스를 트리거로 사용했다2 |
| 모든 %K/%D 교차를 거래 신호로 해석 | 중립 영역(20~80) 교차는 Lane이 유효한 신호로 간주하지 않았다. 과매수/과매도 영역 교차만 유효하다 |
| 추세 방향 무시 | 스토캐스틱은 타이밍 도구이지 방향 도구가 아니다. 추세 지표(EMA, MACD)로 방향을 먼저 확인해야 한다 |
| Fast Stochastic으로 수동 트레이딩 | Fast는 노이즈가 과다하다. Lane도 실제 매매에서 Slow Stochastic을 사용했다 |
| 단독 지표로 매매 시스템 구축 | 스토캐스틱은 "범위 내 위치"라는 단일 차원만 측정한다. 최소한 추세 필터 + 거래량 확인을 병행해야 한다 |
구현 예시
George Lane의 원래 공식에 충실한 TypeScript 구현이다. Full Stochastic을 기본으로 하고, Fast/Slow는 Full의 특수 케이스로 제공한다.
타입 정의
interface StochasticInput {
/** 고가(high price) 배열. 시간순 정렬 (오래된 것부터) */
high: number[];
/** 저가(low price) 배열. 시간순 정렬 */
low: number[];
/** 종가(close price) 배열. 시간순 정렬 */
close: number[];
/** %K 룩백 기간. 기본값 14 (Lane의 원래 권장값) */
period?: number;
/** %K 평활 기간. 기본값 3 (1이면 Fast %K) */
kSmooth?: number;
/** %D 이동평균 기간. 기본값 3 */
dPeriod?: number;
}
interface StochasticResult {
/** %K 값 배열 (0~100) */
k: number[];
/** %D 값 배열 (0~100). %K의 SMA */
d: number[];
/** 교차 신호 배열. 'bullish' | 'bearish' | null */
signal: Array<'bullish' | 'bearish' | null>;
}
Full Stochastic (핵심 구현)
function sma(values: number[], period: number): number[] {
const result: number[] = [];
for (let i = period - 1; i < values.length; i++) {
let sum = 0;
for (let j = i - period + 1; j <= i; j++) {
sum += values[j];
}
result.push(sum / period);
}
return result;
}
/**
* Full Stochastic Oscillator 계산.
*
* 계산 단계:
* 1. Raw %K = (C - Ln) / (Hn - Ln) x 100
* 2. Slow %K = SMA(Raw %K, kSmooth)
* 3. %D = SMA(Slow %K, dPeriod)
*
* Fast Stochastic = Full(kSmooth=1)
* Slow Stochastic = Full(kSmooth=3, dPeriod=3)
*/
function calculateStochastic(input: StochasticInput): StochasticResult {
const {
high,
low,
close,
period = 14,
kSmooth = 3,
dPeriod = 3,
} = input;
if (high.length !== low.length || low.length !== close.length) {
throw new Error(
`Array length mismatch: high(${high.length}), low(${low.length}), close(${close.length})`
);
}
if (close.length < period) {
return { k: [], d: [], signal: [] };
}
// 1단계: Raw %K 계산
const rawK: number[] = [];
for (let i = period - 1; i < close.length; i++) {
let highest = -Infinity;
let lowest = Infinity;
for (let j = i - period + 1; j <= i; j++) {
if (high[j] > highest) highest = high[j];
if (low[j] < lowest) lowest = low[j];
}
const range = highest - lowest;
if (range === 0) {
rawK.push(50); // 변동 없음: 중립
} else {
rawK.push(((close[i] - lowest) / range) * 100);
}
}
// 2단계: Slow %K = SMA(Raw %K, kSmooth)
const slowK = kSmooth === 1 ? [...rawK] : sma(rawK, kSmooth);
// 3단계: %D = SMA(Slow %K, dPeriod)
const dValues = sma(slowK, dPeriod);
// 4단계: 교차 신호 감지
const alignedK = slowK.slice(dPeriod - 1);
const signal = detectCrossover(alignedK, dValues);
return { k: alignedK, d: dValues, signal };
}
%K/%D 교차 감지
function detectCrossover(
k: number[],
d: number[]
): Array<'bullish' | 'bearish' | null> {
const signals: Array<'bullish' | 'bearish' | null> = [null];
for (let i = 1; i < k.length; i++) {
const prevKAboveD = k[i - 1] > d[i - 1];
const currKAboveD = k[i] > d[i];
if (!prevKAboveD && currKAboveD) {
signals.push('bullish'); // %K가 %D를 상향 돌파
} else if (prevKAboveD && !currKAboveD) {
signals.push('bearish'); // %K가 %D를 하향 돌파
} else {
signals.push(null);
}
}
return signals;
}
Fast/Slow 헬퍼
function calculateFastStochastic(
input: Omit<StochasticInput, 'kSmooth'>
): StochasticResult {
return calculateStochastic({ ...input, kSmooth: 1 });
}
function calculateSlowStochastic(
input: Omit<StochasticInput, 'kSmooth' | 'dPeriod'>
): StochasticResult {
return calculateStochastic({ ...input, kSmooth: 3, dPeriod: 3 });
}
StochRSI 구현 (Chande & Kroll, 1994)
interface StochRSIInput {
prices: number[];
rsiPeriod?: number;
stochasticPeriod?: number;
kPeriod?: number;
dPeriod?: number;
}
function calculateStochRSI(input: StochRSIInput): {
stochRSI: number[];
k: number[];
d: number[];
} {
const {
prices,
rsiPeriod = 14,
stochasticPeriod = 14,
kPeriod = 3,
dPeriod = 3,
} = input;
// 1단계: RSI 계산 (Wilder 방식)
const rsiValues = calculateRSI({ prices, period: rsiPeriod }).values;
if (rsiValues.length < stochasticPeriod) {
return { stochRSI: [], k: [], d: [] };
}
// 2단계: RSI에 Stochastic 공식 적용
const stochRSI: number[] = [];
for (let i = stochasticPeriod - 1; i < rsiValues.length; i++) {
const slice = rsiValues.slice(i - stochasticPeriod + 1, i + 1);
const highest = Math.max(...slice);
const lowest = Math.min(...slice);
const range = highest - lowest;
stochRSI.push(range === 0 ? 0.5 : (rsiValues[i] - lowest) / range);
}
// 3단계: %K = SMA(StochRSI, kPeriod), %D = SMA(%K, dPeriod)
const k = sma(stochRSI, kPeriod);
const d = sma(k, dPeriod);
return { stochRSI, k, d };
}
참고:
calculateRSI함수는 RSI 구현 예시(rsi.mdx)에 정의된 동일 함수를 사용한다. StochRSI의 출력 범위는 01이며, 일부 플랫폼은 0100으로 스케일링한다.
엣지 케이스
| 케이스 | 입력 | 출력 | 설명 |
|---|---|---|---|
| 빈 배열 | high: [], low: [], close: [] | k: [], d: [], signal: [] | 에러 없이 빈 결과 |
| 데이터 부족 | period=14인데 데이터 10개 | k: [], d: [], signal: [] | 최소 period개 필요 |
| 배열 길이 불일치 | high 20개, low 19개 | Error 발생 | 조기 검증 |
| High = Low | 동일 가격 반복 | %K = 50 | 분모 0 방지: 중립값 반환 |
| 연속 상승 | 종가가 항상 고점 근처 | %K → 100 | 범위 최상단 고착 |
| 연속 하락 | 종가가 항상 저점 근처 | %K → 0 | 범위 최하단 고착 |
라이브러리 비교
technicalindicators npm 패키지의 Stochastic 클래스는 Fast Stochastic만 직접 제공한다. Slow/Full Stochastic을 얻으려면 별도 SMA 적용이 필요하다.
| 항목 | 이 구현 | technicalindicators |
|---|---|---|
| 기본 출력 | Full Stochastic (kSmooth 조절 가능) | Fast Stochastic만 제공 |
| Slow %K | kSmooth 파라미터로 직접 지원 | 별도 SMA 적용 필요 |
| 분모 0 | 50 (중립) 반환 | NaN 또는 0 반환 |
| 교차 신호 | signal 배열로 자동 감지 | 미제공 |
요약
| 항목 | 내용 |
|---|---|
| 개발자 | George C. Lane (1957년, 시카고 트레이더 연구 그룹과 공동 개발) |
| 유형 | 모멘텀 오실레이터 |
| 범위 | 0 ~ 100 |
| 구성 | %K (메인 라인) + %D (시그널 라인) |
| 기본 파라미터 | 14, 3, 3 (룩백, %K 평활, %D 평활) |
| 과매수 | 80 이상 |
| 과매도 | 20 이하 |
| 변형 | Fast / Slow / Full / StochRSI |
| 주요 신호 | %K/%D 교차, 다이버전스, Bull/Bear Setup |
| 적합한 시장 | 횡보/레인지장 (추세장에서 약함) |
| 핵심 원리 | "모멘텀은 항상 가격보다 먼저 방향을 바꾼다" (Lane) |
| 권장 조합 | RSI, EMA/MACD (추세 필터), 볼린저 밴드 (변동성 확인) |
| 원저 | Lane (1957) Stochastic Process, Lane (1984) TASC 기고 |
Footnotes
-
Lane, G.C. (1957). Stochastic Process. Investment Educators Inc. 미출판 교육 자료, 8페이지. ↩ ↩2
-
Lane, G.C. (1984). Lane's Stochastics. Technical Analysis of Stocks & Commodities, Vol. 2, No. 3, pp. 87-90. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Schade, G.A. Jr. (2011). The Origins of the Stochastic Oscillator. CMT Association. ↩ ↩2
-
Murphy, J.J. (1999). Technical Analysis of the Financial Markets. New York Institute of Finance. ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Kaufman, P.J. (2013). Trading Systems and Methods, 5th Ed. Wiley. ↩ ↩2 ↩3
-
Wilder, J.W. Jr. (1978). New Concepts in Technical Trading Systems. Trend Research. ↩ ↩2 ↩3
-
Chande, T.S. & Kroll, S. (1994). The New Technical Trader. Wiley. ↩
-
Brock, W., Lakonishok, J., & LeBaron, B. (1992). Simple Technical Trading Rules and the Stochastic Properties of Stock Returns. The Journal of Finance, Vol. 47, No. 5, pp. 1731-1764. DOI: 10.1111/j.1540-6261.1992.tb04681.x ↩ ↩2
-
Ni, Y., Liao, Y.C., & Huang, P. (2015). Momentum in the Chinese Stock Market. Emerging Markets Finance and Trade, Vol. 51, S1, pp. S99-S110. DOI: 10.1080/1540496X.2014.998916 ↩ ↩2
-
Rosillo, R., de la Fuente, D., & Brugos, J.A.L. (2013). Technical Analysis and the Spanish Stock Exchange. Applied Economics, Vol. 45, No. 12, pp. 1541-1550. DOI: 10.1080/00036846.2011.631894 ↩