[Day3] Risk Parity with Python
지난글에서는 SPY, TLT, IAU, DBC의 주가 이용하여 최소위험포트폴리오를 구성해보았다. 이번글에서는 Risk Parity Portfolio를 구성해보도록 하자.
자산의 위험기여도
먼저 포트폴리오의 각자산이 포트폴리오 위험에 기여하는 정도(Risk Contribution)에 대해 복습해보자. High Risk, High Return? YES!!에서 자산의 위험기여도는 행렬로 표현한 포트폴리오 위험의 각 행의 합과 같다고 하였다. 따라서 각자산의 위험기여도를 전체 포트폴리오의 위험으로 나누면 자산의 위험기여비율을 계산할 수 있다.
먼저 파이썬에서 포트폴리오의 위험을 행렬로 만들어보자.
w = np.array([0.2, 0.3, 0.4, 0.1]) # 자산비중 set
covmat = rets.cov() * 12 # cov matrix 만들기
VarianceMatrix = covmat.multiply(w, axis = 1).multiply(w, axis = 0) # 포트폴리오위험 Matrix
이제 각행의 합을 구한 후 이를 포트폴리오의 위험으로 나누어 보자.
RCratio = VarianceMatrix.sum() / VarianceMatrix.sum().sum()
동일비중 포트폴리오
- 최적화 대상 함수 구성 : 비중이 동일해야 하므로 각 자산의 위험 비중은 1/n 이 되어야 한다. 따라서 비중 w에서 계산한 위험비중과 1/n의 차이의 제곱의 합을 최소로 만드는 함수를 만들면 된다. 최적화 되는 경우 차이제곱의 합은 "0"이 될 것이다.
def RiskParity(w):
VarianceMatrix = covmat.multiply(w, axis = 1).multiply(w, axis = 0)
RCratio = VarianceMatrix.sum() / VarianceMatrix.sum().sum()
return np.sum((0.25-np.array(RCratio))**2)
이하 조건은 [Day2]와 동일하다.
- 최적화 방법 : SLSQP를 선택
method='SLSQP'
- 변수범위 설정 : 0~1
bnds = ((0,1), (0,1), (0,1), (0,1))
- 제약조건 설정 : 비중의 합이 1이되도록 설정
cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
최적화 코드
def RiskParity(w):
VarianceMatrix = covmat.multiply(w, axis = 1).multiply(w, axis = 0)
RCratio = VarianceMatrix.sum() / VarianceMatrix.sum().sum()
return np.sum(np.sum((0.25-np.array(RCratio))**2))
cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
bnds = ((0,1), (0,1), (0,1), (0,1))
opt = sco.minimize(RiskParity, w, method='SLSQP', bounds=bnds, constraints=cons)
각 자산의 위험 비중을 계산해보자.
VarianceMatrix = covmat.multiply(opt.x, axis = 1).multiply(opt.x, axis = 0)
RCratio = VarianceMatrix.sum() / VarianceMatrix.sum().sum()
비중이 거의 동일하게 계산되었다. 하지만 만족스럽지는 않다. minimize함수에 option을 추가하여 정확도를 높여보자.
option = {'maxiter': 1000, 'ftol': 1e-60} # ftol은 거의 0에 가까운 목표값, maxiter는 최대반복횟수
opt = sco.minimize(RiskParity, w, method='SLSQP', bounds=bnds, constraints=cons, options = option)
오늘은 여기까지. 지난글은 아래 링크를 참고.
[Day1] 포트폴리오 최적화 with Python
[Day2] 포트폴리오 최적화 with Python
Sponsored ( Powered by dclick )
스팀헌트 스팀증인 출사표
오늘 스팀헌트가 스팀증인에 출사표를 던지며, 스팀 증인으로서 저희가 달성하고자 하는 목표와 철...
이 글은 스팀 기반 광고 플랫폼
dclick 에 의해 작성 되었습니다.