본문 바로가기

Python/Investment

Python으로 스토캐스틱 계산 및 차트 생성

반응형

Python으로 스토캐스틱 계산 및 차트 생성

이번 포스트에서는 Python으로 주식 보조 지표 중 하나인 스토캐스틱을 계산하고 차트를 생성해보는 시간을 가져보고자 한다.
스토캐스틱이 무엇인지 간단하게 같이 알아보고 Python 코드로 구현해보자.

목차

스토캐스틱(Stochastic)이란?

✔ 스토캐스틱

스토캐스틱은 주식, 선물 등의 금융 시장에서 가격의 상대적 위치를 판단하기 위해 사용되는 모멘텀 보조지표이다.
이 지표는 현재 가격이 최근의 가격 범위 내에서 어디에 위치하는지를 표현함으로써 과매수나 과매도 영역을 확인하는 데 도움을 준다.

일정 기간 동안 최고가와 최저가 사이에서 현재의 주가 위치를 백분율로 표시한다.
최고가에 주가가 가까워지면 지표 값은 100에 가까워지고, 최저가에 가까워지면 지표 값은 0에 가까워진다.

스토캐스틱은 크게 두 가지 버전이 있는데, Fast 스토캐스틱과 Slow 스토캐스틱이 있다.


스토캐스틱


스토캐스틱의 HTS/MTS 설정 방법 및 매매 방법은 아래 포스트에서 확인 부탁드린다.

스토캐스틱 계산 방법

스토캐스틱은 %K와 %D 라는 두 가지 주요 선으로 구성된다.

✔ Fast %K

\( \text{Fast %K}=(\frac{\text{당일종가}-\text{n일 중 최고가}}{\text{n일 중 최고가}-\text{n일 중 최저가}})\times100 \)

%K는 주가가 지정된 기간 동안의 가격 범위 내에서 어디에 위치하는지를 나타내는 값이다.
이 계산을 통해 얻은 값은 0에서 100 사이의 값이며, 현재 가격이 지정된 기간의 고점에 가까울수록 100에 가깝고, 저점에 가까울수록 0에 가까워진다.
n은 일반적으로 14일로 설정된다.


✔ Fast %D

\(\text{Fast %D}=\text{m일 동안의 Fast %K의 이동평균} \)

%D는 %K의 이동평균 값으로, 일반적으로 %K의 3일 이동평균으로 계산된다.
%D는 %K의 움직임을 부드럽게 만들어, 거래 신호를 더 명확하게 만들어 준다.


여기까지의 계산 방법이 Fast 스토캐스틱이다.
Slow 스토캐스틱은 추가로 아래와 같이 계산하면 된다.


✔ Slow %K

\(\text{Slow %K}=\text{Fast %D} \)

Slow %K는 Fast %D와 동일하다.
즉, Fast %K의 3일 이동평균이다.


✔ Slow %D

\(\text{Slow %D}=\text{m일 동안의 Slow %K의 이동평균} \)

Slow %D는 Slow %K의 3일 이동평균이다.


Fast 스토케스틱은 가격 변동에 더 민감하게 반응하므로 많은 거래 신호를 생성하지만, 이로 인해 거짓 신호가 더 많이 발생할 수 있다.
반면 Slow 스토케스틱은 덜 민감하므로 더 적은 거래 신호를 생성하지만, 이는 더욱 안정된 결과를 가져올 수 있다.

Fast 스토캐스틱 Python으로 구현

이제 Python으로 스토캐스틱을 구현해보자.
스토캐스틱을 계산하기 위해 pandas 라이브러리를 사용할 것이며, 차트 생성은 matplotlib를 사용할 것이다.
샘플 데이터는 아래와 같다.

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.dates import DateFormatter
import matplotlib.patches as patches

df = pd.read_csv('../TEST.csv')
df['date'] = pd.to_datetime(df['date'])

샘플 데이터


우선 Fast 스토캐스틱의 %K와 %D를 계산해보자.
스토캐스틱을 계산하기 위해서는 종가(close), 최고가(high), 최저가(low)가 필요하다.
%K는 14일 동안의 최저가와 최고가를 계산해야한다.
그리고 위에 작성한 공식대로 코드를 작성하면 아래와 같다.

# Fast %K 계산
N = 14
df['Lowest_N_Days'] = df['low'].rolling(window=N).min()
df['Highest_N_Days'] = df['high'].rolling(window=N).max()
df['%K'] = (df['close'] - df['Lowest_N_Days']) / (df['Highest_N_Days'] - df['Lowest_N_Days']) * 100

%K를 계산했으니 이제 %D를 계산하면 되는데, %D는 %K의 3일 이동평균이므로, 아래와 같이 코드를 작성하면 된다.

# Fast %D 계산
df['%D'] = df['%K'].rolling(window=3).mean()

계산한 결과를 확인해보면 아래와 같다.

df[['date', '%K', '%D']]

Fast %K, Fast %D



이제 Fast %K와 Fast %D를 계산했으니 해당 데이터로 차트를 생성해보자.
일반적으로 %K가 20 미만이면 과매도 영역, 80 이상이면 과매수 영역으로 판단한다.
%K가 20 미만일 경우 배경색을 파란색으로, 80 이상이면 주황색 배경으로 적용해보자.

# date 컬럼을 date 포맷으로 변경
df['date'] = pd.to_datetime(df['date'])

# figure 생성
fig, ax = plt.subplots(figsize=(14, 7))

# %K 와 %D plot 생성
ax.plot(df['date'], df['%K'], color='darkorange', label='%K')
ax.plot(df['date'], df['%D'], color='purple', label='%D')

# 20 과 80의 수평선 생성
ax.axhline(20, color='grey', linestyle='--')
ax.axhline(80, color='grey', linestyle='--')

# %K의 값이 20 이하일 때와 80 이상일 때의 배경색 설정
ax.fill_between(df['date'], df['%K'], 20, where=(df['%K'] <= 20), facecolor='lightblue', interpolate=True)
ax.fill_between(df['date'], df['%K'], 80, where=(df['%K'] >= 80), facecolor='peachpuff', interpolate=True)

# title과 labels 설정
ax.set_title("Fast Stochastic Oscillator")
ax.set_xlabel("Date")
ax.set_ylabel("Value")
ax.legend(loc='upper left')

# x-axis를 월단위로 변경
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
plt.tight_layout()

plt.show()

결과를 출력해보면 아래와 같다.

Fast 스토캐스틱 차트

Slow 스토캐스틱 Python으로 구현

Fast %K와 Fast %D를 구했다면 Slow %K, Slow %D는 간단하게 구할 수 있다.
우선 Slow %K는 Fast %D와 동일한 값이다.
그리고 Slow %D는 Slow %K의 3일 이동평균으로 구할 수 있다.

# Slow %K = Fast %D
df['Slow_%K'] = df['%D']

# Slow %D는 Slow %K의 3일 이동 평균
df['Slow_%D'] = df['Slow_%K'].rolling(window=3).mean()

Slow %K와 Slow %D를 출력해보면 아래와 같다.

df[['close', 'Slow_%K', 'Slow_%D']]

Slow 스토캐스틱


차트는 Fast 스토캐스틱 차트를 구현한 코드에서 값만 Slow 데이터로 변경하면 된다.

# date 컬럼을 date 포맷으로 변경
df['date'] = pd.to_datetime(df['date'])

# figure 생성
fig, ax = plt.subplots(figsize=(14, 7))

# %K 와 %D plot 생성
ax.plot(df['date'], df['Slow_%K'], color='darkorange', label='Slow %K')
ax.plot(df['date'], df['Slow_%D'], color='purple', label='Slow %D')

# 20 과 80의 수평선 생성
ax.axhline(20, color='grey', linestyle='--')
ax.axhline(80, color='grey', linestyle='--')

# Slow %K의 값이 20 이하일 때와 80 이상일 때의 배경색 설정
ax.fill_between(df['date'], df['Slow_%K'], 20, where=(df['Slow_%K'] <= 20), facecolor='lightblue', interpolate=True)
ax.fill_between(df['date'], df['Slow_%K'], 80, where=(df['Slow_%K'] >= 80), facecolor='peachpuff', interpolate=True)

# title과 labels 설정
ax.set_title("Slow Stochastic Oscillator")
ax.set_xlabel("Date")
ax.set_ylabel("Value")
ax.legend(loc='upper left')

# x-axis를 월단위로 변경
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)
plt.tight_layout()

plt.show()

Slow 스토캐스틱 차트

Python으로 Fast 스토캐스틱과 Slow 스토캐스틱을 계산하고 차트를 생성해보는 시간을 가졌다.
필자의 경우 스토캐스틱보다 RSI를 더 많이 사용하는 편이라 스토캐스틱은 계산 방법을 잊고 있었는데, 이번에 포스트를 작성하면서 확실하게 다시 알고 가게 되어 뿌듯하다.
이렇게 직접 계산해보면서 차트를 생성해보니 확실히 기억에도 잘 남는 것 같다.

커피 한 잔으로
저를 응원해주세요!
반응형

loading