일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- eclipse
- tensorflow
- 파이어족
- 제시 리버모어
- 파이어족 저축
- python
- H는 통계를 모른다.
- 데이비드 라이언
- mark minervini
- 마크 미너비니
- 추세추종 2%룰
- AWS
- 자산배분
- 퀀트 트레이딩
- 에드워드 소프
- 김프
- 마크미너비니
- 통계적 유의성
- 2%룰
- 이클립스
- 파이어족 자산
- 데이빗 라이언
- 신의 시간술
- 퀀터스 하지 마세요
- 파이어족 포트폴리오
- GIT
- 아웃풋 트레이닝
- 니콜라스 다바스
- 파이어족 자산증식
- 연금저축계좌
- Today
- Total
머신러닝과 기술적 분석
python으로 영구포트폴리오 자산군의 상관계수 계산하기 본문
자산배분투자에서 가장 중요한 통계치는 자산군간의 상관계수일 것이다. 처음 백테스트를 하려고 할때 뭔가 쉽게 구할수 있을것 같으면서도 막상 구현하기가 막막했다. 다행히 pandas에 관련 라이브러리가 있어서 코드 몇 줄로 구현이 가능하다
pandas를 이용해서 구현해보고 잘 구현되었는지 portpolio visualizer로 확인해보자!
1. pandas를 이용해서 구현
영구 포트폴리오를 구성하는 4가지 자산군을 가지고 correlation을 구해보았다.
하나씩 설명을 하려다가 너무 귀찮아서
코드가 길지 않아 코드 설명은 주석으로 달아놓았다.
한 가지 주의사항은 일단위 데이터가 아닌 월단위 데이터로 구해야 한다는 것이다. 처음에는 이 점을 잘 몰라서 일단위 데이터로 구했다가 portpolio visualizer의 결과와 차이가 많이 나서 당황했었다. 일단위 데이터로 구할 경우에는 변동성이 커져서 noise가 심하게 끼는 것 같다.
일반적으로 자산군간의 상관계수는 월단위 데이터로 구한다. 꼭 월단위 데이터로 구하자!
import pandas as pd
import matplotlib.pyplot as plt
from pandas_datareader import data
import yfinance
yfinance.pdr_override()
# SPY : 미국 주식
# SHY : 단기채 (현금과 거의 같은 자산군)
# TLT : 미국 장기국채
# GLD : 금
TICKERS = ["SPY", "SHY", "TLT", "GLD"]
if __name__ == "__main__":
# 1. 날짜별 index 생성
s = "2005-01-01"
e = "2021-07-31"
# dates = pd.date_range(s, e) # : 일단위 상관계수 계산
dates = pd.date_range(s, e, freq='BM') # : 월종가단위 상관계수 계산
# 2. DataFrame 만들기
df = pd.DataFrame(index=dates)
# 3. Ticker 별로 수정종가 데이터를 추가
for ticker in TICKERS:
df_tmp = data.get_data_yahoo(ticker, s)
df_tmp = df_tmp[["Adj Close"]]
df_tmp = df_tmp.rename(columns={"Adj Close": ticker})
df = df.join(df_tmp)
df = df.dropna()
# 4. 가격데이터 정규화 : 시작 가격으로 나누어서 시작을 1.0으로 맞추는 과정
df = df / df.iloc[0]
# 5. 월별 변화량 구하기
daily_returns = df.copy()
daily_returns[1:] = (df[1:] / df[:-1].values) - 1
daily_returns.iloc[0] = 0
# 6. 상관계수 출력
print(daily_returns.corr(method="pearson"))
# 7. 시각화
df.plot()
plt.show()
실행결과는 다음과 같다.
SPY SHY TLT GLD
SPY 1.000000 -0.375140 -0.321870 0.042607
SHY -0.375140 1.000000 0.558448 0.275524
TLT -0.321870 0.558448 1.000000 0.222306
GLD 0.042607 0.275524 0.222306 1.000000
유명한 자산배분 전략인 영구포트폴리오답게 상관계수가 음의 방향으로 잘 분포되어있다!
2. Portpolio visulizer로 확인
이제 구현한 결과가 잘 된건지 확인해 볼 차례이다. 지난포스트 : SPY 백테스트와 마찬가지로 portpolio visualizer를 사용해보자.
테스트 기간을 python 구현과 같게 2005.1 ~ 2021.7로 설정하고 돌려보았다.
python 구현 결과와 거의 비슷하지만 조금씩 차이는 있다. 아마도 월별데이터를 종가 기준이 아닌 평균으로 구했거나 상관계수 구하는 방식의 차이인 듯 하다. 큰 차이는 아니므로 구현이 잘 되었다고 간주하자!
3. 정리
- python으로 주요자산군간의 상관계수를 구해보고 portpolio visualizer와의 결과를 비교해보았다.
- 이제 환율 데이터 등을 적용해 좀더 다양한 자산군끼리의 상관계수를 분석해볼 수 있다!
'투자' 카테고리의 다른 글
Passive ETF와 Active ETF 정리 (1) | 2021.07.13 |
---|---|
<주식 매매하는 법>(제시 리버모어) 독후감 (1) | 2021.07.10 |
윌리엄 오닐의 종목선택 방법 : CANSLIM (시장의 마법사들 1권) (0) | 2021.07.06 |
<나는 주식투자로 250만불을 벌었다> 독후감 (3) | 2021.07.05 |
연금계좌 포트폴리오 (2021년 1월 수익률 2.72%) (2) | 2021.02.03 |