ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 미국 ETF 대표 종목 뽑아내기: python yahoo finance 활용
    금융퀀트/자산평가&프로그램매매 2024. 7. 14. 23:45
    반응형

    미국 ETF 종목 정보

    미국 ETF의 기본적인 정보는 ETF Database 사이트에서(https://etfdb.com/) 쉽게 조회할 수 있다. 추가적인 비용을 내면 해당 사이트에서 제공하는 다양한 분석 툴을 사용할 수 있다. 우리도 ETF 목록만 있다면 yahoo finance API를 활용해서 비교적 간단한 분석 정도는 수행 할 수 있다. 기본적인 ETF 목록이 나와있는 아래의 파일과 yahoo finance API를 이용해서 투자할 만한 ETF를 골라내 보자. 

    ETF_Ticker.csv
    0.12MB
    그림1: csv 파일 데이터 구조

     

    python yahoo finance 라이브러리 활용

    라이브러리 설치

    야후 파이낸스에서는 제공하는 각종 주식 정보를 볼 수 있는 라이브러리를 제공하고 있는데 아나콘다 프롬프트를 켜서 야후 파이낸스 라이브러리를 사용할 가상환경을 만든 뒤([키움API]아나콘다-파이썬 가상환경 만들기참조) 마찬가지로 아나콘다 프롬프트에서 pip install yfinance 명령어를 통해서 yahoo finance 라이브러리를 설치하면 된다.

    라이브러리 주요 함수

    라이브러리에 대한 간단한 설명은 공식 문서에서 확인할수 있다.(https://pypi.org/project/yfinance/) description 부분에서 다양한 함수를 아래 그림 2와 같이 소개하고 있는데, 대표적으로는 history 함수로 과거 가격을 가져올 수 있고, news  함수로 연관 뉴스를 불러올 수 있다.

    그림2: yahoo finance 공식문서

    미국 ETF 대표종목 찾기 : 자산가치가 가장 큰 ETF 찾기

    Ticker 를 이용한 데이터프레임 만들기 : get_df

    자산가치가 큰 대표 ETF를 찾기 위해선 먼저 Ticker 데이터를 입수하고 개별 Ticker마다 Total Asset 데이터를 입수한 뒤 하나의 데이터프레임을 만드는 과정을 거쳐야 한다. 먼저 Ticker 데이터를 입수하는 함수는(get_df) pandas 라이브러리의 read_csv(업로드한 파일이 csv 형식이다.) 함수를 쓰면 간단하게 구현이 가능하다.

    import yfinance as yf
    import pandas as pd
    
    file_path = "위 파일의 경로"
    
    def get_df(file_path: str):
        # 파일을 경로에서 csv 파일 읽어오기
        df = pd.read_csv(file_path)
        tickers = df
        return tickers

    ETF의 총자산 입수하기 : get_total_asset

    ETF의 총자산은 info 라는 속성에서 뽑아낼 수 있다. 먼저 yfinance 의 Ticker 클래스의 객체를 만들고, info 라는 속성에서 "totalAssets"라는 부분을 뽑아내면 된다. 코드로는 아래와 같이 구현할 수 있다. 

    import yfinance as yf
    import pandas as pd
    
    ...(생략)...
    
    def get_total_asset(ticker: str):
    	# ticker를 변수로 받아서 yfinance의 Ticker 클래스 객체인 stock을 만들기
        stock = yf.Ticker(ticker)
        # stock의 info 속성의 totalAssets 정보를 가져오기
        totalasset = stock.info.get("totalAssets")
        return totalasset

    Ticker 별 totalasset 을 보여주는 dataframe 구축 : get_etf_analysis_df

    get_df 함수를 이용해서 Tickers 라는 데이터 프레임을 만들고 Tickers의 개별 Ticker 마다 get_total_asset 함수를 통해서 total asset 의 값을 입수한 뒤 ticker, ticker명, total asset 으로 이루어진 데이터를 추가해 나가면 최종적인 데이터프레임을 얻을 수 있다. 이 데이터프레임을 totalasset 을 기준으로 내림차순 한 뒤 10개만 보여주도록 하면 미국의 TOP 10 ETF 데이터를 얻을 수 있다.

    import yfinance as yf
    import pandas as pd
    
    ...(생략)...
    
    def get_etf_analysis_df(file_path):
        # get_df 함수로 tickers 목록 불러오기
        Tickers = get_df(file_path)
        # 데이터를 집어넣을 빈 list 만들기
        data = []
        # tickers 목록에서 "티커"컬럼의 각 값을 i 에 넣어서 반복문 작성
        for i in Tickers["티커"]:
            ticker = i
            # Tickers 데이터에서 "티커"값이 i 와 같은 종목명 가져오기
            name = Tickers.loc[Tickers["티커"]==i, "종목명"].values[0]
            try:
            	# get_total_asset 함수로 ticker 의 total asset 값 가져오기
                totalasset = get_total_asset(i)
            except Exception as e:
            	# 에러시 에러 표시하고 total asset 값은 강제로 0 으로 입수
                print(f"Error Loading Data: {e}")
                totalasset = 0
            addtional_data = [ticker, name, totalasset]
            data.append(addtional_data)
        # 전체 데이터(data)로 dataframe을 만들고 컬럼은 "ticker", "name", "totalasset" 으로 구성 
        df = pd.DataFrame(data=data, columns=["ticker", "name", "totalasset"])
        # 중복된 데이터가 있을 경우 제거
        df = df.drop_duplicates(subset=["ticker"])
        # totalasset 기준으로 내림차순 정렬하고, 상위 10개 결과만 뽑아내기
        df = df.sort_values(by="totalasset", ascending=False).head(10)
        # 숫자로 소수점 둘째 자리까지 표시
        df["totalasset"] = df["totalasset"].map('{:,.2f}'.format)
        return df

    현재 미국 TOP 10 ETF는 아래 그림과 같다. 

    그림3: 미국 대표 ETF 찾기

    전체 실행코드를 나태나면 아래와 같다.

    import yfinance as yf
    import pandas as pd
    
    file_path = "위 파일의 경로"
    def get_df(file_path: str):
        df = pd.read_csv(file_path)
        tickers = df
        return tickers
    
    def get_total_asset(ticker: str):
        stock = yf.Ticker(ticker)
        totalasset = stock.info.get("totalAssets")
        return totalasset
    
    def get_etf_analysis_df(file_path):
        Tickers = get_df(file_path)
        data = []
        for i in Tickers["티커"]:
            ticker = i
            name = Tickers.loc[Tickers["티커"]==i, "종목명"].values[0]
            try:
                totalasset = get_total_asset(i)
            except Exception as e:
                print(f"Error Loading Data: {e}")
                totalasset = 0
            addtional_data = [ticker, name, totalasset]
            data.append(addtional_data)
        df = pd.DataFrame(data=data, columns=["ticker", "name", "totalasset"])
        df = df.drop_duplicates(subset=["ticker"])
        df = df.sort_values(by="totalasset", ascending=False).head(10)
        df["totalasset"] = df["totalasset"].map('{:,.2f}'.format)
        return df
    
    result = get_etf_analysis_df(file_path)
    print(result)
    반응형
Designed by Tistory.