개념
스토캐스틱(Stochastic)은 확률 과정(stochastic process)을 의미하는 용어에서 유래했다. 이 지표는 1950년대 후반 조지 레인(George Lane)이 개발했다. 레인은 당시 투자자들이 시장 과열 구간과 과매도 구간을 식별하는 데 어려움을 겪고 있다는 점에 착안하여 이 지표를 고안했다.
스토캐스틱은 주가의 변동성을 나타내는 지표로, 가격이 최근 거래 범위에서 어디에 위치하는지를 백분율로 표시한다. 값이 높으면(80 이상) 가격이 상승 추세에 있어 과매수 구간에 진입했음을 의미하고, 값이 낮으면(20 이하) 하락 추세에 있어 과매도 구간에 진입했음을 나타낸다.
이 지표는 %K와 %D 두 개의 라인으로 구성되어 있다. %K는 당일 가격이 최근 N일 동안의 최고가와 최저가 사이에서 어디에 위치하는지를 백분율로 보여준다. 수식은 다음과 같다:
%K = (당일 종가 – N일간 최저가) / (N일간 최고가 – N일간 최저가) x 100
%D는 %K의 이동평균선으로, %K 값의 과반응을 완화시키는 역할을 한다. 일반적으로 %D는 %K의 3일 이동평균값을 사용한다.
스토캐스틱 지표의 핵심 아이디어는 가격이 최근 고가와 저가 사이에서 어디에 위치하는지를 파악하여, 시장의 과열/과매도 상태를 판단하는 것이다. 이를 통해 주가 반전 시점을 예측하고 매매 시그널을 생성할 수 있다.
매매전략
스토캐스틱 지표를 활용한 대표적인 매매전략은 다음과 같다.
- 과매수 구간 진입 시 매도: %K 라인이 80 이상으로 상승하면 과매수 구간에 진입한 것으로 판단하여 매도한다.
- 과매도 구간 진입 시 매수: %K 라인이 20 이하로 하락하면 과매도 구간에 진입한 것으로 보고 매수한다.
- 골든크로스 및 데드크로스 활용: %K 라인이 %D 라인을 상향 가로지르면(골든크로스) 매수 시점으로, 하향 가로지르면(데드크로스) 매도 시점으로 판단한다.
파이썬 코드 예시
아래는 야후파이낸스에서 VOO ETF 데이터를 가져와 스토캐스틱 지표와 매매전략을 파이썬으로 구현한 예시 코드이다.
import yfinance as yf
import pandas as pd
def stochastic(df, k_window=14, d_window=3):
low_roll = df['Low'].rolling(window=k_window).min()
high_roll = df['High'].rolling(window=k_window).max()
k = 100 * (df['Close'] - low_roll) / (high_roll - low_roll)
d = k.rolling(window=d_window).mean()
return k, d
def stochastic_strategy(df, k, d):
buy_signals = (k.shift(1) < 20) & (k > 20)
sell_signals = (k.shift(1) > 80) & (k < 80)
golden_cross = (k > d) & (k.shift(1) < d.shift(1))
dead_cross = (k < d) & (k.shift(1) > d.shift(1))
df['Signal'] = 0.0
df['Signal'][buy_signals] = 1.0
df['Signal'][sell_signals] = -1.0
df['Signal'][golden_cross] = 1.0
df['Signal'][dead_cross] = -1.0
return df
# 데이터 로드
voo = yf.Ticker("VOO")
data = voo.history(period="max")
# 스토캐스틱 지표 계산
k, d = stochastic(data)
# 매매 시그널 생성
trading_signals = stochastic_strategy(data, k, d)
# 백테스트
trading_signals['Returns'] = trading_signals['Signal'].shift(1) * data['Close'].pct_change()
trading_signals['Strategy'] = trading_signals['Returns'].cumsum().apply(np.exp)
trading_signals['Buy_and_Hold'] = data['Close'] / data['Close'].iloc[0]
# 결과 시각화
trading_signals[['Strategy', 'Buy_and_Hold']].plot()
이 코드에서는 먼저 yfinance
라이브러리를 사용하여 VOO ETF의 역사적 데이터를 불러온다. 그 후 stochastic
함수를 통해 %K와 %D 값을 계산하고, stochastic_strategy
함수에서 구매 신호와 판매 신호를 생성한다.
매매 시그널을 활용하여 백테스트를 수행한다. 각 거래일의 수익률을 계산하고, 전략 수익률과 Buy & Hold 수익률을 비교할 수 있다. 마지막으로 결과를 시각화한다.
이 코드를 통해 스토캐스틱 매매전략의 성과를 평가하고, 실제 거래에 적용할 수 있다.