우리는 주식투자를 하면서 가장 많이 활용하는 지표가 바로 이동평균선일 것입니다. 이동평균선은 주가의 추세를 나타내주기 때문에 앞으로의 방향을 예측하는 지표로 가장 많이 사용을 하고 있습니다.
저 역시나 주식투자를 하면서 분봉과 일봉, 주봉, 월봉의 이동평균선을 보고 상승흐름이냐 아니냐를 판단한 후에 투자에 접근을 하고 있습니다.
그래서 이번에 파이썬으로 주식 자동매매프로그램(로봇)을 만들면서 일봉 뿐만 아니라 분봉의 이동평균선까지 구해서 최적의 매매타이밍을 만들어보고자 했습니다.
목 차
파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-4. 주가 이동평균 구하기
일단 이동평균을 구하기 위해서는 지난번 글에서 말씀드린 주가정보가 1차적으로 필요합니다. 20일 이동평균선을 구하기 위해서는 20일 주가 정보가 있어야 평균을 구할수 있있고, 5일 이동평균선을 구하기 위해서는 5일 주가 정보가 있어야 평균을 구할 수 있기 때문입니다.
이동평균을 구하기 위해 주가정보를 구하는 파이썬 코드
파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-3. 주가 정보 구하기
import win32com.client
import pandas as pd
from datetime import datetime, timedelta
cpOhlc = win32com.client.Dispatch('CpSysDib.StockChart')
def get_ohlc(code, qty):
"""인자로 받은 종목의 OHLC 가격 정보를 qty 개수만큼 반환한다."""
cpOhlc.SetInputValue(0, code) # 종목코드
cpOhlc.SetInputValue(1, ord('2')) # 1:기간, 2:개수
cpOhlc.SetInputValue(4, qty) # 요청개수
cpOhlc.SetInputValue(5, [0, 2, 3, 4, 5]) # 0:날짜, 2~5:OHLC
cpOhlc.SetInputValue(6, ord('D')) # D:일단위
cpOhlc.SetInputValue(9, ord('1')) # 0:무수정주가, 1:수정주가
cpOhlc.BlockRequest()
count = cpOhlc.GetHeaderValue(3) # 3:수신개수
columns = ['open', 'high', 'low', 'close']
index = []
rows = []
for i in range(count):
index.append(cpOhlc.GetDataValue(0, i))
rows.append([cpOhlc.GetDataValue(1, i), cpOhlc.GetDataValue(2, i),
cpOhlc.GetDataValue(3, i), cpOhlc.GetDataValue(4, i)])
df_d = pd.DataFrame(rows, columns=columns, index=index)
return df_d
stock_ohlc = get_ohlc('A005930', 20)
위 소스코드를 사용하면 대신증권 크레온 API를 이용해서 삼성전자의 20일 주가정보를 가져올 수가 있습니다. 이 데이터를 활용해서 20봉이평 주가를 만들어보도록 하겠습니다.
주가 이동평균을 구하는 파이썬 코드
파이썬에서 위 주가정보를 활용하여 이동평균주가를 만드는 소스코드는 아래와 같습니다.
def get_movingaverage(code, window):
"""인자로 받은 종목에 대한 이동평균가격을 반환한다."""
try:
time_now = datetime.now()
str_today = time_now.strftime('%Y%m%d')
ohlc = get_ohlc(code, 20)
if str_today == str(ohlc.iloc[0].name):
lastday = ohlc.iloc[1].name
else:
lastday = ohlc.iloc[0].name
closes = ohlc['close'].sort_index()
ma = closes.rolling(window=window).mean()
return ma.loc[lastday]
except Exception as ex:
#dbgout('get_movingavrg(' + str(window) + ') -> exception! ' + str(ex))
return None
moving20 = get_movingaverage('A005930', 20) #삼성전자의 20봉이동평균가격
print(moving20) #이동평균주가를 출력
사실 저는 프로그래머가 아니기때문에 자세히 어떻게 동작하는지 설명하기는 어렵습니다. 위 소스코드는 오픈소스이고 자동매매 프로그램을 만들기 위해서 사용한 코드입니다.
전체 소스코드를 실행하여 20봉 이동평균선 주가를 구해보자
전체 소스코드를 확인해서 본다면 아래와 같습니다.
import win32com.client
import pandas as pd
from datetime import datetime, timedelta
cpOhlc = win32com.client.Dispatch('CpSysDib.StockChart')
def get_ohlc(code, qty):
"""인자로 받은 종목의 OHLC 가격 정보를 qty 개수만큼 반환한다."""
cpOhlc.SetInputValue(0, code) # 종목코드
cpOhlc.SetInputValue(1, ord('2')) # 1:기간, 2:개수
cpOhlc.SetInputValue(4, qty) # 요청개수
cpOhlc.SetInputValue(5, [0, 2, 3, 4, 5]) # 0:날짜, 2~5:OHLC
cpOhlc.SetInputValue(6, ord('D')) # D:일단위
cpOhlc.SetInputValue(9, ord('1')) # 0:무수정주가, 1:수정주가
cpOhlc.BlockRequest()
count = cpOhlc.GetHeaderValue(3) # 3:수신개수
columns = ['open', 'high', 'low', 'close']
index = []
rows = []
for i in range(count):
index.append(cpOhlc.GetDataValue(0, i))
rows.append([cpOhlc.GetDataValue(1, i), cpOhlc.GetDataValue(2, i),
cpOhlc.GetDataValue(3, i), cpOhlc.GetDataValue(4, i)])
df_d = pd.DataFrame(rows, columns=columns, index=index)
return df_d
def get_movingaverage(code, window):
"""인자로 받은 종목에 대한 이동평균가격을 반환한다."""
try:
time_now = datetime.now()
str_today = time_now.strftime('%Y%m%d')
ohlc = get_ohlc(code, 20)
if str_today == str(ohlc.iloc[0].name):
lastday = ohlc.iloc[1].name
else:
lastday = ohlc.iloc[0].name
closes = ohlc['close'].sort_index()
ma = closes.rolling(window=window).mean()
return ma.loc[lastday]
except Exception as ex:
#dbgout('get_movingavrg(' + str(window) + ') -> exception! ' + str(ex))
return None
moving20 = get_movingaverage('A005930', 20)
print(moving20)
위 소스코드를 사용해서 실행을 시켜보면 5/28일 삼성전자의 20봉이동평균 가격은 80,630원으로 나오는 것을 확인할 수 있고, 실제로 주식차트와 비교해도 맞는정보가 출력되는 것을 알 수가 있습니다.
20봉 이동평균의 상승추세 정보 구하는 파이썬 코드
주가정보와 이동평균선 정보만 있더라도 사실 매매로직을 구현하는 것이 편리합니다. 하지만 알고 싶은 것은 추세가 상승추세이냐 아니냐를 판단하도록 하는 것이 중요할 것입니다.
굳이 하락추세인 종목에 매매가 진행되서 물리는 경우가 없도록 하기 위해서 추세에 대한 정보도 만드는 소스코드를 만들어보았습니다.
def moving_flow_gakdo(code, window):
try:
ohlc = get_ohlc(code, 30)
# print(ohlc)
lastday1 = ohlc.iloc[0].name
lastday2 = ohlc.iloc[1].name
lastday3 = ohlc.iloc[2].name
# lastday4 = ohlc.iloc[3].name
# lastday4 = ohlc.iloc[4].name
# lastday5 = ohlc.iloc[5].name
lastday6 = ohlc.iloc[5].name
closes = ohlc['close'].sort_index()
ma = closes.rolling(window=window).mean()
print(ma.loc[lastday1], ma.loc[lastday2], ma.loc[lastday3], ma.loc[lastday6])
recent_flow = round((ma.loc[lastday1] - ma.loc[lastday3])/2,1)
past_flow = round((ma.loc[lastday3] - ma.loc[lastday6])/3,1)
return recent_flow, past_flow
except Exception as ex:
#dbgout('get_movingavrg(' + str(window) + ') -> exception! ' + str(ex))
return None
recent_flow, past_flow = moving_flow_gakdo('A005930', 20)
print(recent_flow, past_flow)
위 소스코드는 이동평균의 추세전환이 만들어진 것을 확인하기 위한 소스코드 입니다. 강한 상승으로 전환이나 하락전환이냐를 각도의 변환을 활용해서 찾을 수 있도록 고안된 파이썬 소스코드입니다.
일종의 간단한 수학 개념을 넣은 것으로 보면되는데요. (A) 5봉전 이동평균과 2봉전 이동평균 3일간의 20봉 이동평균선의 각도와 (B) 2봉전 이동평균과 0봉의 이동평균 2일간의 20봉이동평균 각도를 구합니다.
여기서 최근 이동평균선 기울기인 (B)가 이전 이동평균선 기울기 (A)보다 크다면 상승전환이 된것을 의미하게 됩니다.
위 소스코드를 실행시키면 최근의 이동평균선의 기울기는 -132.5이고, 이전의 이동평균선 기울기는 -155로 최근의 기울기가 더 큽니다. 이것은 상승추세로 전환이 되어지고 있다라는 것을 의미합니다.
하지만 값이 (-)마이너스로 나오기 때문에 하락추세에서 조금 덜 하락추세로 전환된 것을 의미합니다. 위의 삼성전차 일봉 차트에서 노란색이 20봉이동평균선을 의미하니 참고하시면 좋을 것 같습니다.
※ 저는 주식투자를 공부중인 개인/개미투자자입니다. 제 주관에 의한 개인적인 투자방식을 정립 중이며, 투자 손실과 책임은 개인에게 있음을 안내드립니다.
유익하셨다면, 공감(♡)클릭 및 댓글 부탁드리며, 블로그/유튜브가 많은 분들에게 도움이 되었으면 좋겠네요.
'주식투자 > 투자도움받기' 카테고리의 다른 글
주가 예측 프로그램을 활용하는 방법 - facebook fbprophet (4) | 2021.06.11 |
---|---|
다음날 주가가 상한가 되는 조건검색식 만들기 with 유튜브 동영상 (2) | 2021.06.04 |
주가 예측 프로그램 (삼성전자, 삼성제약)- Facebook fbprophet 활용 (3) | 2021.05.31 |
파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-3. 주가 정보 구하기 (2) | 2021.05.26 |
파이썬 주식 자동매매 프로그램(로봇) 구축 - 일주일 매매 수익 (3) | 2021.05.05 |
RECENT COMMENT