투자관련 자료를 정리하다보면 엑셀의 한계가 느껴진다. 처리해야할 데이터의 양이 많아지면서 용량증가 그리고 그에 따른 속도저하로 작업의 속도다 더뎌진다. 이쯤되면 엑셀이 아닌 다른 프로그램을 사용해야 하나?라는 생각이 들기 마련이다. 한때는 python을 조금 공부해보기도 했는데, 이 역시 쉽지가 않아 조금 하다포기하고 다시 엑셀로 돌아가곤 했다.
마침 포트폴리오 최적화에 대한 python 코드를 매우 잘 정리해 놓은 자료가 있어 해당 자료를 통해 python을 공부해보고자 한다. 이 글은 데이터사이언스스쿨의 포트폴리오최적화 노트북을 참고하여 작성하였다. 이론적인 부분에 대해서는 High Risk, High Return? YES!!을 참고하면 된다.
먼저 필요한 라이브러리를 불러들인다.
import pandas as pd # 엑셀처럼 행과 열을 가진 DATA를 이용할 수 있게 해주는 패키지
import numpy as np # 수학과학 연산을 위한 패키지
import matplotlib.pyplot as plt #그래프를 그릴때 쓰는 패키지
다음은 필요한 data(SPY, TLT, IAU, DBC)를 python으로 읽어들인다. 자료는 investing.com에서 엑셀로 다운 받아 정리하였다.
data = pd.read_excel(r'파일경로', index_col = 'Date')
자료를 출력해보자.
data.tail(5) # 마지막 5개
그래프를 출력해보자.
(data / data.iloc[0] * 100).plot(figsize=(8, 5), grid=True) # 비율로 표시
plt.show()
수익률표를 만들어보자.
rets = np.log(data / data.shift(1)) # 로그수익률로 표시
rets.tail(5) # 5개 출력
평균수익률은 다음과 같이 계산할 수 있다.
rets.mean()*12
자산의 투자비중을 지정하기 위해 동일비중 행렬(w)을 만들어보자.
weights = np.array([0.25, 0.25, 0.25, 0.25]) # 자산비중 행렬만들기
w의 비중으로 투자한 포트폴리오의 수익률은 다음과 같이 계산된다.
crets = np.sum(rets.mean()*weights)*12
포트폴리오의 분산을 계산하기에 앞서 지난글의 내용을 상기해보자.
세자산으로 이루어진 포트폴리오의 분산은 다음과 같다고 하였다.
마지막 부분의 수식을 이용하여 n자산으로 구성된 포트폴리오의 분산을 계산할 수 있다. 필요한 자료는 포트폴리오 비중과 공분산 행렬이다.
비중행렬은 위에서 만들어놓은 동일비중 행렬 w를 이용한다.
다음은 공분산 행렬을 만들어보자. (이렇게 간단할 수가...!!)
covmat = rets.cov()*12
포트폴리오의 분산을 구해보자. 아래 식은 σp2 = wΩw-1를 나타낸다.
variance = weights.T @ covmat @ weights # @가 행렬의 곱을 뜻하는 듯하다.
weights는 가로로 나열된 것처럼 보이지만 실제로는 세로로 나열된 행렬이므로 먼저 가로 행렬로 바꿔주기 위해 T를 적용하였다.
결과는 다음과 같다.
오늘은 여기까지~!
유난히도 힘들었던 유니버셜 스튜디오 재팬(USJ)에서의 벅찬 하루를 보내고 난바로 넘어왔습니다...