안녕하세요, 벌써 카페에서는 크리스마스 케롤송이 들려오네요. 매년 그렇지만 올해는 정말 어떻게 시간이 갔는지 모르겠어요. 육아도 하랴 프로그램, 자산 공부, 암호화폐 등등 이것저것 할게 많아서 그랬나봐요. 젊었을 때 한개라도 더 하루라도 더 많이많이 해야할거 같고 또 욕심만 앞서다 보면 정신적 스트레스를 받기도 하는거 같아요. 모든지 밸런스를 잘 잡는게 중요하다 다시 한번 느낍니다.
이번 포스팅에서는 파이썬을 통한 국내 ETF 전종목 기본정보 조회 기능을 구현해 보려고 합니다. 국내 ETF 종목 데이터의 경우 각종 포털 사이트를 통해서 검색을 하실 수도 있는데요. 제가 오늘 하려고 하는건 조건별(예를들어, 종목번호, 종목명 등등)로 빠르고 쉽게 검색하는 기능을 만들어 보겠습니다.
1. 국내 ETF 데이터 수집
바로 이전 포스팅에서는 수집한 국내 ETF 시계열 데이터를 바탕으로 자산배분 전략(60/40) 백테스트를 해보았습니다. 참고하실 분은 여기를 클릭해주세요. 저는 국내 ETF 데이터 수집을 KRX 한국거래소 정보데이터시스템을 통해서 획득했습니다. 아래 캡처화면에서 처럼 좌측 메뉴바에서 [기본통계] -> [증권상품 ETF] -> [전종목 기본정보] 쪽으로 이동해 볼게요.
그럼 아래와 같이 국내 ETF 전종목에 대한 기본정보를 볼 수 있습니다. 컬럼별 제공되는 정보는 총 17가지이며, 테이블을 참고해주세요. 저희는 17가지 중에서 단축코드(종목번호), 종목명(한글종목명), 기초자산분류 이렇게 3가지 검색 조건으로 프로그램을 만들꺼에요.
표준코드 | 영문종목명 | 추적배수 | 상장좌수 | 과세유형 |
단축코드 | 상장일 | 복제방법 | 운용사 | |
한글종목명 | 기초지수명 | 기초시장분류 | CU수량 | |
한글종목약명 | 지수산출기관 | 기초자산분류 | 총보수 |
아래 화면에서 빨강색 네모를 누르면 종목 기본정보를 엑셀파일(.xlsx 또는 .csv)로 다운 받을 수 있습니다. 코드로 활용을 위해서 쉽게 csv 파일로 다운받아 주세요.
2. 소스코드
기본적으로 pandas 라이브러리를 활용합니다. 다운받은 CSV 파일을 데이터프레임에 넣어 검색 조건에 따라 결과를 출력하게 됩니다.
import pandas as pd
# print("pandas version: ", pd.__version__)
# Pandas User Configuration
pd.set_option('display.max_rows', 500) # 최대 줄 수 설정
pd.set_option('display.max_columns', 5000) # 최대 열 수 설정
pd.set_option('display.width', 5000) # 표시할 가로의 길이
df = pd.read_csv('KRX_ETF_전종목기본정보.csv', encoding='cp949')
df['단축코드'] = df['단축코드'].astype(str)
columns = ['단축코드','한글종목명','지수산출기관', '상장일','상장좌수', '총보수']
while True:
search_type = input('원하시는 검색 조건을 선택하세요\n1: 종목번호 2: 종목명 3: 기초자산분류:(숫자만 입력) ')
df_search_simple = None
if search_type == str(1):
search_input = input('종목번호를 입력하세요(다중입력은 콤마(,)로 구분하여 입력: ')
print('\n----------------------------------------------------------------------------------')
search_input = str(search_input.replace(' ','')) # 공백 입력시 공백삭제
search_input = str(search_input.replace(',','|')) # 콤마(,)를 OR 조건 연산자(|)로 변경
# 검색결과
df_search = df.loc[df['단축코드'].str.contains(search_input)].sort_values(by='상장일')
df_search_simple = df_search[columns]
elif search_type == str(2):
search_input = input('종목명을 입력하세요(다중입력은 콤마(,)로 구분하여 입력): ')
print('\n----------------------------------------------------------------------------------')
search_input = str(search_input.replace(' ','')) # 공백 입력시 공백삭제
search_input = str(search_input.replace(',','|')) # 콤마(,)를 OR 조건 연산자(|)로 변경
# 검색결과
search_input3 = input('정렬조건을 입력하세요(0: 상장일, 1:상장좌수:) ')
if search_input3 == str(0):
df_search = df.loc[df['한글종목명'].str.contains(search_input)].sort_values(by='상장일')
elif search_input3 == str(1):
df_search = df.loc[df['한글종목명'].str.contains(search_input)].sort_values(by='상장좌수', ascending=False)
df_search_simple = df_search[columns]
elif search_type == str(3):
input_list = df['기초자산분류'].unique()
dict_input_list = {string:idx for idx, string in enumerate(input_list)}
print(dict_input_list)
search_input2 = input('기초자산분류를 선택하세요:')
print('\n----------------------------------------------------------------------------------')
for key, value in dict_input_list.items():
if search_input2 == str(value):
search_input3 = input('정렬조건을 입력하세요(0: 상장일, 1:상장좌수): ')
if search_input3 == str(0):
df_search = df.loc[df['기초자산분류'].str.contains(key)].sort_values(by='상장일')
elif search_input3 == str(1):
df_search = df.loc[df['기초자산분류'].str.contains(key)].sort_values(by='상장좌수', ascending=False)
df_search_simple = df_search[columns]
break
print(df_search_simple.head(30))
print('\n----------------------------------------------------------------------------------\n')
3. 결과물
그럼 위 코드 결과물에 대해서 한 번 보면서 마무리 하겠습니다. 우선 검색조건을 종목명으로 했을 경우이며, 종목명에 "채권"이 들어간 ETF 를 검색해본 결과 입니다. 추가적으로 "상장일" 또는 "상장좌수"로 정렬 조건을 만들 수 있습니다.
다음으로는 기초자산분류 기준으로 검색해 볼게요. 기초자산 분류에는 총 7가지가 있어요.(주식, 채권, 혼합자산, 부동산, 원자재, 기타 통화). 부동산으로 검색해볼게요.
저는 Pycharm 터미널 환경에서 결과물을 보다보니, 데이터프레임이 예쁘게 나오지는 않네요. 그래도 빠르게 국내 ETF 훑어보는데는 쓸 수 있을거 같아요.
다음 포스팅에서는 매번 종목기초정보를 CSV 받는 대신 자동화 하는 방법으로 구현한 내용을 남겨볼까 합니다. 아직 구현하지는 않았고요.
감사합니다.
'자산관리' 카테고리의 다른 글
[리밸런싱] 22년 2월 연금저축 리밸런싱 (0) | 2022.02.03 |
---|---|
[리밸런싱] 22년 1월 연금저축 리밸런싱 (0) | 2022.01.04 |
[리밸런싱] 연금저축 리밸런싱을 해보자 (0) | 2021.12.05 |
[퀀트투자] 국내ETF 데이터 비교 (0) | 2021.11.19 |
[자산배분] 국내ETF 자산배분 전략 백테스트 결과 (0) | 2021.11.08 |