호돌찌의 AI 연구소
article thumbnail

AMZN vs SPY

 

 

 

자산을 배분하는 이야기와는 거리가 있는 내용이지만, 저희가 요리를 하려면 재료를 손질을 해야 하듯이 어떤 데이터를 손질할지 다루는 내용을 이번에 이야기하고자 합니다. 처음에는 종목을 부르는 방법을 서술을 하고자 했지만, 채권이나 다른 나라 지수, 재무제표 등 다소 확장된 금융데이터를 수집하는 방법에 대해 이야기하고자 합니다. 

 

구글에 먼저 'python 개별종목' 이런 식으로 검색하면 아래와 같은 결과가 나타납니다. 

조금씩 읽다보면 다양한 패키지(FinanceDatabase, quantstats, yfinance, mplfinance, FinanceDataReader 등)와 API(Naver Finance API, FMP API 등)들을 소개해줍니다. 이번 글에서는 작년부터 제가 여러 가지 다양한 Tool들을 물고 뜯고 맛보고 했던 것들 중 맘에 드는 패키지를 위주로 소개해보겠습니다.

 

 

1. yfinance

가장 기초적으로 사람들이 많이 사용하는 패키지인 것 같습니다. 야후파이낸스에 있는 종목 정보들을 긁어 옵니다. 

각종 주식, 선물, 지수 실시간 조회가 가능하며 뉴스나 지표들 다양한 정보들을 살펴볼 수 있는 곳입니다. 

 

pip install yfinance

위와 같이 쉽게 설치하시고 티커들을 아래와 같이 입력하여 데이터를 부르실 수 있습니다. 배당도 계속 늘고 실적도 좋고 기술주 중 반 농담으로 상대적 안전자산이라고 평을 받는 마이크로소프트와 작년에 제일 핫했던 테슬라를 예시로 들어보겠습니다. 

 

import yfinance as yf

msft = yf.Ticker("MSFT")
tsla = yf.Ticker("TSLA")
tsla.history().tail(5)

최근 1주일 테슬라의 가격 히스토리

 

티커 object에 여러 property들이 있는데 예시를 들어드리겠습니다.

msft.institutional_holders

기관 보유 주식 수량을 알 수 있다.

뱅가드, 블랙록과 같이 큰 자산운용사들의 보유 수량과 비중의 현황을 알 수 있습니다. 분기별로 발표를 하는 것으로 알고 있습니다. 

 

ax = msft.dividends.tail(55).plot(figsize=(15,5))

마이크로소프트의 배당

위의 그래프처럼 마소는 분기별로 배당을 꾸준히 늘리고 있는 것을 알 수 있습니다.

 

tsla.splits

분할 시기

작년 8월 말에 5대 1 주식분할을 했던 히스토리를 알 수 있습니다. 분할하고 9월에 감쪽같이 하락했었던 기억이 나네요. 엔비디아도 분할 이후 어떤 방향을 보일지 기대가 됩니다. 

 

msft.quarterly_balance_sheet

마이크로소프트의 대차대조표

대차대조표말고도 더 찾아보시면 현금흐름표, 손익계산서 정보까지 받아보실 수 있습니다. 

 

tsla.recommendations.tail(20)

애널리스트들의 투자의견

recommendation method를 이용한 최근 20건의 테슬라 투자 의견 히스토리입니다. 중립/매수/매도 의견을 내기도 하지요. 모건스탠리, JP Morgan 등 계속 유지의 의견을 내고 있네요.

 

import pandas as pd
pd.concat([msft.calendar,
           tsla.calendar], axis = 1)

실적 발표일

마소와 테슬라의 실적 발표일을 calendar를 이용하여 알 수 있습니다. 한국시간으로는 이번 달 28일(마소), 27일(테슬라) 아침에 눈뜨면 발표가 나있을 것 같네요. 다음 주 미국 빅 테크 기업들의 실적 발표가 줄줄이 예정되어있습니다. 현재 미국 3대 지수 신고가를 찍은 상태이기 때문에 그만큼 실적 발표에 따라 어떻게 움직일지 기대가 됩니다.

관심 있는 티커들에 대해 원하는 정보들을 모아서 다양하게 활용을 해보시면 될 것 같습니다. 

 

이외에 더 많은 나라들의 주식에 대한 가격과 정보들을 확인할 수 있습니다. 아래 깃허브에서 quick start를 참고하시면 될 것 같습니다. 

https://github.com/ranaroussi/yfinance

 

GitHub - ranaroussi/yfinance: Yahoo! Finance market data downloader (+faster Pandas Datareader)

Yahoo! Finance market data downloader (+faster Pandas Datareader) - GitHub - ranaroussi/yfinance: Yahoo! Finance market data downloader (+faster Pandas Datareader)

github.com

 

 

 

 

 

 

 

2. quantstats

설치하실 때 아래와 같은 dependency가 잡혀있습니다. 참고하시면 될 것 같습니다.

Python >= 3.5+
pandas (tested to work with >=0.24.0) numpy >= 1.15.0
scipy >= 1.2.0
matplotlib >= 3.0.0
seaborn >= 0.9.0
tabulate >= 0.8.0
yfinance >= 0.1.38
plotly >= 3.4.1 (optional, for using plots.to_plotly())

마찬가지로 pip로 설치를 실시합니다. 

pip install quantstats

quantstats는 포트폴리오를 심층적으로 분석하고 다양한 metric을 제공하여 보여줍니다. 제가 제일 처음 주식했을 때 매수한 종목이며, 개인적으로 저에겐 아픈 손가락이었던 종목, 작년 여름부터 횡보를 보이다가 최근 불을 뿜은 아마존입니다. (역시 좋은 수익률을 얻으려면 인내심이 좋아야 하는 것 같습니다.) 다운을 받은 데이터는 종가 데이터가 아닌 일별 수익률을 리턴합니다. 

%matplotlib inline
import quantstats as qs

# fetch the daily returns for a stock
stock = qs.utils.download_returns('AMZN')

stock
Date
1997-05-15         NaN
1997-05-16   -0.117021
1997-05-19   -0.012049
1997-05-20   -0.042683
1997-05-21   -0.127389
                ...   
2021-07-19   -0.006727
2021-07-20    0.006649
2021-07-21    0.003361
2021-07-22    0.014736
2021-07-23    0.005115
Name: Close, Length: 6088, dtype: float64

 

plots.snapshot을 활용하면 누적수익률, 낙폭 비율(Drawdown), 일별 주가상승률(Daily return)을 아름답게 보여줍니다. 

 

qs.plots.snapshot(stock, title='Amazon Performance')

2000년 초반에 시기에는 아마존이 95% 가까이 녹았었던 시절이 있었네요. 

 

이제는 reports.metrics을 활용하여 다양한 지표를 뽑을 수 있습니다. 

qs.reports.metrics(stock, mode = 'basic')
                    Strategy
------------------  -----------
Start Period        1997-05-15
End Period          2021-07-16
Risk-Free Rate      0.0%
Time in Market      100.0%

Cumulative Return   182,383.26%
CAGR%               36.41%

Sharpe              0.82
Sortino             1.31
Sortino/√2          0.93

Max Drawdown        -94.4%
Longest DD Days     3602

Gain/Pain Ratio     0.18
Gain/Pain (1M)      1.09

Payoff Ratio        1.12
Profit Factor       1.18
Common Sense Ratio  1.33
CPC Index           0.68
Tail Ratio          1.13
Outlier Win Ratio   5.42
Outlier Loss Ratio  4.55

MTD                 3.88%
3M                  7.22%
6M                  12.88%
YTD                 9.72%
1Y                  18.77%
3Y (ann.)           25.36%
5Y (ann.)           37.21%
10Y (ann.)          32.58%
All-time (ann.)     36.41%

Avg. Drawdown       -7.12%
Avg. Drawdown Days  52
Recovery Factor     1931.94
Ulcer Index         inf

리포트 형태로 보여줍니다. 97년 5월 15일부터 아마존 주식을 들고 있었다면, 누적 수익 약 182,000%를 얻으실 수 있습니다. 또한 연평균 수익률(CAGR) 36% 임을 알 수 있는데, 이는 2010년대 이후로 빅 테크 기업의 어마어마한 성장 때문에 연평균 수익률이 다소 높게 측정됨을 알 수 있습니다.

각종 지표인 sharpe, sortino 지수도 제공해줍니다. (지표에 대해 궁금하신 점이 있다면 댓글로 남겨주시면 친절하게 대답해드리겠습니다.)

argument에 mode = 'basic' 대신 'full'으로 바꾸시면 평균 월별 수익, 손실, 승률 등 더욱 다양한 지표를 알려주는 것으로 알고 있습니다. 

 

benchmark_stock = qs.utils.download_returns('SPY')
qs.reports.html(stock, benchmark = benchmark_stock, 
                title = 'AMZN vs SPY', 
                output = SAVE_FILE_PATH + '/comparison_amzn_vs_spy.html')

S&P 500을 추종하는 패시브 ETF인 SPY를 벤치마크로 두고 아마존과 비교를 한 결과는 이 글의 썸네일과 같습니다.

reports.html을 하시면 리포트 형태를 html 파일로 원하는 경로에 저장하여 아래처럼 구경을 하실 수 있습니다. html 파일은 첨부를 해두겠습니다. 

comparison_amzn_vs_spy.html
2.40MB

아마존 주식 하나의 case만을 가지고 이런 결과를 얻었습니다. 응용하는 방법은 이제 무궁무진합니다. 예를 들어 내가 원하는 종목 10개를 선정하고 동일비중으로 매수한다고 가정하고 일별 수익률의 평균을 산출해 판다스 시리즈로 만든 후 대입하여 SPY와 비교하는 방법도 좋은 방법이 될 것 같습니다. 추후에 제가 실제로 돌리고 있는 전략을 한번 시각화하는 글도 써보겠습니다. 자세한 내용은 아래 깃허브를 참고하시길 바랍니다.

 

 

https://github.com/ranaroussi/quantstats

 

GitHub - ranaroussi/quantstats: Portfolio analytics for quants, written in Python

Portfolio analytics for quants, written in Python. Contribute to ranaroussi/quantstats development by creating an account on GitHub.

github.com

 

3. FinanceDataReader

위에서 소개된 것 말고도 이 패키지는 더욱 다양한 예시를 보여줘서 소개를 하고자 합니다. 아래와 같이 설치를 합니다.

pip install finance-datareader

여러 세계 지수들도 보실 수 있고, 국내 주식 종목도 확인을 할 수 있습니다. 깃허브에서 Quick Start를 참고하셔서 활용을 빨리 해보실 수 있으며 아래에 내려가시면 더 자세한 튜토리얼들이 소개되어있습니다. 튜토리얼을 공부하시는 게 큰 도움이 됩니다. 

저는 이 글에서 보여주고자 하는 FRED 지표들을 일부 소개할 예정입니다. 주식을 하는 데 있어서 FRED를 모르고 주식하는 것은 정말 위험한데요. 그 이유는 아래 영상을 보시면 좋을 것 같습니다.

https://youtu.be/TJ6bqDSK-YU

간단히 FRED를 소개하자면 미국 연방준비은행 통계 사이트입니다. 여기에서 나타나는 통계 지표들을 바탕으로 전체적인 주식시장의 흐름을 파악하기에 유용합니다. 여기에 제시된 지표들을 부르는 방법을 소개해보고자 합니다. 

 

첫 번째 예시로는 주간 실업수당 청구 건수(https://fred.stlouisfed.org/series/ICSA)와 나스닥을 비교해보겠습니다. 주 단위 신규 실업수당청구 건수는 경기가 나빠지는 경우에는 후행지표로 작동하지만, 좋아지는 경우에는 선행지표로 활용할 수 있습니다. 2019년 이후를 예시로 비교해보겠습니다.

df = fdr.DataReader(['NASDAQCOM', 'ICSA'], start='2019', end='2021-06-30', data_source='fred')
ax = df.plot(secondary_y='NASDAQCOM')
ax = ax.axvspan('2018-12-01', '2021-06-30', color='gray', alpha=0.2)

코로나 시기에 실업수당청구 건수가 엄청나게 올라간 것을 확인할 수 있습니다. 그 이후로 나스닥은 불을 뿜은 결과를 확인할 수 있습니다. 

 

두 번째 예시로는 실업률(https://fred.stlouisfed.org/series/UNRATE)입니다. 불황에는 후행지표, 경기회복에는 동행지표로 작동합니다. 연준은 실업률을 최소화하는 것을 목표로 하고 있습니다. 

df = fdr.DataReader(['NASDAQCOM', 'UNRATE'], start='2019', data_source='fred')
ax = df.plot(secondary_y='NASDAQCOM')

마찬가지로 코로나 시기에 실업률이 엄청 오른 것을 확인할 수 있습니다. 

소비자심리지수, 주택판매지수, M2 통화량 등 다양한 경기지표들을 확인할 수 있습니다. 나스닥 말고 다른 지수들과 비교하여 상관관계를 확인해보는 방법도 있습니다. 

 

세 번째 예시로는 미국 10년물 국채 금리 채권수익률을 확인해보겠습니다. 

df = fdr.DataReader('US10YT=X', start = '2020-01-01', end = '2021-07-23')
ax = df['Close'].plot(figsize=(15,5))

코로나 이후로 국채금리가 상당히 낮게 형성되어있다가 2월부터 갑자기 급상승하여 미국 성장주가 조정을 받았었습니다. 국채금리와 상관관계가 무조건 있다고는 이야기할 수는 없지만 성장주를 매매하는 사람들은 유의미하게 살펴볼 지표입니다. 

 

참고한 깃허브 주소는 아래와 같습니다.

https://github.com/FinanceData/FinanceDataReader

 

GitHub - FinanceData/FinanceDataReader: Financial data reader

Financial data reader. Contribute to FinanceData/FinanceDataReader development by creating an account on GitHub.

github.com

 

제가 유의미하다고 생각하는 패키지들을 소개해봤습니다. 제가 소개한 내용들은 일부분이지만 공부할 요소들이 많이 있는 라이브러리입니다. 많은 종목 데이터, 거시경제 데이터 등을 재료를 모으는 방법은 여기까지입니다. 이후에 요리하는 방법은 정말 무궁무진하게 남아있습니다. 다음 주에는 업로드될 콘텐츠는 요리법 중 하나를 소개하고자 합니다. 


아래는 블로그 주인장의 토스 익명 후원 링크입니다. 글이 너무 너무 도움되거나 흡족스러웠다면 후원해주시면 감사하겠습니다.

https://toss.me/hotorch

 

hotorch님에게 보내주세요

토스아이디로 안전하게 익명 송금하세요.

toss.me

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!