본문 바로가기

주식투자/투자도움받기

파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-4. 주가 이동평균 구하기


우리는 주식투자를 하면서 가장 많이 활용하는 지표가 바로 이동평균선일 것입니다. 이동평균선은 주가의 추세를 나타내주기 때문에 앞으로의 방향을 예측하는 지표로 가장 많이 사용을 하고 있습니다.

저 역시나 주식투자를 하면서 분봉과 일봉, 주봉, 월봉의 이동평균선을 보고 상승흐름이냐 아니냐를 판단한 후에 투자에 접근을 하고 있습니다.

그래서 이번에 파이썬으로 주식 자동매매프로그램(로봇)을 만들면서 일봉 뿐만 아니라 분봉의 이동평균선까지 구해서 최적의 매매타이밍을 만들어보고자 했습니다.

파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-4. 주가 이동평균 구하기

 

 

목  차

     

    파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-4. 주가 이동평균 구하기

    일단 이동평균을 구하기 위해서는 지난번 글에서 말씀드린 주가정보가 1차적으로 필요합니다. 20일 이동평균선을 구하기 위해서는 20일 주가 정보가 있어야 평균을 구할수 있있고, 5일 이동평균선을 구하기 위해서는 5일 주가 정보가 있어야 평균을 구할 수 있기 때문입니다.

    이동평균을 구하기 위해 주가정보를 구하는 파이썬 코드

    파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-3. 주가 정보 구하기

     

    파이썬 주식 자동매매 프로그램(로봇) 구축 : 3-3. 주가 정보 구하기

    지난번 포스팅에서는 파이썬 주식자동매매프로그램을 구축하면서 실질적인 매매로직을 구현하기 위한 기초정보로 현재가(호가창)의 다양한 정보를 조회하는 소스코드에 대해서 알아보았습니

    jjisso.tistory.com

    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원으로 나오는 것을 확인할 수 있고, 실제로 주식차트와 비교해도 맞는정보가 출력되는 것을 알 수가 있습니다.

    파이썬 소스코드를 실행시켜서 나온 삼성전자의 이동평균 주가 : 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봉이동평균선을 의미하니 참고하시면 좋을 것 같습니다.

     

    ※ 저는 주식투자를 공부중인 개인/개미투자자입니다. 제 주관에 의한 개인적인 투자방식을 정립 중이며, 투자 손실과 책임은 개인에게 있음을 안내드립니다.

    유익하셨다면, 공감(♡)클릭 및 댓글 부탁드리며, 블로그/유튜브가 많은 분들에게 도움이 되었으면 좋겠네요.

    찌쏘와 함께 주식공부 합시다.

     

    반응형


    Visitor : 2,096,307
    POWERED/DESIGN/COPYRIGHTⓒ BY JJISSO