머신러닝과 기술적 분석

python으로 영구포트폴리오 자산군의 상관계수 계산하기 본문

투자

python으로 영구포트폴리오 자산군의 상관계수 계산하기

BetterToday 2021. 7. 9. 00:46
728x90

자산배분투자에서 가장 중요한 통계치는 자산군간의 상관계수일 것이다. 처음 백테스트를 하려고 할때 뭔가 쉽게 구할수 있을것 같으면서도 막상 구현하기가 막막했다. 다행히 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 구현결과 // 우: portpolio visualizer 결과

python 구현 결과와 거의 비슷하지만 조금씩 차이는 있다. 아마도 월별데이터를 종가 기준이 아닌 평균으로 구했거나 상관계수 구하는 방식의 차이인 듯 하다. 큰 차이는 아니므로 구현이 잘 되었다고 간주하자!

3. 정리

  • python으로 주요자산군간의 상관계수를 구해보고 portpolio visualizer와의 결과를 비교해보았다.
  • 이제 환율 데이터 등을 적용해 좀더 다양한 자산군끼리의 상관계수를 분석해볼 수 있다!
728x90
반응형
Comments