[파이썬] 실습 - FRED 유동성 데이터 불러와서 시각화해보기






pandas와 datareader, matplotlib, 야후 파이낸스(yfinance)를 불러온다.
Eric.K님께서 인터뷰때 야*파이낸스나 인*스팅 닷컴 데이터는 클리닝이 안되어 있어서 쓰면 안된다고 하셨지만, 이걸로 알고리즘 트레이딩을 하려는 건 아니고, 단순 시각화 공부 측면이니 일단 넘어가는 걸로...

데이터리더를 통해 FRED에서 지준금, 역레포 잔고, TGA잔고를 불러와서 각각 reserves, rrp, tga에 할당해준다. 기간은 넉넉하게 세팅. 트레이딩뷰와 동일하게 FRED 티커를 그대로 쓰면 되어서 티커만 알면 어렵지는 않았다.

S&P500 데이터도 야후파이낸스에서 불러온다.

3-1. 시장유동성 (market_liquidity)라는 데이터프레임을 하나 만들어주는데, 이 데이터프레임은 위에서 할당해준 지준금, 역레포 잔고, TGA잔고를 pd.concat()을 이용하여 열로 합친 것이다. 참고로 concat은 Concatenate의 줄임말로 '엮다, 연결하다'라는 의미를 가진 단어이다. axis=1은 열을 기준으로 합치겠다는 의미이다. axis=0은 행, axis=1은 열을 나타낸다.
3-2. 세개의 데이터를 하나의 데이터프레임으로 합친 후, 각 데이터의 시작기간이 다르기 때문에, 시작시점을 동일하게 맞춰주기 위해, dropna()를 사용하여 빈칸을 날려준다.
3-3. 데이터프레임의 열이름을 지정해준다. 각각 지준금(Reserves), 역레포(Reverse Repo), TGA계좌(TGA Account)로 지정했다.


4-1. 먼저 기본 축을 설정해준다. 첫번째 축(ax1)을 그리는데, 사이즈가 가로 10인치, 세로 6인치라는 뜻이다.

4-2. 아까 하나로 합쳐준 market_liquidity 데이터프레임의 각 열을 선(Plot)으로 나타내준다. 불러올 열 이름, 색상, 선 두께, 라벨명을 입력해준다. 이 부분은 트레이딩뷰 파인스크립트와 거의 다르지 않다.

4-3. set_xlim()은 x축의 기간범위를 설정해주는 역할이다. 말그대로 x축을 lim즉, limit(제한)하겠다는 의미이다.
인덱스가 기간이니 기간을 기준으로 설정해준다.
4-4. axhline()은 가로선(Horizontal line)을 그린다는 뜻이다. y축값은 0이며, 검은색, 선 스타일은 점선(Dashed)이다.
4-5. set_ylabel()은 Y축의 라벨이다. 잔고이니 '잔액'으로 표시.
4-6. legend()는 전설이 아니라 '범례'라는 뜻이다. 나도 항상 legend가 무슨뜻인지 항상 궁금했는데, 범례라는 의미가 있었다. 좌측 상단(upper left)에 표시해준다.
여기까지 하면 이런 차트를 얻을 수 있다.


4-7. 이제 두번째 데이터인 S&P500도 같은 차트에 나타내주어야 한다. X축인 기간을 공유할 것이기 때문에 twinx()를 통해 x축을 복사해준다.
4-8. 동일하게 plot()을 사용하여 S&P500의 종가(Close), 색상, 선 두께, 라벨이름을 지정해준다.
4-9. Y축 라벨이름은 S&P500으로 지정해준다.
4-10. 범례는 유동성 지표의 범례와 겹치지 않도록 우측 상단에 추가해준다.

유익한 초보자해설을 써주고 계시는 티모씨님께서 시중 지준금 유동성을 가늠하기 위한 지표로 '지준금 - 역레포 - TGA잔고'라는 일명 다이나믹 듀오 라인(다듀라인)을 제시해주신 적이 있는데, 세가지 재료가 모였으니 내친김에 이 지표도 만들어보도록 하자.

5-1. 다듀라인(DDline) = 지준금(Reserves) - 역레포(Reverse Repo) - TGA잔고(TGA Account)로 정의해준다.
5-2. DD라인을 검은색 플롯으로 그린다.
5-3. 마찬가지로 범례를 지정해준다.

검은색 선으로 다듀라인이 시각화 된 것을 확인할 수 있다.
이전에 매크로 통합지표를 만들기 위한 글에서 여러 매크로 데이터들의 표준화 방법중 하나로 백분위 지표를 이용한 적이 있었다.
그럼 과거 1년간의 유동성 레벨 중 현재는 어느 수준에 와있는가를 한눈에 파악하기 위해 백분위화를 해보자.
계산식은 다음과 같다.
과거 250일간의 최고와 최저 수준중에서 현재는 몇% 상단에 위치하는가이다.
이 내용을 함수로 정의해준다.

def로 함수를 선언하고, 함수의 변수는 x값과 기간(window)다. x값에 다듀라인값을 넣어줄 예정이다.
high_x = 250일간의 고가를 계산한다.
low_x = 250일간의 저가를 계산한다.
result = 계산식의 결과를 계산한다.
return = 최종값(result)을 반환한다.

그리고 이렇게 정의한 함수에 데이터(다듀라인)와 기간(52주)을 집어넣는다. 52인 이유는 FRED 유동성데이터가 주간 데이터이기 때문에 1년 = 250영업일 = 52주를 기준으로 한 것이다.

그 뒤 플롯해주면

이렇게 나온다.
트레이딩뷰와 비교해서 교차검증해보면

아주 잘 나오는 것을 확인할 수 있다.
유동성 개별 지표
import pandas_datareader as pdr
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
reserves = ...![[파이썬] 3. 판다스 기초 - 시리즈와 데이터프레임](https://post-image.valley.town/rHonDjiw8FlFXv8t0xB1-.png)
![[파이썬] 2. 제어문과 함수, 패키지](https://post-image.valley.town/Gn101iI4BDWNzapmg3-Ru.png)
![[파이썬] 1. 파이썬 기초(데이터 타입)](https://post-image.valley.town/o3H8nkUBOX9GWxpfotvAP.png)
![[파이썬] 0. 시작하며](https://contents.kyobobook.co.kr/sih/fit-in/400x0/pdt/9791192469829.jpg)

좋은 글 감사합니다! 야후 파이낸스 데이터 안정성이 불안하시면 Fred 데이터는 fredapi를 사용해서 간단하게 가져올 수 있습니다 (다만 야후 파이낸스 api도 아마 fredapi에서 데이터를 가져오고 있지 않을까 생각합니다. 즉 큰 문제 없지 않을까 생각합니다 ㅎㅎ)

앗 꿀팁 감사합니다 ㅎㅎ FRED가 지표 발표후에 반영이 얼마나 빠른지, 실시간성이 어느 정도 되는지가 가끔 궁금하긴 한데, 그래도 무료데이터들 중에서는 제일 정확하긴 하더라구요!

캬~ 이렇게 상세한 과정을 지켜볼 수 있다는 게 축복이네요. 화이팅! 매일 지켜보고 있습니다! ㅎㅎ

정말 매일매일 응원해주셔서 힘이 납니다 ㅎㅎㅎ 파이팅 해보겠습니다!

하나씩 보고 있는데, 참 신기합니다. 혹시 아이디 하나에 담겨있는 사람이 여럿이 아닐까 생각하기도 합니다. 아이디 공유한다는 의미가 아니라, 한 사람이 이런 열정을 보이는게 물리적으로 가능한가 싶어서 그렇습니다. ^^ 감탄하면서 어깨너머로 뭐 하시는가 구경하는 재미만 보고 갑니다. 연재 감사합니다.