본문 바로가기

주식투자/투자도움받기

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

반응형

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

실제로 주식투자를 진행함에 있어서 어떤 주식종목을 매수하고자 할 때 가장 먼저 접하게되는 화면이 바로 호가창(현재가)창입니다. 

이번에는 2번재로 가져오게될 정보는 바로 주가에 대한 일자별 정보입니다. 보통 우리가 주식투자를 하게되면 특정기간(ex. 1월1일~3월30일)까지의 주가정보(종가, 시가, 고가, 저가)를 가져오게 됩니다.

이를 통해서 나중에 이동평균도 구하게 되며, 주식투자의 추세를 확인하고 강도를 확인하고, 주가의 변동률을 확인하는 작업을 하는 기초적인 데이터이기 때문에 필수적으로 수집을 해야 하는 정보입니다.

 

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

참고로 저는 대신증권 크레온을 사용한 자동매매프로그램을 구축하고 있으며, 이와 관련된 함수와 소스코드 정보입니다. 키움증권을 활용하신다면 방법은 유사하겠으나 별도의 API함수를 활용하시면됩니다.

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

삼성전자의 최근 30일 주가정보 구하기

import win32com.client
import pandas as pd

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


ohlc = get_ohlc('A005930',30)   # A005930 은 삼성전자 코드
print(ohlc)

위 코드를 활용하시면 삼성전자의 최근 30일 주가(시가, 고가, 저가, 종가)를 구할수가 있습니다. 사실 위 소스코드는 크레온 API자료실에서도 구할수가 있으며, 함수의 자세한 동작원리까지는 모르겠습니다.

크레온 접속이 된 상태에서 위 코드를 vscode에 넣고 실행을 시키면, 아래와 같이 일자별로 삼성전자의 주가가 최근 30봉의 데이터가 나오는 것을 확인할 수가 있을 것입니다.

삼성전자의 일자별 시세 실제 값
삼성전자의 일자별 시세 실제 값

파이썬 소스코드를 실행하여 받아온 삼성전자의 시세정보
파이썬 소스코드를 실행하여 받아온 삼성전자의 시세정보

 

삼성전자의 5분봉 주가정보 구하기

def get_ohlc2(code, qty):
    """인자로 받은 종목의 OHLC 가격 정보를 qty 개수만큼 반환한다."""
    cpOhlc.SetInputValue(0, code)           # 종목코드
    cpOhlc.SetInputValue(1, ord('2'))        # 1:기간, 2:개수
    cpOhlc.SetInputValue(4, qty)             # 요청개수
    cpOhlc.SetInputValue(5, [1, 2, 3, 4, 5]) # 0:날짜, 2~5:OHLC
    cpOhlc.SetInputValue(6, ord('m'))        # D:일단위
    cpOhlc.SetInputValue(7, 5)        # 5분간격
    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_5m = pd.DataFrame(rows, columns=columns, index=index) 
    return df_5m

위 코드는 5분봉 주가정보를 구하는 코드입니다. 사실 분봉을 구하는 소스는 일봉의 주가정보를 구하는 코드와 크게 다르지 않습니다.

파이썬 소스코드를 실행하여 받아온 삼성전자의 5분봉 시세정보
파이썬 소스코드를 실행하여 받아온 삼성전자의 5분봉 시세정보

달라지는 부분은 바로 6번과 9번인데요. 아래를 보시면 cpOhlc.SetInputValue(6, ord('D")), cpOhlc.SetInputValue(6, ord('m")) D(day)가 m(minute)으로 바뀐 것이며,

cpOhlc.SetInputValue(7, 5)가 새로 추가된 코드인데, 5를 넣으면 5분간격, 10을 넣으면 10분간격으로 데이터를 받아볼 수 있습니다. 

만약에 15분봉이나 30분봉을 구한다고하면 cpOhlc.SetInputValue(7, 15), cpOhlc.SetInputValue(7, 30)으로 활용한다면 분봉의 다양한 데이터를 구할 수 있을 것으로 생각됩니다.

 

반응형

Visitor :
POWERED/DESIGN/COPYRIGHTⓒ BY JJISSO