안녕하세요
K-인사이트 입니다.
24.03.26 가독성 향상을 위한 게시글 업데이트를 하였습니다. 구독자 분들 참고드립니다.
미국 장기채(TLT, TMF)에 대한 추가매수를 고려하던 중에 미국기준금리와 TLT 주가를 하나의 차트로 보여주기위한 작업을 하였습니다. M2(M2SL) 발행량에 따른 나스닥지수 그래프를 한눈에 보이도록하는 작업을 진행하였고 그 결과물을 공유드립니다.
TLT 주가와 미기준금리 그래프
우선, 국채 금리와 국채 가격은 반비례합니다. 기준금리가 오르면 신규 국채들의 가격이 올라가고 상대적으로 낮은 이율의 과거의 국채가격은 떨어집니다. 앞으로 기준 금리가 떨어질 것으로 예상되면 TLT, TMF 등의 미장기채를 추종하는 ETF를 매매하는 선택지가 생깁니다. 이는 향후 금리가 떨어지면 장기채의 국채가격이 오를 것이기 때문입니다.
통화 발행량(M2)과 나스닥지수 그래프
미국은 돈을 찍어냅니다. 이를 유동성이라고 부릅니다. 유동성이 풀리게되면 인플레이션이 발생합니다. 화폐가치가 낮아졌기 때문입니다. 현재 블로그를 쓰는 시점은 긴축 시점입니다. 따라서 통화를 과도하게 발행하지 않거나 발행된 통화를 회수합니다.
FRED 의 M2SL 지표를 확인하면 유동성을 체크할 수 있습니다. 그렇다면 미국 "나스닥 지수"와 함께 그래프를 그리면 통화량 발행과 지수의 관계를 어느정도 확인할 수 있습니다. 아래의 왼쪽 그래프는 통화량과 TLT 입니다. 오른쪽 그래프는 통화량과 나스닥 지수입니다.
통화 발행량(M2) 추이가 꺽이기가 무섭게 나스닥 지수가 하락으로 전환하였습니다.미장기채와 M2의 관계가 그래프 상으로는 없어보입니다.
파이썬 코드
위 그래프들을 그리기 위한 코드는 다음과 같습니다. 그래프를 그리기 위한 핵심 로직에 대한 요약을 우선 읽고 코드를 리딩합니다.
두 시계열 데이터 간의 인덱스 보정이 필요합니다. 만약, 보정을 하지 않을 경우 "x and y must have same first dimension, but have shapes" 에러가 발생하면서 그래프가 정상적으로 그려지지 않습니다.
또한, 그래프를 그리는 matplotlib, mplfinance 와 같은 라이브러리들은 결측값(NaN)이 존재할 경우 제대로된 그래프를 그리지 않습니다. 두 데이터의 특성과 차이를 살펴보겠습니다.
- 주가 데이터와 FRED 에서 제공하는 지수 데이터는 모두 시계열 데이터이고 인덱스의 타입이 DatetimeIndex 입니다.
- 단, 주식 시장은 휴일에 열리지 않으며 장이 쉬는 날이 있습니다. FRED 데이터도 정부의 발표일마다 추가되는 구조입니다.
이를 해결하기 위해서는 date_range 와 reindex 를 이용합니다. 그리고 NaN 보정을 위해 foward fill 을 사용합니다. 금리나 통화 발행량의 경우 발표 시점 이후로 값이 유지가 됩니다.
- 2024-01-01 에 X 지표에 Y 값이 발표되었다면 이 Y 값은 다음 발표일 2024-02-01 까지 유지됩니다.
따라서, backward fill 이 아닌 forward fill 이 적절한 선택입니다. 위의 보정 작업이 완료되었다면 TLT의 인덱스에 맞추어 데이터를 잘라냅니다. 이를 통해 TLT 데이터와 M2 그리고 미기준금리는 같은 인덱스를 가지게되므로 그래프를 그릴 수 있게됩니다.
또 하나의 팁은 두 데이터의 스케일이 다르다는 점입니다. 주가지수는 80~160사이의 값을 가지는 반면 기준금리의 경우 0~6 사이의 값을 가집니다. 이를 표준화해서 추세만 확인하거나 Secondary Y 축을 사용하면됩니다. 금융분야에서는 스케일을 보존하기 위해 Secondary Y축을 주로 사용합니다.
지금까지 고려했던 내용들을 코드로 녹인결과는 아래와 같습니다. 출력되는 그래프는 실행 결과를 참고하면됩니다. 아래의 코드는 JupyterNotebook 기준으로 하나의 코드블록에서 동작하도록 설정하였습니다.
따라서, 한 코드 블록에 아래의 코드를 모두 붙여넣으면 그래프가 출력됩니다. 이를 위한 설정은 InteractiveShell.ast_node_interactivity = "all" 입니다.
# This allows multiple outputs from a single jupyter notebook cell:
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
%matplotlib inline
import pandas as pd
import numpy as np
import FinanceDataReader as fdr
import matplotlib.pyplot as plt
import mplfinance as mpf
import os
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
#### 데이터를 로드
# TLT 데이터 미장기채를 추종
tlt = fdr.DataReader('TLT', start='2014', end='2024')
# TMF 데이터 TLT와 동일한 추세를 보이므로 생략함
tmf = fdr.DataReader('TMF', start='2014', end='2024')
# 통화발행량(M2) 데이터
m2 = fdr.DataReader('FRED:M2SL', start='2010', end='2024')
# 미기준금리 데이터
rates = fdr.DataReader('FRED:FEDFUNDS', start='2010', end='2024')
#### 2010부터 2024까지 Date를 일단위로 생성하고 reindex를 적용
dates_base = pd.date_range(start='2010', end='2024', freq='D')
m2_re = m2.reindex(dates_base)
rates_re = rates.reindex(dates_base)
#### reindex 과정에서 결측값을 처리 (forward fill 사용)
rates_re = rates_re.fillna(method='ffill')
m2_re = m2_re.fillna(method='ffill')
# 모든 처리가 끝났으므로 TLT 인덱스에 맞추어 reindex 적용
rates_re = rates_re.reindex(tlt.index)
#### 서브플롯을 이용해서 출력
dates = tlt.index
fig, ax1 = plt.subplots()
color = 'tab:red'
ax1.set_xlabel('Date')
ax1.set_ylabel('close', color=color)
ax1.plot(dates, tlt['Close'], color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx() # ax1과 동일한 x축을 공유하는 새로운 축 생성
color = 'tab:blue'
ax2.set_ylabel('fedfunds', color=color)
ax2.plot(dates, rates_re, color=color)
ax2.tick_params(axis='y', labelcolor=color)
fig.tight_layout() # 그래프 레이아웃 조정
plt.show()
#### mpf 라이브러를 통해서도 출력 (미국기준금리)
apds = [
mpf.make_addplot(rates_re['FEDFUNDS'].values, panel=0, secondary_y=True),
]
mpf.plot(
tlt,
addplot=apds,
figscale=1.8,
# volume=True,
style='yahoo',
type='line'
)
#### mpf 라이브러를 통해서도 출력 (M2 발행량)
m2_re = m2_re.reindex(tlt.index)
apds = [
mpf.make_addplot(m2_re['M2SL'].values, panel=0, secondary_y=True),
]
mpf.plot(
tlt,
addplot=apds,
figscale=1.8,
# volume=True,
style='starsandstripes',
type='line'
)
#### FinanceDataReader를 통해서 그래프를 그림
df = fdr.DataReader('FRED:NASDAQCOM,M2SL', start='2005', end='2024-10-30')
ax = df.plot(secondary_y='NASDAQCOM')
# 특정 기간을 음영으로 표시할 수 있음
ax = ax.axvspan('2007-12-01', '2009-03-30', color='gray', alpha=0.2)
이상입니다.
K-인사이트 올림.
'프로그래밍 > 데이터분석' 카테고리의 다른 글
데이터분석, 파이썬 판다스 데이터프레임 다양한 합치기 방법 (행, 열, merge, for, concat) (108) | 2024.04.23 |
---|---|
데이터분석, 파이썬 CSV 파일 불러오기, 경로 오류 처리, 한글깨짐(utf-8) 보정 (feat. numpy, pandas) (102) | 2024.04.22 |
Jupyter Notebook, No Attribute 에러 해결을 위한 모듈 리로드(reload) 방법 (53) | 2024.04.01 |