백테스트-해외 주식 종가 데이터 가져오는 방법(get_data_yahoo)

 안녕하세요, 백테스트를 진행하면서 많은 분들이 소스코드를 요청하셔서 따라하시기 쉽도록 설명을 곁들여 포스팅해보려고 합니다. 그 첫번째 시간으로 가장 기본적인, 주가 데이터를 가져오는 방법을 알아보겠습니다. 다양한 방법으로 주가 데이터를 가져올 수 있겠지만, 이 포스팅에서는 pandas_datareader의 get_data_yahoo 함수를 사용해보겠습니다. 이는 Yahoo Finance 데이터를 html로 읽어오는 함수입니다.

 

 저도 테스트하기 위한 막 코딩을 하는거라, 비효율적이고 지저분한 코드일 수 있으니 양해해주세요. 더 효율적이고 깔끔하게 정리가 가능한 코드들을 댓글로 알려주시면 저도 배울 수 있으니, 자유롭게 댓글 달아주세요 : )

 

 백테스트를 할 때 파이썬 언어를 사용하며, 주로 Jupyter Notebook을 활용합니다. 소스코드를 수정하고 다시 돌려보기에 가장 적합한 방법이 아닐까 싶네요. 

 

# Yahoo Finance에서 데이터를 불러오기 위한 라이브러리
import pandas_datareader as pdr
import pandas as pd

# 일자별로 데이터를 처리하기 위한 라이브러리
from datetime import datetime, timedelta

# Pandas 표기 설정
pd.options.display.float_format = '{:.4f}'.format # 소수점 4자리까지 표기
pd.set_option('display.max_columns', None) # Dataframe 출력시 컬럼 생략없이 전체 표기

 

 우선 필요한 라이브러리를 import하고 Pandas의 표기 설정을 해줍니다. 설정의 경우 본인이 원하는대로 자유롭게 해주시면 됩니다!

 

# 백테스트 기간 설정
start_day = datetime(2005,1,1) # 시작일
end_day = datetime(2021,2,15) # 종료일

 

 이후 백테스트 기간을 설정합니다. 보통 백테스트를 진행하는 ETF나 주식 종목의 상장 기간이 엄청 길지는 않기 때문에, 보통 10년 전후로 진행을 합니다. 논문에 나오는 것만큼 긴 기간을 백테스트하기 위해서는 별도로 해당 지수(주가, 금, 채권)의 데이터를 직접 구해야 합니다. 

 

# 주가 데이터를 반환하는 함수
# x는 종목명이 포함된 리스트(ex: ['SPY','QQQ','GLD','SHY','IEF'])
def get_price_data(x):
    df_price = pd.DataFrame(columns=x)
    
    for ticker in x:
        df_price[ticker] = pdr.get_data_yahoo(ticker, start_day - timedelta(days=365), end_day)['Adj Close']  

    return df_price

 주가 데이터를 반환하는 함수입니다.

 

pdr.get_data_yahoo(ticker, start_day - timedelta(days=365), end_day)['Adj Close'] 

 

 위 코드가 실제로 라이브러리를 통해 주가 데이터를 가져오는 부분인데, 시작일보다 365일 이전 데이터까지 조회하는 이유는 보통 동적 자산 배분에서 1년 모멘텀 지수를 계산해서 이용하기 때문입니다. 

 

# 조회할 종목을 리스트로 선언하고 호출
LAA = ['SPY','QQQ','IWD','GLD','SHY','IEF']
df_LAA = get_price_data(LAA)

 

 LAA 전략을 백테스트한다고 가정하고 데이터를 조회해보도록 하겠습니다. 위 코드를 실행한 후 조회하면 아래와 같이 데이터가 정상적으로 불러와진 것을 확인할 수 있습니다. GLD의 경우 2004년 초에는 상장되기 이전이기 때문에 데이터가 NaN으로 표기되는 것을 확인 할 수 있습니다. 

 

 

 다음 포스팅부터는 가져온 주가 데이터를 활용해 수익률, MDD 등 다양한 성과와 지표를 분석하는 방법을 알아보도록 하겠습니다.

 


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

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

 

 

 

 

댓글()