안녕하세요. 지식공유투자자 인천고래입니다.
오늘은 파이썬을 이용한 스토캐스틱 오실레이터 지표 차트 만들기라는 주제로 스토캐스틱 오실레이터를 만들기 위한 파이썬 코드에 대해 알아보겠습니다.
확률론은 내부 구조가 복잡하기 때문에 먼저 확률론에서 사용하는 변수에 대한 이해와 그 생성 원리에 대해 설명하겠습니다.
1. 확률론의 이해
Stochastic은 주가의 상대적 위치를 통해 과매수/과매도 상황을 판단하는 데 사용되는 보조 지표입니다.
%K, %D, %J의 세 가지 값으로 구성되며 각각의 의미는 다음과 같습니다.
- %K(확률적 %K): 주가의 상대적 위치를 나타내는 값에서, 주어진 기간 동안의 최고 및 최저 가격을 기준으로 백분율로 표시되는 현재 종가입니다.보지마.
%K 값이 80 이상이면 과매수 상황, 20 미만이면 과매도 상황으로 판단할 수 있습니다. - %D(확률적 %D): m-day 이동 평균 %K, 라인 스무딩 %K%D 값은 %K 값의 추세를 식별하는 데 도움이 되며 %K와 %D의 교차점에서 매수/매도 신호가 발생할 수 있습니다.
%K가 %D 위로 교차하면 매수 신호가 발생하고 %K가 %D 아래로 교차하면 매도 신호가 발생합니다. - %J (확률적 %J): t-일 이동 평균 %D, 라인 %D가 더 부드러워짐%J 값은 시간 경과에 따라 %D 값의 추세를 파악하는 데 도움이 되며 %J 값은 %K와 %D의 교차점을 확인합니다. %J 판독값은 보다 강력한 매수/매도 신호를 제공할 수 있습니다.
계산 방법은 다음 코드에서 자세히 설명합니다. 참고하십시오.
2. 코드 실행 결과 화면
아래와 같은 확률적 출력을 생성하려면 다음 항목을 사용해야 합니다.
- 데이터 : FinanceDataReader로 데이터를 가져옵니다. (DB를 사용하는 경우 해당 DB로 가져오거나 Excel 파일인 경우 Excel로 가져오는 기능을 사용할 수 있습니다.
- 차트 작성 : Matplotlib 라이브러리를 이용하여 아래와 같이 주가 데이터와 확률지표 차트를 구현하였습니다.
- 매개변수 : 아래에 입력박스와 버튼을 생성하여 파라메터 값을 입력받아 스토캐스틱 차트를 변동시킬 수 있습니다.


Stochastic은 또한 각 요소에 대해 다른 값을 사용할 때 더 정확합니다.
기존 HTS와 마찬가지로 사용자가 직접 매개변수 값을 입력할 수 있어 값 변경 및 원하는 값 찾기가 용이하다. 원하는 기간을 입력 후 버튼을 클릭하면 아래 스토캐스틱 차트에 해당 값이 표시됩니다.
3. Python을 사용하여 차트에 확률 지표 추가
다음 코드를 실행하면 주가 데이터 차트 또는 확률 차트가 생성됩니다.
코드는 이전에 작성한 RSI와 크게 다르지 않으며,
두 개의 차트를 만들어야 하므로 Subplots를 2.1로 설정하여 위쪽과 아래쪽 두 개의 차트가 표시되도록 했습니다.
또한 확대 시 두 다이어그램이 함께 확대되도록 sharex=True를 설정합니다.
# 2023년 3월 20일 인천고래 (상업적 이용을 금지합니다.)
# ============================================================
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.widgets import TextBox, Button
import FinanceDataReader as fdr
import matplotlib.font_manager as fm
# 사용 가능한 한글 폰트 목록을 확인합니다.
for font in fm.fontManager.ttflist:
if 'Nanum' in font.name:
print(font.name)
# 사용할 한글 폰트를 설정합니다.
plt.rcParams('font.family') = 'Malgun Gothic'
def compute_stochastic_oscillator(data, n=14, m=3, t=3):
low_min = data('Low').rolling(window=n).min()
high_max = data('High').rolling(window=n).max()
K = (data('Close') - low_min) / (high_max - low_min) * 100
D = K.rolling(window=m).mean()
J = D.rolling(window=t).mean()
return K, D, J
def onclick(event):
input_n = int(text_box_n.text)
input_m = int(text_box_m.text)
input_t = int(text_box_t.text)
K, D, J = compute_stochastic_oscillator(df, input_n, input_m, input_t)
ax2.clear()
ax2.plot(df.index, K, label="%K")
ax2.plot(df.index, D, label="%D")
ax2.plot(df.index, J, label="%J")
ax2.legend()
plt.draw()
stock_code="005930"
df = fdr.DataReader(stock_code)
fig, (ax1, ax2) = plt.subplots(2, 1, gridspec_kw={'height_ratios': (3, 1)}, sharex=True)
ax1.plot(df.index, df('Close'))
K, D, J = compute_stochastic_oscillator(df)
ax2.plot(df.index, K, label="K")
ax2.plot(df.index, D, label="D")
ax2.plot(df.index, J, label="J")
ax2.legend()
plt.subplots_adjust(bottom=0.2)
axbox_n = plt.axes((0.1, 0.05, 0.1, 0.075))
axbox_m = plt.axes((0.3, 0.05, 0.1, 0.075))
axbox_t = plt.axes((0.5, 0.05, 0.1, 0.075))
axbox_button = plt.axes((0.7, 0.05, 0.1, 0.075))
text_box_n = TextBox(axbox_n, 'n (기간)', initial="14")
text_box_m = TextBox(axbox_m, 'm (%D)', initial="3")
text_box_t = TextBox(axbox_t, 't (%J)', initial="3")
button = Button(axbox_button, 'Apply')
button.on_clicked(onclick)
plt.show()
그리고 버튼을 클릭하면 차트를 다시 그리기 위해 onclick 함수를 호출하는 코드를 작성합니다.
차트를 확대한 상태에서 파라미터 값을 변경해도 차트에 잘 반영됩니다.
코드에 오류가 있으면 알려주세요. 반영하여 다시 업로드 하겠습니다. ^^
4. 확률적 생성 코드 설명
확률적 함수는 지정된 주가 데이터와 기간(일수)을 인수로 받아 값을 계산하여 반환합니다.
함수의 구조는 다음과 같습니다.
def compute_stochastic_oscillator(data, n=14, m=3, t=3):
low_min = data('Low').rolling(window=n).min()
high_max = data('High').rolling(window=n).max()
K = (data('Close') - low_min) / (high_max - low_min) * 100
D = K.rolling(window=m).mean()
J = D.rolling(window=t).mean()
return K, D, J
위의 함수를 함수별로 분류하기 위해 다음과 같은 과정을 통해 확률론을 계산한다.
- 최저 가격 계산: min()을 사용하여 주어진 기간(n일) 동안 최저 가격을 찾습니다.
- 최고 가격 계산: 주어진 기간(n일) 동안 최고 가격을 얻으려면 max()를 사용하십시오.
- 확률적 %K 계산: (data(‘Close’) – low_min) / (high_max – low_min) * 100으로 확률적 %K를 계산합니다.
- 확률적 %D 계산: K.rolling(window=m).mean()으로 확률적 %D를 계산합니다.
- 확률적 %J 계산: D.rolling(window=t).mean()으로 확률적 %J를 계산합니다.
5. 종료
오늘 저는 FinanceDataReader로 데이터를 로드하고 있습니다. matplotlib 라이브러리를 사용하여 주가 차트를 만들고 확률 지표를 추가하는 코드를 작성했습니다.
스토캐스틱은 RSI 생성 코드보다 조금 더 어려워 보일 수 있지만,
기본적으로 최고값과 최저값을 찾아 %K 값을 도출한 후 이동평균선을 만드는 과정은 두 단계를 거쳐야 합니다.
특별히 어려운 코드는 없는 것 같습니다.
파이썬 코드로 작성한 이유는 거래 확률을 높이기 위함입니다.
확률을 높이려면 먼저 분석하려는 매매기법의 기초가 되는 보조지표나 목표지표를 코딩해야 합니다. 관심있는 분들의 많은 이용 바랍니다.
오늘 제 글을 읽어주신 모든 분들께 감사의 말씀을 전하고 싶습니다. 감사해요
