본문 바로가기
  • Rising Moon
개발로 돈 벌기/파이썬 금융 데이터 분석

금융 자산 데이터 시각화하기 (matplotlib)

by 라이징문 2022. 8. 3.
다양한 금융 자산의 실적을 비교하기 위해
가격 데이터를 바탕으로 차트를 그려보자.

yfinance로 가져온 데이터를
matplotlib를 사용해 간단하게 시각화해보자.

1.  데이터 준비하기

데이터를 준비하는 과정에 대한 설명이 궁금하다면

이전 글들을 참고하자.

 

>> 야후 파이낸스(yfinance)에서 금융 데이터 가져오기

>> 판다스로 주식, 암호화폐 데이터 다듬기

 

최종적으로 사용할 데이터를 가져오는 코드는 아래와 같다.

 

import pandas as pd
import yfinance as yf

from datetime import datetime

# 1. 가져올 데이터의 기간 지정 (예시)
start = "2018-08-02"
end = "2022-08-01"

# 2. 가져올 티커 심볼들 (예시)
symbol = ["TSLA", "KRW=X", "GC=F", "^GSPC", "^DJI", "BTC-USD"]

# 3. 데이터 가져오기
df = yf.download(symbol,start,end)

# 4. 가져온 데이터를 파일로 저장 (파일명 예시)
df.to_csv("my_assets_test.csv")

# 5. 저장된 데이터 불러와서 예쁘게 다듬기
df = pd.read_csv("my_assets_test.csv", header = [0,1], index_col = 0, parse_dates=[0])

# 6. 종가 데이터만 가져오기
close = df.Close

# 결과보기
close

 

close 결과 사진

 

1. 데이터 기간 설정

시작 일을 8월 2일로 지정했지만

실제 데이터는 8월 1일부터 시작한다.

끝나는 일도 하루 전까지만 데이터가 나온다.

이는 yfinance 라이브러리가 UTC 기준이기 때문이다.

UTC 시간은 한국 시간(KST) 기준 -9 시간이다.

따라서 한국 시간 8월 2일 00시는

UTC 시간으로 8월 1일 15시이다.

-> 일단 원하는 기간의 데이터가 나오도록 수정하면 된다.

 

2. 비교할 자산의 티커 심볼 리스트

비교하고자 하는 티커 심볼을 입력한다.

원하는 티커를 찾으려면 야후 파이낸스 사이트를 이용해보자.

이번엔 테슬라, 원 달러 환율, 금, 다우지수, 비트코인 가격 등을 이용해 보겠다.

 


2. matplotlib 차트 그리기

2-1. matplotlib란?

matplotlib는 데이터를 시각화하여 보여주는 라이브러리다.

다양한 그래프 종류와 기능을 제공하며

파이썬의 대표적인 데이터 시각화 도구이다.

 

많은 기능을 모두 잘 활용할 수 있다면 좋겠지만,

그렇게 하나씩 둘러볼 시간이 없다.

일단 우리에게 필요한 부분만 따라 사용하면서

익숙해지는 것을 목표로 하자.

 

한 번 작성한 코드는 지우지 않는 이상 사라지지 않는다.

반복해서 재사용하고

필요할 때마다 수정하며

잘 쌓아두기만 하면 된다.

 

그래도 matplotlib 사용법을 먼저 알고 시작하겠다면

아래 링크의 튜토리얼을 참고하면 된다.

 

https://wikidocs.net/book/5011

 

Matplotlib Tutorial - 파이썬으로 데이터 시각화하기

## 도서 소개 - 이 책은 파이썬의 대표적인 데이터 시각화 라이브러리인 Matplotlib의 사용법을 소개합니다. - 30여 개 이상의 다양한 주제에 대해 1 ...

wikidocs.net

 

2-2. matplotlib 설치

본인이 사용하는 파이썬 가상 환경에서

아래 코드로 설치해보자.

# 설치하기
python -m pip install -U matplotlib​

# 버전 확인하기
pip show matplotlib

# 결과
Name: matplotlib
Version: 3.5.2

 

2-3. 금융 자산 차트 그리기

# plt로 임포트
import matplotlib.pyplot as plt

# seaborn으로 시각화
plt.style.use("seaborn")

 

matplotlib에 포함된 서브 패키지인 pyplot을 사용하겠다.

관례적으로 plt 라는 이름으로 임포트한다.

 

style은 seaborn으로 지정한다.

차트나 그래프를 그리는 다양한 스타일 중 하나이다.

 

테슬라 차트 그리기

가져온 데이터에는 일부 빈 값(결측 값)이 존재한다.

비트코인은 휴장일이 없어서 모든 날짜에 대한 데이터가 존재하지만,

다른 자산은 휴장일에 해당하는 값이 없다.

따라서 아래의 코드에서 dropna()로 결측 값을 제거해주었다.

(이렇게 하지 않으면 차트가 듬성듬성 끊겨서 보일 것이다.)

 

# 테슬라 데이터에서 빈값을 제외하고 차트 생성 (차트와 폰트 사이즈 지정)
close.TSLA.dropna().plot(figsize=(20,10), fontsize=13)

# 차트 범례(legend) 크기 지정
plt.legend(fontsize=15)

# 차트 보기
plt.show()

 

결과 사진

이렇게 지정한 기간에 대해서 대략적인 가격 추이를 볼 수 있다.

사이즈의 입력 값들을 바꿔보며 어느 부분이 변경되는지도 테스트해보자.

 

가져온 모든 자산의 차트 그리기

# 모든 자산에 대해 결측값을 제외하고 사이즈를 지정해서 차트 만들기
close.dropna().plot(figsize=(20,10), fontsize=13)

# 범례 사이즈 지정
plt.legend(fontsize=15)

# 차트 보기
plt.show()

 

결과 사진

 

이렇게 모든 자산의 변화를 볼 수 있다.

우측 상단의 범례를 통해 자산별 색상 확인이 가능한다. 

왼쪽의 Y축은 가격을 나타내는데 비트코인 가격이 독보적이다.

심지어 한국 원화 가격으로 하면 훨씬 큰 값일 것이다.

그럴수록 지금 만든 차트는 아무런 의미가 없다.

 

바닥에 깔려있는 친구들은 비교는커녕 알아보기도 어렵다.

가격의 절댓값이 작은 친구들은 알아보기 너무 어렵다.

 

이로써 "종가 기준으로 가격 절대값을 비교하는 건 전혀 의미가 없다." 는 것을 알 수 있다.

지금 데이터는 주식, 지수 등이 섞여있는데

만약 주식의 가치를 계산하고 비교하려면
가격 외에 주식의 수도 고려해야 할 것이다.

 


3. 자산별 비교를 위한 정규화하기

위에선 우린 가져온 데이터로 차트를 그리는 것에는 성공했지만,

분석과 비교를 위해서 더 필요한 게 많다는 것을 알게 되었다.

이제부터는 전보다 조금 더 개선된 차트를 그려보자.

 

우선 준비해둔 데이터를 다시 보자

# 여러 자산의 종가 데이터를 close에 담아두었다.
close

 

결과 사진

 

자산마다 가격 범위가 다양하다.

그래서 정규화를 해서 비교하기 쉽게 만들어보자.

데이터의 시작 일을 기준으로 모든 상품을 동일한 위치에 놓고 (100)

마지막 날이 될 때까지 어떻게 변화하는지 살펴보는 것이다.

 

3-1. 비트코인 정규화하기

# 비트코인의 시작날 가격
close.iloc[0,0]

# 결과
7624.91015625


# 모든 날짜별 가격을 시작날 가격으로 나누기
close["BTC-USD"].div(close.iloc[0,0])

# 결과
Date
2018-08-01   1.0000
2018-08-02   0.9924
2018-08-03   0.9750
2018-08-04   0.9224
2018-08-05   0.9270
              ...  
2022-07-27   3.0073
2022-07-28   3.1271
2022-07-29   3.1220
2022-07-30   3.1025
2022-07-31   3.0606
Name: BTC-USD, Length: 1461, dtype: float64


# 기준 값을 100으로 하기 위해 100을 곱해준다.
close["BTC-USD"].div(close.iloc[0,0]).mul(100)

# 결과
Date
2018-08-01   100.0000
2018-08-02    99.2425
2018-08-03    97.5013
2018-08-04    92.2352
2018-08-05    92.7025
               ...   
2022-07-27   300.7321
2022-07-28   312.7104
2022-07-29   312.1956
2022-07-30   310.2490
2022-07-31   306.0613
Name: BTC-USD, Length: 1461, dtype: float64

 

첫 번째 코드에서 iloc을 사용해

비트코인 시작일 가격을 가져왔다.

iloc이란 행과 열의 순서를 정수로 입력해

특정 값을 추출해오는 방법이다.

따라서 close 데이터에서 비트코인의 첫날 가격은

가장 왼쪽에서 가장 첫 번째이기 때문에 iloc[0,0] 으로 가져올 수 있다.

전에 사용했던 loc은 정수가 아닌

칼럼명이나 조건식을 입력한다는 점에서 차이가 있다.

 

이어서 모든 날짜별 가격을 시작일 가격으로 나눠주었다.

그럼 당연히 첫 번째 날짜 가격은 1이 될 것이다.

이후 mul(100)으로 100을 곱해주면 시작 가격을 100으로 만들 수 있다.

 

최종 결과를 보면 22-07-27의 값은 300.7321이다.

따라서 21-08-01 부터 일 년만에 약 3배나 가격이 올랐다는 뜻이다.

 

3-2. 모든 자산 정규화해서 시각화하기

# 모든 자산의 첫날 가격 불러오기
close.iloc[0]

# 결과
BTC-USD    7624.9102
GC=F       1217.9000
KRW=X      1112.2000
TSLA         60.1680
^DJI      25333.8203
^GSPC      2813.3601
Name: 2018-08-01 00:00:00, dtype: float64


# 첫번째 값을 모두 100으로 정규화하기
norm = close.div(close.iloc[0]).mul(100)

norm

 

norm 결과 사진

정규화한 norm의 결과 사진을 보면

모든 시작 날의 가격이 100이 되었다.

 

이제 이것으로 plot을 그려서 시각화해보자.

 

# logy 설정으로 y축 로그 스케일링
norm.dropna().plot(figsize = (20, 15), fontsize = 13, logy=True)

# 범례 위치를 왼쪽 상단으로 이동
plt.legend(loc="upper left", fontsize = 15)

plt.show()

 

결측 값을 없애고 차트를 만드는 것은 이전과 동일하지만

logy = True 라는 옵션을 추가했다.

이는 Y축에 log 스케일을 적용한다는 뜻이다.

항상 해야 하는 것은 아니고

그나마 비교가 가능하게 하기 위해 적용했다.

왜냐하면 바로 테슬라와 비트코인 때문이다.

 

위에서 만든 차트의 결과를 보자.

 

100을 기준으로 1000이 되었다는 것은

100배가 상승했다는 뜻이다.

즉, 테슬라(보라색)는 10배가 넘게 상승했었고

비트코인(파란색)은 10배 가까이 상승했었다는 것이다.

또한 비트코인은 19년도 초반에 큰 하락이 오기도 했었다.

이처럼 정규화를 통해서

가격의 절대 비교가 아닌 상대 비교를 해볼 수 있었다.

 

다만, 지수, 금, 환율 등 다른 상품과 비교는 어렵다.

3년간 10배 가까이 상승할 정도로

변동성과 등락폭이 큰 종목을 비교할 때는

추가적인 정규화 과정이 필요하다는 것도 알 수 있었다.

 

이번에는 간단한 시각화가 목표였으니

부족한 부분은 다음에 또 마주쳤을 때 해결해보자.

 

지금까지 다뤘던 데이터를 저장해 두고 마치겠다.

 

# 자산별 종가 데이터를 close.csv 파일로 저장
close.to_csv("close.csv")

 

 

 

 

 

 

 

댓글