본문 바로가기
개발일지

주식 데이터 수집 - ETF 구성종목

by kirion 2022. 11. 21.
728x90
반응형

주식 데이터 수집 - ETF, 재무정보

financedatareader 패키지로 주가 데이터를 수집할 수 있었다.

2022.10.19 - [개발일지/주식 단타 전략] - 1. 주식 단타 전략 모니터링 시스템 - 파이썬 주식 가격 조회

 

그런데 재무정보라던지 ETF 구성 종목 및 비율 정보는 데이터로 제공하는 곳이 없다.

따라서 각종 투자지표를 만들 때 가격 외의 정보가 필요할 수도 있기 때문에 수집하는 방법에 대해 정리하고자 한다.

 


우선 ETF 구성 종목을 수집해보자.

상장되어있는 ETF의 종류도 많고 각 ETF가 어떤 종목을 얼마 큼의 비율로 담아놨는지도 공시가 되어있다. 

파이썬을 이용해 어떤 종목이 담겨있는지 비교해보고 싶어 ETF 종목을 크롤링해보았다.

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

 

url = "https://navercomp.wisereport.co.kr/v2/ETF/index.aspx?cmp_cd=102110"
html = requests.get(url, headers={'User-agent':'Mozilla/5.0'})
soup = BeautifulSoup(html.text, "lxml")
soup = list(soup)[1]

코드번호 102110은 TIGER 200 ETF이다. cmp_cd= 다음에 원하는 ETF 종목의 코드를 붙이고 해당 페이지의 내용을 수집하면 soup 변수에 엄청난 길이의 Text가 저장된다.

이중에 내가 관심이 있는 부분은 종목을 구성하고 있는 비율에 대한 정보이다. 

글자 찾기로 grid_data를 검색해보면 해당 정보가 담겨있는 위치를 알 수 있다.

CU_data 안에 각 종목의 이름과 날짜, 주식 수, 보유 비율이 저장되어있다.

영문 컬럼이랑 매칭을 해보면 아래와 같다.

  • TRD_DT : 날짜
  • AGMT_STK_CNT : 주식수
  • STK_NM_KOR : 종목 이름
  • ETF_WEIGHT : 비중
start_str = str(soup).index("grid_data")
end_str = str(soup).index("chartDraw")

soup_list = str(soup)[start_str+12:end_str]

위의 코드를 실행하면 원하는 정보만 빼낼 수 있다.

if len(soup_list) >1:
    end_str = soup_list.index("chart_data")
    soup_list = soup_list[:end_str-3]

    CU_list = []
    while True:
        idx = soup_list.find('}')
        name = soup_list[1:idx]
        soup_list = soup_list[idx+2:]
        CU_list.append(name)
        if len(soup_list)<10:
            break

    CU_df = pd.DataFrame(CU_list)

    cu_tmp = CU_df[0].str.split(",")

    CU_main = None
    for i in range(0,4):
        CU_main = pd.concat([CU_main,cu_tmp.str[i].str.split(":").str[1]],axis = 1)
    CU_main.columns = ["TRD_DT","AGMT_STK_CNT","STK_NM_KOR","ETF_WEIGHT"]

    CU_main.insert(0,"CODE",int(102110))
    CU_main["TRD_DT"] = CU_main["TRD_DT"].str.replace('"','')
    CU_main["STK_NM_KOR"] = CU_main["STK_NM_KOR"].str.replace('"','')
    CU_main["AGMT_STK_CNT"] = CU_main["AGMT_STK_CNT"].str.replace('.','')
    CU_main["ETF_WEIGHT"] = CU_main["ETF_WEIGHT"].str.replace('.','')
    CU_main.loc[CU_main["ETF_WEIGHT"]=="null","ETF_WEIGHT"] = 0
    CU_main["AGMT_STK_CNT"] = CU_main["AGMT_STK_CNT"].astype(int)/100
    CU_main["ETF_WEIGHT"] = CU_main["ETF_WEIGHT"].astype(int)/100

사용 목적에 맞게 정리를 한 후 결과를 보면,

이렇게 TIGER 200이 담고 있는 종목과 비중을 알 수 있다.

 

 

728x90
반응형

댓글