백테스트-국내 주식 종가 가져오는 방법(네이버 금융, 증권 활용)

 안녕하세요, 이번 시간에는 네이버 금융, 증권에서 국내 주가를 가져와서 DataFrame 형태로 만드는 함수에 대해서 설명드리겠습니다. 이 함수는 제가 개인적으로 함수 형태로 만들어서 백테스트를 할 때 활용하는 코드입니다. 참고하셔서 조금씩 변형해도 유용하게 쓰실 수 있을 것 같습니다😁

 

# 주가 데이터 호출 함수
def get_stock_data(code, from_date, to_date):
    """
    Naver 금융 데이터 호출 결과 예시
    <item data="20190314|43700|44300|43550|43850|18039161"> ==> 일자|시가|고가|저가|종가|거래량
    :param code: 종목 코드
    :param from_date: 데이터 시작일자
    :param to_date: 데이터 종료일자
    :return: 해당 종목 코드의 일자, 시가, 고가, 저가, 종가, 거래량 데이터프레임
    """
    from_date = str(from_date)
    to_date = str(to_date)
    count = (datetime.today() - datetime.strptime(from_date, "%Y%m%d")).days + 1

    stock_data = []
    url = "https://fchart.stock.naver.com/sise.nhn?symbol={}&timeframe=day&count={}&requestType=0".format(code, count)
    html = requests.get(url).text
    soup = BeautifulSoup(html, "html.parser")
    data = soup.findAll('item')

    for row in data:
        # 일자별 데이터 세팅 ['20200518', '47950', '49100', '47600', '48800', '20481981']
        daily_history = re.findall(r"[-+]?\d*\.\d+|\d+", str(row))
        if int(daily_history[0]) >= int(from_date) and int(daily_history[0]) <= int(to_date):
            daily_history[0] = datetime.strptime(daily_history[0], "%Y%m%d")
            daily_history[1] = float(daily_history[1])
            daily_history[2] = float(daily_history[2])
            daily_history[3] = float(daily_history[3])
            daily_history[4] = float(daily_history[4])
            daily_history[5] = float(daily_history[5])
            stock_data.append(daily_history)

    df = pd.DataFrame(stock_data, columns=['date', 'price', 'high', 'low', 'close', 'vol'])
    df.set_index(keys='date', inplace=True)

    return df

 

 저는 get_stock_data라는 함수명으로 만들어 사용하고 있으며, 주식 종목 코드와, 시작일과 종료일을 파라미터로 받아서 DataFrame 형태로 반환하는 함수를 만들었습니다.

 

 코드를 조금씩 뜯어서 살펴보겠습니다. 소스 중 url을 살펴보시면 네이버 증권의 chart를 보여주는 주소를 호출하고 있습니다. 

url = "https://fchart.stock.naver.com/sise.nhn?symbol={}&timeframe=day&count={}&requestType=0".format(code, count)

 

 실제로 삼성전자의 종목코드를 넣고 조회를 하면 다음과 같은 화면이 조회가 되죠. 예시로 10개의 데이터만 조회해보겠습니다.

 

 

 <item data="일자 | 시가 | 고가 | 저가 | 종가 | 거래량"/> 의 형태로 데이터가 조회됩니다. 그리고 그 이후에는 얻게 된 html text Data를 Dataframe으로 전환해주는 로직입니다.

 

 저는 해당 함수를 util.py라는 파이썬 파일로 만들어두고 필요할 때마다 import해서 사용하고 있습니다. 실제로 백테스트를 진행할 때 활용하는 소스코드는 아래와 같습니다.

 

import util
import pandas as pd
from datetime import datetime, timedelta

start_day = '20100101' # 시작일
end_day = '20201231' # 종료일

cal_days = (datetime.strptime(end_day, "%Y%m%d") - datetime.strptime(start_day, "%Y%m%d")).days

stock_code = ['005930', '005380']
stock_name = ['삼성전자', '현대차']
df_price = pd.DataFrame()

for i in range(len(stock_code)):
    df_close = util.get_stock_data(stock_code[i], start_day, end_day)['close']
    df_price = pd.merge(df_price, df_close, how='outer', left_index=True, right_index=True)

df_price.columns = stock_name

 위의 함수를 한 건으로만 호출하게 되면 pandas의 Series 형태로 가져오게 되고, 이를 연결시켜서 DataFrame 형태로 활용하면 편리합니다.

 

 

결과 DataFrame)

 

 

 아주 기본적이면서도 유용한 주가 데이터 가져오는 방법을 알아보았습니다. 예전에 이미 한 번 주가 데이터를 가져오는 방법을 DataFrame reader로 알려드린 적이 있는데, 이 함수의 경우 내부적으로 Yahoo Finance 데이터를 가져옵니다. 그래서 저는 개인적으로 DataFrame Reader로는 해외 주식의 데이터를, 네이버 증권 주가 정보 조회 함수로 국내 주식 데이터를 가져오는 편입니다. 여러분들도 여러가지 방법을 사용해보시고 자신에게 편하고, 유용한 방법을 사용하시길 바랍니다. 이 외에도 더 좋은 방법이나, 유용한 방법이 있다면 언제든지 댓글로 알려주세요!

 


공감댓글, 공유는 큰 힘이 됩니다!

도움이 되셨다면 널리널리 알려주세요😉

 

 

댓글()