[Python] pandas 주식정보로 스토캐스틱(Stochastic Oscillator) 구하기
https://wendys.tistory.com/174 - pandas_datareader를 이용하여 주식 데이터 가져오기! Yahoo Finance
Stochastic Oscillator 개념
스토캐스틱은, 최근 N일간의 최고가와 최저가의 범위 내에서 현재 가격의 위치를 표시할 때, 매수세가 매도세보다 강할 때는 그 위치가 높게 형성되고, 매도세가 매수세보다 강할 때는 그 위치가 낮게 형성된다는 것을 이용한 것이다.
예를 들어 최근 5일간 최고가가 15,000원이고 최저가가 10,000원인 주식이 있을때, 현재가가 14,000원이라면 매수세가 강하여 오르는 추세임을 알 수 있다. 만일 현재가가 11,000원이라면 매도세가 강하여 내리는 추세임을 알 수 있다.
예를 들어 최근 15일 중 최고가가 15,000원이고 최저가가 10,000원이며 현재가격이현재 가격이 14,000원이라면, 스토캐스틱 값은 80%가 된다. 고가가 15,000원이고 저가가 10,000원이며 현재 가격이 11,000원이라면, 스토캐스틱 값은 20%가 된다.
스토캐스틱 값의 범위는 항상 0~100% 사이가 된다. 100%라면 현재 가격이 N일간 최고가이므로 매수세가 가장 강한 경우가 되며, 0%라면 현재 가격이 N일간 최저가이므로 매도세가 가장 강한 경우가 된다.
https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%86%A0%EC%BA%90%EC%8A%A4%ED%8B%B1 - WIKI
스토캐스틱에는 Fast Stochastic과 Slow Stochastic이 존재합니다.
Fast Stochastic은 그래프의 변화가 너무 잦고 급격하여 노이즈 즉 가짜 신호가 많아 매수 매도시 참고하기 어렵다는 문제점이 있기 때문에 일반적으로 Slow Stochastic을 사용합니다.
Fast Stochastic 공식
- Fast %K = ((현재가 - n기간 중 최저가) / (n기간 중 최고가 - n기간 중 최저가)) * 100
- Fast %D = Fask %K의 m기간 이동평균(SMA)
%K를 계산할 때 n기간 값을 5를 사용하고, m과 t기간 값은 3일을 사용하는 것이 일반적입니다. n기간을 10으로 사용하면 m과 t기간 값은 6으로 배수로 설정해서 활용하는 것이 좋습니다.
Slow Stochastic 공식
- Slow %K = Fast %K의 m기간 이동평균(SMA)
- Slow %D = Slow %K의 t기간 이동평균(SMA)
Slow Stochastic에서는 n(5)-m(3)-t(3) 공식이 가장 많이 사용되며, 이 값은 임의로 조절하여 사용할 수 있습니다.
예를 들어 대부분 증권사에서는 n(5)-m(3)-t(3)를 사용하고 네이버금융은 n(15)-m(5)-t(3)을 이용하고 있습니다.
위의 Fast %K (K), Slow %K (D), Slow %D (J) 를 K, D, J라고 표현하기도 하며, 그렇기 때문에 Slow Stochastic을 KDJ Stochastic 지표라고 부르기도 합니다.
이런 점에 착안하여 스토캐스틱 %K선과 %D선을 이용한 매매 기법이 있습니다.
과매수, 과매도의 구역을 설정하여 스토캐스틱이 80 이상일 때 과매수 상태, 20 이하일 때 과매도 상태로 판단하여 시장 가격이 과매수 상태에 들어서면 하락의 가능성이 커지고, 반대로 과매도 상태에 들어서면 상승의 가능성이 커지는 것을 이용한 매매법 기법이 있습니다.
여기서 %K선과 %D선이 교차하는 순간을 매매 시점으로 판단하여 오류를 최대한 줄이도록 하는 게 중요합니다.
스토캐스틱 20 이하에서 %K선이 %D선을 상향 돌파하면 골든크로스라고 하여 매수 관점으로 접근할 수 있고,
스토캐스틱 80 이상에서 %K선이 %D선을 하향 돌파하면 데드크로스라고 하여 매도 관점으로 바라볼 수 있습니다.
그렇다면 코드로 구현을 해볼까요??
Python Slow Stochastic Code
# Fast %K = ((현재가 - n기간 중 최저가) / (n기간 중 최고가 - n기간 중 최저가)) * 100
def get_stochastic_fast_k(close_price, low, high, n=5):
fast_k = ((close_price - low.rolling(n).min()) / (high.rolling(n).max() - low.rolling(n).min())) * 100
return fast_k
# Slow %K = Fast %K의 m기간 이동평균(SMA)
def get_stochastic_slow_k(fast_k, n=3):
slow_k = fast_k.rolling(n).mean()
return slow_k
# Slow %D = Slow %K의 t기간 이동평균(SMA)
def get_stochastic_slow_d(slow_k, n=3):
slow_d = slow_k.rolling(n).mean()
return slow_d
...
# fast_k, slow_k, slow_d를 획득
df['fast_k'] = get_stochastic_fast_k(df['Close'], df['Low'], df['High'], 5)
df['slow_k'] = get_stochastic_slow_k(df['fast_k'], 3)
df['slow_d'] = get_stochastic_slow_d(df['slow_k'], 3)
df.plot(y=['Close'], figsize = (20, 5))
# Slow %K, Slow %D를 그려서 확인
df.plot(y=['slow_k', 'slow_d'], figsize = (20, 5))
Python Slow Stochastic Full Code
import pandas as pd
import pandas_datareader as pdr
import datetime
# 종목 타입에 따라 download url이 다름. 종목코드 뒤에 .KS .KQ등이 입력되어야해서 Download Link 구분 필요
stock_type = {
'kospi': 'stockMkt',
'kosdaq': 'kosdaqMkt'
}
# 회사명으로 주식 종목 코드를 획득할 수 있도록 하는 함수
def get_code(df, name):
code = df.query("name=='{}'".format(name))['code'].to_string(index=False)
# 위와같이 code명을 가져오면 앞에 공백이 붙어있는 상황이 발생하여 앞뒤로 sript() 하여 공백 제거
code = code.strip()
return code
# download url 조합
def get_stock_code(market_type=None):
market_type_param = stock_type[market_type]
download_link = 'http://kind.krx.co.kr/corpgeneral/corpList.do'
download_link = download_link + '?method=download'
download_link = download_link + '&marketType=' + market_type_param
df = pd.read_html(download_link, header=0)[0]
return df;
# kospi 종목코드 목록 다운로드
def get_stock_code_kospi():
df = get_stock_code('kospi')
df.종목코드 = df.종목코드.map('{:06d}.KS'.format)
return df
# kosdaq 종목코드 목록 다운로드
def get_stock_code_kosdaq():
df = get_stock_code('kosdaq')
df.종목코드 = df.종목코드.map('{:06d}.KQ'.format)
return df
# Fast %K = ((현재가 - n기간 중 최저가) / (n기간 중 최고가 - n기간 중 최저가)) * 100
def get_stochastic_fast_k(close_price, low, high, n=5):
fast_k = ((close_price - low.rolling(n).min()) / (high.rolling(n).max() - low.rolling(n).min())) * 100
return fast_k
# Slow %K = Fast %K의 m기간 이동평균(SMA)
def get_stochastic_slow_k(fast_k, n=3):
slow_k = fast_k.rolling(n).mean()
return slow_k
# Slow %D = Slow %K의 t기간 이동평균(SMA)
def get_stochastic_slow_d(slow_k, n=3):
slow_d = slow_k.rolling(n).mean()
return slow_d
# kospi, kosdaq 종목코드 각각 다운로드
kospi_df = get_stock_code_kospi()
kosdaq_df = get_stock_code_kosdaq()
# data frame merge
code_df = pd.concat([kospi_df, kosdaq_df])
# data frame정리
code_df = code_df[['회사명', '종목코드']]
# data frame title 변경 '회사명' = name, 종목코드 = 'code'
code_df = code_df.rename(columns={'회사명': 'name', '종목코드': 'code'})
code = get_code(code_df, '삼성전자')
start = datetime.datetime(2019,1,1)
end = datetime.date(2019,12,31)
# 수정주가를 반영
df = pdr.get_data_yahoo(code, start, end, adjust_price=True)
df['Close'].plot()
# fast_k, slow_k, slow_d를 획득
df['fast_k'] = get_stochastic_fast_k(df['Close'], df['Low'], df['High'], 5)
df['slow_k'] = get_stochastic_slow_k(df['fast_k'], 3)
df['slow_d'] = get_stochastic_slow_d(df['slow_k'], 3)
df.plot(y=['Close'], figsize = (20, 5))
# Slow %K, Slow %D를 그려서 확인
df.plot(y=['slow_k', 'slow_d'], figsize = (20, 5))
각 코드마다 주석처리가 되어있기 때문에 어려움 없이 보실 수 있을 거예요
여기서 핵심 코드는 get_stochastic_fast_k를 획득하고 그 값으로 slow_k, slow_d를 획득하는 방법입니다.
위에 나와있는 공식이 어렵지 않다 보니 간단하게 구현이 가능하네요
'⌨ DEVELOPMENT > Python' 카테고리의 다른 글
[Python] 이미지 한장으로 정리하는 Python3 기초! (3) | 2020.05.30 |
---|---|
[Python] backtrader를 이용한 주식 전략 백테스팅 시뮬레이션 (9) | 2020.01.04 |
[Python] 네이버 Finance API를 이용한 ETF 종목 가져오기 (10) | 2020.01.02 |
[Python] pandas 주식정보 이동평균(moving average) 구하기 (1) | 2019.12.29 |
[Python] pandas_datareader를 이용하여 주식 데이터 가져오기! Yahoo Finance (3) | 2019.12.26 |
[Python] Pandas를 이용하여 주식 종목 코드 가져오기! 한국 거래소 (KRX). (4) | 2019.12.26 |
Python django vs Flask. web framework 무엇을 선택해야할까? (6) | 2019.12.25 |
Google Colaboratory 소개 및 사용법 : 주피터 노트북 (jupyter notebook) (2) | 2019.12.16 |
댓글
이 글 공유하기
다른 글
-
[Python] 네이버 Finance API를 이용한 ETF 종목 가져오기
[Python] 네이버 Finance API를 이용한 ETF 종목 가져오기
2020.01.02 -
[Python] pandas 주식정보 이동평균(moving average) 구하기
[Python] pandas 주식정보 이동평균(moving average) 구하기
2019.12.29 -
[Python] pandas_datareader를 이용하여 주식 데이터 가져오기! Yahoo Finance
[Python] pandas_datareader를 이용하여 주식 데이터 가져오기! Yahoo Finance
2019.12.26 -
[Python] Pandas를 이용하여 주식 종목 코드 가져오기! 한국 거래소 (KRX).
[Python] Pandas를 이용하여 주식 종목 코드 가져오기! 한국 거래소 (KRX).
2019.12.26