본문 바로가기
파이썬 (투자분석용)/Pandas 및 python 일반

[python] Stochastic 오실레이터 그리기

by amAToRoi 2022. 3. 11.
반응형

스토캐스틱(Stochastic) 말고도 다양한 오실레이터(oscillator)가 있다. 오실레이터가 익숙한 사람들은 보통 공대생일 텐데, 오실레이터란 표현을 주가 분석에서 쓰는 이유는 공대의 그것과 동일한 의미를 가지기 때문이다.

오실레이터란 반복적이고 주기적인 신호를 생성하는“진동자”

 

주가는 투자의 심리적 요인으로 가만히 있질 못하고 오르내리는 성향이 있다. 그 성질이 크기도 하고 작은 경우도 있지만, 많은 투자자들은 소위 “발라먹는다”라며 올랐을 때 팔고 내려왔을 때 사서 이익을 극대화하기 위해 주가의 변동을 측정하려는 시도를 했다. 달리말하자면, 투자가 몰린 과매수 상태와 과매도 상태를 확인하기 위한 시도로 오실레이터가 등장하였다.

Stochastic Ocillator란 그 중 가장 빨리 태어난 측정방법 중 하나이다.
물론, 그렇다고 가장 잘 맞는다는 것은 아니다.

오실레이터가 하나가 아닌 이유는, 아직까지는 공식처럼 모든 종목에 대입되는 것이 아니기 때문에 측정 시도가 끊임이 없기 때문이다. 즉, 오실레이터만 믿고 맹목적으로 투자하는 사람은 없길 바란다.

Stochastic Ocillator

스토캐스틱 오실레이터란, 최근 N일간의 종가 중 오늘 종가가 어느 위치에 있는지를 의미한다.
최저가라면 0 %를, 최고가라면 100 %를 의미한다.
수식으로 쓰자면, 스토캐스틱 N = %K = (오늘 종가 - N일 중 최저가) / (N일 중 최고가 - N일 중 최저가).

%D 라고도 표현하는 Slow %K 는 %K의 m일 간 이동평균임으로, 조금 늦게 반응하는 지표라고 보면 된다.

Slow Stochastic Ocillator

실질적으로 사용되는 스토캐스틱 오실레이터로, 상술한 %D와 다르다.

상술한 %K와 %D가 너무 빨리 움직여서 실제 신호인지 단순한 이레귤러인지 알지 못해서, 더 느리게 반응하도록 각각의 %D와 %D에 t일 간의 이동평균을 더 한 값이다. 일반적으로는 바로 Slow Stochastic을 사용한다.

흔히 사용하는 값은, N = 15, m = 5, t = 3 이다. 물론, 어떤 값이 더 특정 시점에 특정 종목과 맞을 지는 각자가 판단할 일이다.

코드에의 적용

def AddStochastic(priceData, period = 15, screen_window = 5, slow_window = 3):
    ndayhigh = priceData['High'].rolling(window = period, min_periods = 1).max()
    ndaylow  = priceData['Low'].rolling(window = period, min_periods = 1).min()
    fast_k   = (priceData['Close'] - ndaylow) / (ndayhigh - ndaylow) * 100
    fast_d   = fast_k.rolling(window = screen_window).mean()
    slow_k   = fast_k.rolling(window = slow_window).mean()
    slow_d   = fast_d.rolling(window = slow_window).mean()
    return priceData.assign(slow_k = slow_k, slow_d = slow_d).dropna().copy()

priceData는 일자별 Date(날짜)를 인덱스로 가지고 Open(시가), High(고가), Low(저가), Close(종가)의 컬럼을 가지는 pandas의 DataFrame이다.

2행: 최근 N 일간(rolling 함수와 period)의 최고가(max())를 구하고,
3행: 최근 N일간의 최저가(min())을 구한다.
4행: Fast %K 값을 스토캐스틱 정의에 따라 구하고,
5행: Fast %D, Fast %K의 m 일간(screen_window) 이동평균을 구한다.

6행과 7행은 위에서 구한 %K와 %D에 t일간(slow_window)의 이동평균을 더한 슬로우 스토캐스틱 오실레이터이다.

내가 짠 함수에서는 슬로우 스토캐스틱 오실레이터만 추가하여 반환함을 주의하자.

적용예

전체코드는 아래와 같으며, 기초 데이터셋(csv 파일)은 첨부파일을 활용하였다. 코드에는 경로를 포함하였기에, 기초 데이터셋의 구조와 값을 알고싶다면 활용하기 바란다.

stock_price.csv
0.01MB

import plotly.graph_objects as go
import pandas as pd

# 앞서 작성한 사용자 함수
def AddStochastic(priceData, period = 15, screen_window = 5, slow_window = 3):
    ndayhigh = priceData['High'].rolling(window = period, min_periods = 1).max()
    ndaylow  = priceData['Low'].rolling(window = period, min_periods = 1).min()
    fast_k   = (priceData['Close'] - ndaylow) / (ndayhigh - ndaylow) * 100
    fast_d   = fast_k.rolling(window = screen_window).mean()
    slow_k   = fast_k.rolling(window = slow_window).mean()
    slow_d   = fast_d.rolling(window = slow_window).mean()
    return priceData.assign(slow_k = slow_k, slow_d = slow_d).dropna().copy()

# 데이터셋 불러오기
pdata = pd.read_csv('https://blog.kakaocdn.net/dn/blX7fr/btrvI3Zi255/BQn2ZUrdCff0gjuHkbppu0/stock_price.csv?attach=1&knm=tfile.csv')

# 스토캐스틱을 데이터셋에 추가하기, 위에서 작성한 사용자함수를 활용
pdata = AddStochastic(pdata, 15, 5, 3)

# plotly로 그리기
fig = go.Figure()
fig.add_trace(go.Scatter(x=pdata.index, y=pdata['slow_k'], name = 'Slow %K'))
fig.add_trace(go.Scatter(x=pdata.index, y=pdata['slow_d'], name = 'Slow %D'))
#fig.show()
반응형

댓글