Post List

2018년 2월 15일 목요일

RiskBudget : Risk Budget 포트폴리오 구성하기



명령어 이름 -  RiskBudget

입력변수 -
1) covmat: covariance matrix
2) target: 원하는 종목 별 리스크 타겟

출력변수 - Risk Budget을 만족하는 포트폴리오의 비중

예시 - RiskBudget(covmat, target)


단순 리스크패러티를 구성하는 패키지는 매우 많지만
리스크 버젯팅을 구성하는 패키지는 아직 없습니다.

리스크패러티가 모든 종목이 가져가는
Risk Contribution을 동일하게 만드는 포트폴리오라면,

리스크 버제팅 포트폴리오는
Risk Contribution을 원하는 비중으로 만드는 포트폴리오 입니다.
사실 리스크패러티가 리스크 버제팅 포트폴리오의 특수 예입니다.


다음은 백테스팅을 통해 패키지 결과를 확인합니다.




devtools::install_github("hyunyulhenry/HenryQuant")
library(HenryQuant)

pak = c("FRAPO", "PerformanceAnalytics", "PortfolioAnalytics")
ipak(pak)

ret = asset_data[,c(1,5,9)]
target = c(0.5, 0.3, 0.2)
target_parity = rep(1/3, 3)
ep = endpoints(ret, on = "months")


패키지 다운로드 받은 후,
ipak 함수를 통해 필요한 패키지들을 다운받습ㅂ니다.

ret은 주식, 채권, 금에 해당하는 수익률 입니다.

target은 Risk Budget에 해당하는 [0.5, 0.3, 0.2] 값이며,
target_parity는 리스크 패러티 Budget인 [0.33, 0.33, 0.33] 입니다.



Port_normal = Port_RB = Port_RP = list()
Risk_normal = Risk_RB = Risk_RP = list()

for(i in (13) : (length(ep)) ) {

  subret = ret[c(ep[i-12] : ep[i]) , ]
  covmat = cov(subret)

  w_normal = target
  w_rb = RiskBudget(covmat, target)
  w_rp = RiskBudget(covmat, target_parity)

  Port_normal[[i]] = xts(t(w_normal), order.by = index(ret)[ep[i]])
  Port_RB[[i]] = xts(t(w_rb), order.by = index(ret)[ep[i]])
  Port_RP[[i]] = xts(t(w_rp), order.by = index(ret)[ep[i]])

  Risk_normal[[i]] = xts(t(mrc(w_normal, covmat)), order.by = index(ret)[ep[i]])
  Risk_RB[[i]] = xts(t(mrc(w_rb, covmat)), order.by = index(ret)[ep[i]])
  Risk_RP[[i]] = xts(t(mrc(w_rp, covmat)), order.by = index(ret)[ep[i]])

  print(i)
}

Port_normal = do.call(rbind, Port_normal)
Port_RB = do.call(rbind, Port_RB)
Port_RP = do.call(rbind, Port_RP)

Risk_normal = do.call(rbind, Risk_normal)
Risk_RB = do.call(rbind, Risk_RB)
Risk_RP = do.call(rbind, Risk_RP)

normal = Return.portfolio(ret, Port_normal)
budget = Return.portfolio(ret, Port_RB)
parity = Return.portfolio(ret, Port_RP)


normal은 투자비중이 0.5, 0.3, 0.2인 포트폴리오,
budget은 리스크 버젯이 0.5, 0.3, 0.2인 포트폴리오,
parity는 리스크 버젯이 0.33, 0.33, 0.33인 리스크패러티 포트폴리오 입니다.



port = cbind(normal, budget, parity)
colnames(port) = c("Normal", "Risk Budget", "Risk Parity")
charts.PerformanceSummary(port, main = "")
chart.StackedBar(Risk_normal)
chart.StackedBar(Risk_RB)
chart.StackedBar(Risk_RP)


최종적으로 각 포트폴리오들의 수익률 및
Risk Contribution을 확인합니다.




단순 5:3:2 투자 포트폴리오 대비
안정적인 성과를 보입니다.







단순 50:30:20 비중 포트폴리오는
종목 당 가져가는 리스크가 들쭉날쭉입니다.

반면 Risk Budget과 Risk Parity 포트폴리오는
각각 리스크 비중이
50:30:20, 33:33:33 임이 확인됩니다.



Return.stats(port)
yr_plot(port)



Normal
Risk Budget
Risk Parity
Ann Ret (Arith)
5.81%
5.13%
4.93%
Ann Ret (CAGR)
5.65%
5.06%
4.85%
Ann Std Dev
7.92%
6.27%
6.25%
Ann Sharpe
0.7134
0.8076
0.7754
MDD
25.15%
15.69%
15.30%
Roll Win (12M)
82.73%
88.49%
85.97%
Roll Win (24M)
86.47%
98.50%
98.50%
Roll Win (36M)
92.91%
100.00%
100.00%



통계값 및 년도별 수익률입니다.

댓글 3개:

  1. https://blog.naver.com/bigphd/221201767521


    https://poseidon01.ssrn.com/delivery.php?ID=596097013121101022076116000127120066063063059088049089096028121108100082088001085064036119005126028023035010065013010011078017114034029069015072023104071091124073088062043066067124099025073025000086123078125095088109070091030104086074116096125020013094&EXT=pdf


    모멘텀이 백테스트에서는 효과가 있지만, 실제 펀드의 실적을 추적해보면 수수료와 거래비용을 제외하면 사실상 남는게 없다는 주장입니다..

    결론은 수수료와 거래비용을 잘 컨트롤할수 있으면 모멘텀 투자는 여전히 가능(saved)하다고 합니다.

    모멘텀 크레쉬 현상도 그렇고...참..

    혹시 위 논문 읽어봐주실수 있을까요??

    감사합니다

    답글삭제
    답글
    1. AQR 에서 관련 논문 두개 나왔어요 이미

      삭제