본문 바로가기
파이썬/주식

Python으로 주가 이동평균 구하기

by 행복론자 2019. 10. 29.

자주 접할 수 있는 기술적 분석지표인 이동평균선을 구하는 방법입니다.

대부분의 증권사가 5일,20일,60일,120일의 이동평균선을 제공되고 있으며 이 이동평균선(이하 이평선)을 바탕으로 

골든크로스와 같은 순간을 포착할 수 있습니다.

 

이동평균선이란 일정 기간의 주가를 산술 평균한 값입니다. 5일 동안의 주가의 평균을 구하면 5일 주가이동평균선이고 

60일이 기준이면 60일 주가이동평균선입니다. 

 

주로 20일 이평선까지는 단기이평선 60일은 중기, 120일 초과 이평선은 장기 이평선으로 구분합니다.

흔히 말하는 골든크로스는 단기이평선이 장기이평선과 교차하여 상승하는 국면을 말합니다.

 

이는 최근의 주가가 과거의 평균보다 급격하게 상승하고 있다는 의미입니다. 따라서 현재 추세를 상승추세로 판단하고 매수 타이밍으로 판단할 수도 있습니다. 

 

이와 반대로 단기이평선이 장기이평선과 교차하여 떨어지는 국면을 데드크로스라고 합니다.

데드크로스일 때는 최근 주가가 과거의 평균보다 급격하게 하락하고 있다고 해석할 수 있습니다.

 

아무튼 Python으로 이 이동평균선을 구해봅니다.

 

import pandas_datareader.data as web
import datetime

start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2019, 10, 29)
ds = web.DataReader("068270.KS", "yahoo", start, end)

ma5 = ds['Adj Close'].rolling(window=5).mean()

print(ma5)

수정 종가를 기준으로 5일 이동평균값을 ma5를 출력해보면 다음과 같이 나옵니다.

Date
2019-01-02         NaN
2019-01-03         NaN
2019-01-04         NaN
2019-01-07         NaN
2019-01-08    214900.0
2019-01-09    214800.0
2019-01-10    216000.0
2019-01-11    215300.0
2019-01-14    214300.0
2019-01-15    213100.0
2019-01-16    210700.0

(중략)

 

2019-01-02 ~ 2019-01-07까지 값이 나오질 않는 이유는 이 기준일에는 5일치의 종가가 존재하지 않기 때문에 2019-01-08부터 이동평균값이 계산되어 나옵니다. 

 

 

import pandas_datareader.data as web
import datetime

start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2019, 10, 29)
ds = web.DataReader("068270.KS", "yahoo", start, end)

ma5 = ds['Adj Close'].rolling(window=5).mean()
print(len(ds.columns))
ds.insert(len(ds.columns), "MA5", ma5)

print(ds.tail(5))

이렇게 구한 ma5(5일 이동평균값)이란 colum을 ds(data set)에 추가하기 위해 insert 함수를 사용합니다.

insert함수의 첫번째 인자로는 추가할 column의 위치, 두번째 인자는 column명 그리고 마지막은 data를 추가합니다.

 

마찬가지로 20,60,120일에 대한 이동평균 값도 ds에 넣어주도록 합니다. 

import pandas_datareader.data as web
import datetime

start = datetime.datetime(2019, 1, 1)
end = datetime.datetime(2019, 10, 29)
ds = web.DataReader("068270.KS", "yahoo", start, end)

ma5 = ds['Adj Close'].rolling(window=5).mean()
ma20 = ds['Adj Close'].rolling(window=20).mean()
ma60 = ds['Adj Close'].rolling(window=60).mean()
ma120 = ds['Adj Close'].rolling(window=120).mean()

print(len(ds.columns))
ds.insert(len(ds.columns), "MA5", ma5)
ds.insert(len(ds.columns), "MA20", ma20)
ds.insert(len(ds.columns), "MA60", ma60)
ds.insert(len(ds.columns), "MA120", ma120)

print(ds.tail(5))

 

 

 

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글