백테스트-ETF 상장일 구하는 방법(네이버 금융/ 증권 활용)

 안녕하세요, 게으른 퀀트입니다. 이번 포스팅에서는 ETF 상장일을 구하는 방법에 대해 알아보겠습니다. 'ETF 상장일은 알아서 뭐에 쓰려고?'라고 생각하시는 분들도 있으실텐데요. 백테스트를 진행하다보면 국내 상장 ETF로 성과를 검증해보고 싶은 마음이 들지만, 실제로 ETF 상품이 운영된 기간이 그리 길지 않아서 백테스트가 힘든 경우가 발생합니다. 그런 경우에 상장일을 구하고, 상장일이 빠른 ETF를 활용하면 훨씬 긴 기간을 백테스트 해볼 수 있죠.

 

 1.준비과정(국내 ETF 리스트 가져오기)

import requests
import json
import pandas as pd

# 국내 ETF 전체 리스트
url = 'https://finance.naver.com/api/sise/etfItemList.nhn'
json_data = json.loads(requests.get(url).text)
df_etf_list = pd.json_normalize(json_data['result']['etfItemList'])
df_etf_list.head(5)

df_etf_list = df_etf_list[df_etf_list['etfTabCode'].isin([1,4,6])] #국내시장,국내테마, 해외주식
df_etf_list = df_etf_list[~df_etf_list['itemname'].str.contains('인버스')] # 인버스 아닌 건들
df_etf_list = df_etf_list.reset_index()

 이전 포스팅에서 다룬 내용이긴 하지만, 잠깐 코드에 대해 설명을 해드리자면, 네이버 금용/증권 탭에서 조회되는 국내 상장 ETF 리스트를 모두 가져온 뒤 ETF 명에 '인버스'가 포함된 건들은 모두 제외하는 코드입니다. 오늘 다룰 ETF 상장일 가져오는 방법은 여기서부터 시작하도록 하겠습니다.

 

 

2.상장일 가져오는 함수

# 종목코드별 시작일자 
def get_stock_origintime(code):
    """
    Naver 금융 데이터 호출 결과 예시
    <chartdata symbol="214980" name="KODEX 단기채권PLUS" count="1" timeframe="day" precision="0" origintime="20150303">
    :param code: 종목 코드
    :return: 종목코드 시작일자(origintime)
    """

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

    return origintime

 종목별 종가 가져오는 함수와 동일한 방식으로 구성된 함수이며, 저는 util.py라는 파일을 만들어서 필요할 때마다 사용하고 있습니다.

 

예를 들어 'KODEX 200'이라는 ETF에 대한 주가 정보를 가져오는 호출 url를 접속해보면 아래와 같은 xml 형태의 페이지가 열립니다.

 

fchart.stock.naver.com/sise.nhn?symbol=069500&timeframe=day&count=1&requestType=0

 

 그 중 빨간색으로 표기한 origintime이라는 속성의 값을 가져와서 반환해주는 함수입니다.

 

 

3.종목코드별 상장일 입력

for i in range(len(df_etf_list)):
    df_etf_list.loc[i,'origintime'] = util.get_stock_origintime(df_etf_list.loc[i,'itemcode'])

위에 준비단계에서 생성한 df_etf_list를 한 행씩 함수 실행시켜 상장일을 입력하는 소스코드입니다. get_stock_origintime을 실제로 사용하는 코드죠. 함수로 상장일을 가져온 이후에 DataFrame을 출력해보면 아래와 같이 잘 가져왔음을 알 수 있습니다.

 

결과 DataFrame)

 

 

4.다양한 활용

# 상장일 빠른 순으로 조회
df_etf_list[['itemcode','itemname','origintime']].sort_values(by='origintime')

# 2010년 이전에 상장된 ETF 조회
df_etf_list[df_etf_list['origintime'] < '20100101'][['itemcode','itemname','origintime']]

 

 


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

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

 

 

댓글()