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

테슬라 주식 날짜별 가격 변화와 수익률 계산하기

by 라이징문 2022. 8. 9.
상대 가격과 비율은 금융 데이터 분석에서 중요한 개념이다.
가격 그 자체보다 가격 변화가 더 중요하고 의미 있다는 것이다.
가격이 변화한 비율을 수익률이라 할 수 있다.
수익률(%) = (현재가 - 이전가) / 이전가 * 100

이번에는 여러 금융자산 중에 테슬라를 선택해서
날짜별 가격 변화와 일별 수익률을 계산해보자.

 

- 데이터 준비

아래 링크의 마지막 부분을 보면

여러 금융 상품의 종가 데이터만 "close.csv" 파일로 저장해두었다.

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

 


1.  데이터 로드 및 전처리

# 라이브러리 임포트
import pandas as pd
import matplotlib.pyplot as plt

# 가격 표시 소수점 자리수 지정
pd.options.display.float_format = '{:.2f}'.format

# close.csv 가져오기
close = pd.read_csv("close.csv", index_col = "Date", parse_dates = ["Date"])

close

close 결과 사진

위 결과에서 필요한 데이터만 가져와보자.

 

dropna() 로 결측 값(NaN)을 제거하고,

to_frame() 으로 데이터프레임 자료형으로 만들고,

copy() 로 복사본을 저장한다.

그리고 컬럼 헤더를 TSLA 티커에서 Price로 변경하겠다.

 

# 결측값을 제외하고 데이터프레임으로 복사하기
tsla = close.TSLA.dropna().to_frame().copy()

tsla

# 결과
		TSLA
Date	
2018-08-01	60.17
2018-08-02	69.91
2018-08-03	69.63
2018-08-06	68.40
2018-08-07	75.91
...	...
2022-07-25	805.30
2022-07-26	776.58
2022-07-27	824.46
2022-07-28	842.70
2022-07-29	891.45
1006 rows × 1 columns

# 컬럼 헤더를 Price로 변경, inplace로 변경 적용하기
tsla.rename(columns = {"TSLA":"Price"}, inplace = True)

tsla

# 결과
		Price
Date	
2018-08-01	60.17
2018-08-02	69.91
2018-08-03	69.63
2018-08-06	68.40
2018-08-07	75.91
...	...
2022-07-25	805.30
2022-07-26	776.58
2022-07-27	824.46
2022-07-28	842.70
2022-07-29	891.45
1006 rows × 1 columns

 

가격의 변화를 알기 위해서는 비교할 기준이 있어야 한다.

당일 가격은 전날 가격을 기준으로 얼마나 오르거나 내렸는지 비교할 수 있다.

 

현재 날짜별 가격을 한 칸씩 아래로 밀면 전날 가격이 된다.

이렇게 가져온 전날 가격에 대한 컬럼을 추가로 만들어보자.

컬럼명은 "P_lag"로 하고,

shift() 메서드를 사용해 한 칸씩 밀어낸다.

 

# 전날 가격 컬럼 생성하기
tsla["P_lag"] = tsla.shift(periods = 1)

tsla

# 결과
		Price	P_lag
Date		
2018-08-01	60.17	NaN
2018-08-02	69.91	60.17
2018-08-03	69.63	69.91
2018-08-06	68.40	69.63
2018-08-07	75.91	68.40
...	...	...
2022-07-25	805.30	816.73
2022-07-26	776.58	805.30
2022-07-27	824.46	776.58
2022-07-28	842.70	824.46
2022-07-29	891.45	842.70
1006 rows × 2 columns

2. 절대 가격 차이 계산하기

2-1. 직접 계산하기

# 오늘 가격에서 어제 가격을 빼고 P_diff 컬럼으로 추가
tsla["P_diff"] = tsla.Price.sub(tsla.P_lag)

tsla

# 결과
		Price	P_lag	P_diff
Date			
2018-08-01	60.17	NaN	NaN
2018-08-02	69.91	60.17	9.74
2018-08-03	69.63	69.91	-0.27
2018-08-06	68.40	69.63	-1.24
2018-08-07	75.91	68.40	7.52
...	...	...	...
2022-07-25	805.30	816.73	-11.43
2022-07-26	776.58	805.30	-28.72
2022-07-27	824.46	776.58	47.88
2022-07-28	842.70	824.46	18.24
2022-07-29	891.45	842.70	48.75
1006 rows × 3 columns

 

sub() 으로 뺄셈한다.

 

그 결과는 P_diff 라는 새로운 컬럼으로 추가한다.

 

2-2. diff 메서드 사용하기

# diff 메소드를 활용
tsla["P_diff2"] = tsla.Price.diff(periods=1)

tsla

# 결과
		Price	P_lag	P_diff	P_diff2
Date				
2018-08-01	60.17	NaN	NaN	NaN
2018-08-02	69.91	60.17	9.74	9.74
2018-08-03	69.63	69.91	-0.27	-0.27
2018-08-06	68.40	69.63	-1.24	-1.24
2018-08-07	75.91	68.40	7.52	7.52
...	...	...	...	...
2022-07-25	805.30	816.73	-11.43	-11.43
2022-07-26	776.58	805.30	-28.72	-28.72
2022-07-27	824.46	776.58	47.88	47.88
2022-07-28	842.70	824.46	18.24	18.24
2022-07-29	891.45	842.70	48.75	48.75
1006 rows × 4 columns

# 직접 계산한 P_diff와 P_diff2가 동일한지 확인하기
tsla.P_diff.equals(tsla.P_diff2)

# 결과
True

 

diff() 로 값의 차이를 구해 P_diff2 컬럼을 만들었다.

periods=1 옵션으로 바로 이전 행의 값과 계산하는 것이다.

즉, P_lag를 구하는 과정이 없어도 계산할 수 있다.

 

이렇게 가격 차이를 계산해 볼 수 있지만,

같은 10달러의 변화가 있더라도

100 -> 110과 20 -> 30 은 큰 차이가 있다.

따라서 이 방법으로는 서로 다른 금융 상품을 비교하긴 어렵다.

 


3.  상대 가격 차이 계산하기

3-1. 직접 계산하기

# 전날 가격으로 나누고 1을 뺀 값을 Returns 컬럼에 저장
tsla["Returns"] = tsla.Price.div(tsla.P_lag) - 1

tsla

# 결과
		Price	P_lag	P_diff	P_diff2	Returns
Date					
2018-08-01	60.17	NaN	NaN	NaN	NaN
2018-08-02	69.91	60.17	9.74	9.74	0.16
2018-08-03	69.63	69.91	-0.27	-0.27	-0.00
2018-08-06	68.40	69.63	-1.24	-1.24	-0.02
2018-08-07	75.91	68.40	7.52	7.52	0.11
...	...	...	...	...	...
2022-07-25	805.30	816.73	-11.43	-11.43	-0.01
2022-07-26	776.58	805.30	-28.72	-28.72	-0.04
2022-07-27	824.46	776.58	47.88	47.88	0.06
2022-07-28	842.70	824.46	18.24	18.24	0.02
2022-07-29	891.45	842.70	48.75	48.75	0.06
1006 rows × 5 columns

 

div()를 활용해 당일 가격을 전날 가격(P_lag)으로 나눠준다.

여기서 1일 빼주면 날짜별 Returns (수익률)을 알 수 있다.

백분율(%)로 보고 싶다면 100을 곱하면 된다.

 

3-2. pct_change 메서드 사용하기

# pct_change 메서드를 활용
tsla["Returns2"] = tsla.Price.pct_change(periods=1)

tsla

# 결과
		Price	P_lag	P_diff	P_diff2	Returns	Returns2
Date						
2018-08-01	60.17	NaN	NaN	NaN	NaN	NaN
2018-08-02	69.91	60.17	9.74	9.74	0.16	0.16
2018-08-03	69.63	69.91	-0.27	-0.27	-0.00	-0.00
2018-08-06	68.40	69.63	-1.24	-1.24	-0.02	-0.02
2018-08-07	75.91	68.40	7.52	7.52	0.11	0.11
...	...	...	...	...	...	...
2022-07-25	805.30	816.73	-11.43	-11.43	-0.01	-0.01
2022-07-26	776.58	805.30	-28.72	-28.72	-0.04	-0.04
2022-07-27	824.46	776.58	47.88	47.88	0.06	0.06
2022-07-28	842.70	824.46	18.24	18.24	0.02	0.02
2022-07-29	891.45	842.70	48.75	48.75	0.06	0.06
1006 rows × 6 columns

# equal 메서드로 동일한지 확인
tsla.Returns.equals(tsla.Returns2)

# 결과
True

 

pct_change() 메서드를 활용해 바로 수익률(Returns2)을 구할 수 있다.

매개변수 periods를 지정해 원하는 기간만큼의 퍼센트 변화율(수익률)을 알 수도 있다.

예를 들어 periods = 3 으로 지정하면 [당일 가격 - 3일 전 가격 / 3일 전 가격] 이 되는 것이다.


4.  마치며

diff() : 가격 차이 구하기

pct_change() : 수익률 구하기

 

위 두 가지 메서드를 활용해

가격 변화와 수익률을 간편하게 구할 수 있다.

금융 상품 분석의 기본이 되는 만큼 반드시 짚고 넘어가자.

댓글