미국 주식 데이터 수집 #2 데이터 수집 및 조합

 안녕하세요, 오늘은 미국 주식 데이터 수집 두 번째입니다. 지난 포스팅에서 저희는 Yahoo-fin 라이브러리를 활용해서 Yahoo Finance의 주식 데이터를 불러오는 방법을 알아보았습니다. Yahoo-fin의 다양한 함수들은 문서로 잘 정리되어 있으니 참고해주세요. 아래 링크도 달아놓겠습니다😁

 

theautomatic.net/yahoo_fin-documentation/

 

Yahoo_fin Documentation - Open Source Automation

Python's yahoo_fin package lets you download historical stock price data, real-time prices, fundamentals data, option prices, cryptocurrency info, and more!

theautomatic.net

 지난 포스팅에 이어서 각종 데이터를 조합하고 가공해서 이제 제가 직접 사용하고 싶은 형태로 구성해보도록 하겠습니다. 

 

1.주가 및 등락률

import datetime
from dateutil.relativedelta import relativedelta
 
crtn_ymd = datetime.datetime.now()-relativedelta(years=1) #일 년전
crtn_ymd = crtn_ymd.strftime('%Y%m%d')

# TICKER를 받아서 주가 및 등락률을 반환하는 함수
def get_price(ticker):
    df_price_info = si.get_data(ticker, start_date = crtn_ymd, interval="1d", index_as_date = False)
    length = len(df_price_info)
    
    #시기별 주가
    price = df_price_info.at[length-1,'adjclose']               # 최신 주가
    price1 = df_price_info.at[round(length/12*11), 'adjclose']  # 1개월전 주가
    price3 = df_price_info.at[round(length/12*9), 'adjclose']   # 3개월전 주가
    price6 = df_price_info.at[round(length/12*6), 'adjclose']   # 6개월전 주가
    price9 = df_price_info.at[round(length/12*3), 'adjclose']   # 9개월전 주가
    price12 = df_price_info.at[0, 'adjclose']                   # 12개월전 주가
    
    return [price, price1, price3, price6, price9, price12]

 

 제가 필요한 데이터는 현재의 주가와 1개월 전, 3개월 전, 6개월 전, 9개월 전, 12개월 전과 비교했을 때의 등락률입니다. 주식의 티커를 입력하면 해당 주식의 현재 주가, 1/3/6/9/12개월 등락률을 반환하는 함수를 생성했습니다. 1/3/6/9/12개월 전의 주가를 같이 수집하는 이유는 모멘텀 지표로 활용하기 위해서입니다.

 

모멘텀이란?

 주식시장에서의 모멘텀은 주가 추세의 속도가 증가하고 있거나 혹은 감소하고 있는지 등 주로 주식시장의 변화를 설명합니다. 오르는 종목이 계속 오르고, 떨어지는 종목이 계속 떨어진다는 특성을 말합니다.

 

2.거래대금 및 성과지표

# TICKER를 받아서 거래대금(10일 평균), OPM, ROE, ROA을 반환하는 함수
def get_stat(ticker):
    df_stat_info = si.get_stats(ticker)
    
    avg_vol = df_stat_info.at[8, 'Value']
    opm = df_stat_info.at[31, 'Value']
    roe = df_stat_info.at[32, 'Value']
    roa = df_stat_info.at[33, 'Value']
    
    return [avg_vol, opm, roe, roa]

 

 두 번째로 티커를 인자로 받아 거래대금, OPM, ROE, ROA를 반환하는 함수를 작성했습니다. 거래대금이 너무 작은 종목들은 매수와 매도 자체가 힘들기 때문에 예상치 못한 슬리피지를 과도하게 발생시킬 수 있습니다. 그래서 거래대금 데이터도 함께 수집하여서 종목을 추려낼 때 활용할 예정입니다.

 

3.시가총액 및 가치지표

# TICKER를 받아서 시가총액, PER, PEGR, PBR, PSR를 반환하는 함수
def get_valuation(ticker):
    df_valuation = si.get_stats_valuation(ticker)
    
    market_cap = df_valuation.iloc[0,1] 
    per = df_valuation.iloc[2,1]
    pegr = df_valuation.iloc[4,1]
    pbr = df_valuation.iloc[5,1]
    psr = df_valuation.iloc[6,1]
    
    return [market_cap, per, pegr, pbr, psr]

 

 세 번째는 티커를 입력해서 시가총액과 PER, PEGR, PBR, PSR을 리턴받는 함수입니다. 개인적으로는 슈퍼 가치 전략을 활용할 수 있도록 PCR 데이터도 제공했으면 좋겠는데, 없는게 참 아쉽네요😥 이후에 프로그램을 업그레이드하게 되면 PCR 데이터를 수집하는 방법도 고민해보아야 겠습니다.

 

4. 자산, 자본, 부채

# TICKER를 받아서 자산, 자본, 부채를 반환하는 함수
def get_balance(ticker):
    df_balance = si.get_balance_sheet(ticker)
    
    asset = df_balance.iloc[3,0]   # 자산
    equity = df_balance.iloc[1,0]  # 자본 
    liab = df_balance.iloc[0,0]    # 부채
    
    return [asset, equity, liab]

 다음은 기업의 재무 상태에 대한 데이터를 수집해보겠습니다. 재무 상태를 나타내는 다양한 지표들이 존재하지만, 저는 가장 기본적인 자산/자본/부채 데이터만 받도록 하겠습니다.

 

5.성장지표

# TICKER를 받아서 매출액, 영업이익, 순이익(분기별)을 반환하는 함수
def get_income(ticker):
    df_income = si.get_income_statement("aapl", yearly = False).loc[['totalRevenue','operatingIncome','netIncome'],:]
    
    cur_re = df_income.iloc[0,0]  # 최근 매출액
    cur_oi = df_income.iloc[1,0]  # 최근 영업이익
    cur_ni = df_income.iloc[2,0]  # 최근 순이익
    
    pre1_re = df_income.iloc[0,1]  # 전분기 매출액
    pre1_oi = df_income.iloc[1,1]  # 전분기 영업이익
    pre1_ni = df_income.iloc[2,1]  # 전분기 순이익

    pre2_re = df_income.iloc[0,2]  # 전전분기 매출액
    pre2_oi = df_income.iloc[1,2]  # 전전분기 영업이익
    pre2_ni = df_income.iloc[2,2]  # 전전분기 순이익
    
    return [cur_re, cur_oi, cur_ni, pre1_re, pre1_oi, pre1_ni, pre2_re, pre2_oi, pre2_ni]

 분기별로 데이터를 받아서 기업의 성장성을 확인할 수 있는 지표들입니다. 가장 안타까운 사실은 매출액, 영업이익, 순이익의 YoY를 구하기 위해서는 전년도 동분기 실적 데이터가 필요한데, 연도별 데이터를 산출하게 되면 연환산 데이터가 출력되어 비교가 어렵습니다😭 이번 데이터 수집의 가장 큰 아쉬움입니다..만 일단 기본적인 데이터를 모아놓고 다음 기회에 한 번 또 찾아보도록 하겠습니다

 

댓글()