Post List

2018년 4월 24일 화요일

자산배분 모형(최소분산, 최대분산효과, 리스크버짓, 시총가중, 동일가중)



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

library(quantmod)
library(PerformanceAnalytics)
library(FRAPO)


먼저 HenryQuant 패키지를 업데이트 한 후,
각종 패키지들을 다운로드받습니다.



ticker = get_KOR_ticker()

HenryQuant 패키지 내 함수를 이용해
코스피 + 코스닥 전종목 티커를 다운 받습니다.



전 종목의 티커, 종목명, 시가총액(억) 이 다운됩니다.



symbols = paste0(ticker[1:30, 1], ".KS")

getSymbols(symbols, src='yahoo')
prices = list()
for(i in 1:length(symbols)) {  prices[[i]] = Ad(get(symbols[[i]])) }
prices = do.call(cbind, prices)
colnames(prices) = ticker[1:30, 2]


시가총액 대형주 30 종목 주가를 다운받습니다.

6자리 티커에 ".KS" 를 붙여준 뒤
quantmod의 getSymbols 함수를 이용해
야후에서 수정주가를 다운로드 받습니다.



rets = na.omit(Return.calculate(prices))

mkt_cap = ticker[1:30, 3]
mkt_cap = mkt_cap / sum(mkt_cap)
covmat = cov(rets)


수익률을 구한 후, na 데이터는 삭제해 줍니다.

ticker 변수의 3번째 열에 시가총액이 있으므로,
시가총액비중 또한 쉽게 구할 수 있으며,

covariance matrix도 계산해 줍니다.



1) 최소 분산 포트폴리오 (Min Vol)


wt_minvol(covmat)




min vol 비중을 구해주는 wt_minvol 함수입니다.
단순히 covariance matrix만 입력해주면,
종목 당 비중이 계산됩니다.

단, 0으로 나오는 종목이 꽤 많이 존재하며 (최소비중 0이 기본),
특정 종목에 비중이 많이 쏠리기도 합니다.
(변동성이 낮은 SK 텔레콤에 22% 가량)


wt_minvol(covmat, lb = rep(0.01, ncol(prices)), ub = rep(0.1, ncol(prices)))



최소 비중 제약(lb)을 1%, 최대 비중 제약(ub)을 10%로 줍니다.
비중이 0 이었던 종목이 그래도 1%는 투자를 하고,
최대 비중도 10% 로 막히게 되었습니다.


이런 제약조건 주는 패키지는 기존에도 있었습니다.
하지만, 종목 별로 비중을 다르게 주는 패키지는 기존에 없었죠?


upper_bound = apply(rbind(rep(0.10, 5), mkt_cap * 3), 2, min)
plot(upper_bound, ylab ="", xlab = "")



먼저 upper_bound를 위와 같이 설정합니다.
기존 10%와 시총비중 * 3 을 비교하여,
이 중 낮은 값을 선택합니다.

예를 들어, 삼성전자의 시총비중이 30%라 가정하면
min(10%, 30%*3) = 10%, 즉 최대 비중 제약은 10%가 됩니다.

반면 특정종목의 시총비중이 2%라 가정하면
min(10%, 2%*3) = 6%, 즉 최대 비중 제약은 6%가 됩니다.

이는 벤치마크와의 비중을 줄이는 최적화 포트폴리오를 만들기 위함입니다.




실제로 그래프에서 보면
시총비가 큰 종목의 최대비중 제약은 10% 이며,
시총비가 내려갈수록 최대비중 제약은 내려감이 확인됩니다.



wt_minvol(covmat, lb = rep(0.01, ncol(prices)), ub = upper_bound)



최소투자비중은 1%로,
최대투자비중은 upper_bound를 적용한 최적화 포트폴리오 입니다.
(물론 최소투자비중도 종목 마다 다르게 셋팅할 수 있습니다.)

원하는대로 결과가 나왔군요 :D


2) Max Diversification


wt_maxdiv(covmat)
wt_maxdiv(covmat, lb = rep(0.01, ncol(prices)), ub = rep(0.1, ncol(prices)))
wt_maxdiv(covmat, lb = rep(0.01, ncol(prices)), ub = upper_bound)


최대분산효과를 구하는 wt_maxdiv 함수입니다.
사용법은 wt_minvol과 같습니다.

단순히 covariance matrix만 입력할 경우 하한과 상한 제약은 0과 1,
lb와 ub에 각각의 제약조건을 입력할 수도 있습니다.





3) 시가총액가중,  동일가중


wt_normal(mkt_cap, MaxWeight = 1.00, type = "VW")




시총가중과 동일가중을 구하는 wt_normal 함수입니다.
해당함수는 시가총액, 최대비중, type
총 3가지 변수가 필요합니다.

type을 "VW"로 할 경우 Value Weight, 즉 시총비중
"EW"로 할경우 Equal Weight, 즉 동일비중이 구해집니다.



위의 경우 시가총액 비중대로 나옵니다.
그러나 문제는 국내의 경우
삼성전자의 비중이 지나치게 높다는 것입니다.

따라서, 시가총액 비중대로 하면서
특정 종목의 상한은 제약할 수 있습니다.
(나머지 비중은 다른 종목들에 뿌려지겠죠)



wt_normal(mkt_cap, MaxWeight = 0.10, type = "VW")



MaxWeight에 원하는 비중을 너으면
최대비중이 해당 숫자만큼 제한됩니다.
(스마트베타 책에 썼던 테크닉이죠?)

삼성전자의 비중이 10%로 제한됨이 확인되며,
나머지 비중들이 차액 만큼 배분되서 증가합니다.


wt_normal(mkt_cap, MaxWeight = 0.50, type = "EW")



이번엔 가장 심플한 동일가중입니다.
mkt_cap에 시가총액을 뭘 넣건, MaxWeight에 뭘 넣건
type = "EW" 해주면 그냥 동일가중이 계산됩니다.



4) 리스크 버짓 (리스크 패러티)


mrc(mkt_cap, covmat)



먼저, 30 종목의 risk contribution을 구해봅니다.
삼성전자가 50% 이상을, SK 하이닉스가 9% 이상을,
둘이 합치면 60% 이상의 risk를 가져갑니다.

극혐인 한국 시장입니다.


budget = rep(1/ncol(rets), ncol(rets))
RiskBudget(covmat, budget)



먼저 모든 종목들의 Risk Contribution이 같게 만드는
Risk Parity Portfolio 를 구합니다.

이는 각 종목의 Risk Budget이 1/n로 똑같은 경우입니다.

RiskBudget 함수는 covariance matrix와 원하는 budget 값을 입력하면 됩니다.
최적화된 비중이 계산되어 집니다.



mrc(RiskBudget(covmat, budget), covmat)



구해진 값들의 risk contribution을 확인해 봅니다.
모든 종목이 3.33%로 동일하군요!


budget = mkt_cap
RiskBudget(covmat, budget)



물론 종목마다 Risk Budget을 다르게 입력할 수도 있습니다.
시험 삼아 budget을 시총비로 입력해봅니다.
최적화 값이 잘 나옵니다.


mrc(RiskBudget(covmat, budget), covmat)
mkt_cap




시총비를 Budget 으로 한 포트폴리오의 Risk Contribution과
시총비의 비교입니다.

두 값이 동일함이 확인됩니다.


요약


함수명
목적
입력변수
특징
wt_minvol
MV
covmat: 공분산
lb: 최소 비중
ub: 최대 비중
cut_w: 버림 조건
lb ub 미 입력시 각각 0 1로 계산
lb ub는 종목별로 다르게 적용 가능
wt_maxdiv
MDP
covmat: 공분산
lb: 최소 비중
ub: 최대 비중
cut_w: 버림 조건
lb ub 미 입력시 각각 0 1로 계산
lb ub는 종목별로 다르게 적용 가능
wt_normal
VW,
EW
MarketCap: 시총 비중
MaxWeight: 최대 비중
type: “VW” or “EW”
“VW”의 경우 시총 가중,
“EW”의 경우 동일 가중
RiskBudget
RB(RP)
covmat: 공분산
target: Risk Budget
Risk Budget or Risk Parity 가능

2018년 4월 14일 토요일

Google Finance is Dead, Long Live the Data



먼저 야후 파이낸스에서
마이크로 소프트 주가를 받아봅니다.


library(quantmod)
getSymbols("MSFT", src = "yahoo")




잘 받아집니다.


구글 파이낸스로 받아봅니다.


getSymbols("MSFT", src = "google")




구글 파이낸스가... 사망하셨습니다....
얼마전에 스프레드시트에서 주가 뻑나던 것도
다 이것 때문이었던거 같습니다..




하지만 언제나 그렇듯,
우리는 해답을 찾을 것입니다.


quantmod 의 github 를 가봅니다.
https://github.com/joshuaulrich/quantmod/tree/master/R

tiingo 라는 곳을 이용해 데이터를 받을 수 있게
바뀌었군요!





tiingo 데이터를 사용해 봅니다.
https://www.tiingo.com/


사이트 가입 후 API KEY를 받아야 합니다.
https://api.tiingo.com/docs/general/connecting


getSymbols("MSFT", src = "tiingo", api.key = "API KEY")


API KEY에는 본인의 API KEY를 입력하셔야 합니다.



잘 되는군요!

매번 API KEY 입력하기 짜증나니 디폴트로 박아줍니다.


setDefaults("getSymbols.tiingo", api.key = "API KEY")


디폴트 키값이 설정 되었으니, 키 입력 없이 다운로드 받아봅니다.
데이터 period도 길게 제공한다고 하니
1900년 부터 한번 다운받아 보도록 하겠습니다.




잘 받아지는 군요.
그것도 무려 86년도 데이터부터.



가격 정책을 한번 살펴봅니다.
https://www.tiingo.com/pricing

글로벌 주식 무한 API 제공이
월 10 달러 밖에 안하는군요

유료서비스도 매력적이네요?





2018년 4월 13일 금요일

The Conservative Formula: Low Vol + Momentum + Net Payout



Robeco의 대표 퀀트 Pim van Vliet와 David Blitz  는 논문에서
심플한 형태의 멀티팩터 포트폴리오를 제안합니다.



로우볼, 모멘텀, 배당 이 3가지 팩터의 조합으로
존재하는 대부분의 팩터로의 노출이 가능하며,
대형주에서도 매우 잘 워킹함을 보입니다.

각 팩터의 상세 내용은 아래와 같습니다.



Low Vol
36개월 수익률의 변동성
Momentum
12-1M 누적수익률
Net Payout
(배당 + 자사주매입 신주발행) / 시가총액



그들의 방법론에 따라
먼저 대형주에서 각 팩터의 수익률을 보겠습니다.

코스피와 코스닥 전종목 기준 상위 50% 내에서의
각각 팩터 테스트 입니다.

(동일가중 및 분기 리밸런싱, 매매수수료 반영)

(1) Low Vol
Long
Short
Long Short
Ann Ret (Arith)
18.82%
-0.55%
21.35%
Ann Ret (CAGR)
18.47%
-5.42%
20.32%
Ann Std Dev
18.84%
32.19%
22.06%
Ann Sharpe
0.9802
-0.1683
0.9214
Win Ratio
62.50%
49.52%
67.79%
MDD
42.37%
82.82%
48.17%
Roll Win (12M)
84.26%
35.03%
89.85%
Roll Win (24M)
92.43%
34.05%
93.51%
Roll Win (36M)
98.84%
35.84%
100.00%



(2) Momentum
Long
Short
Long Short
Ann Ret (Arith)
11.53%
3.26%
8.46%
Ann Ret (CAGR)
8.58%
-1.53%
6.96%
Ann Std Dev
25.64%
31.90%
17.80%
Ann Sharpe
0.3347
-0.048
0.3907
Win Ratio
57.21%
51.92%
60.10%
MDD
59.54%
76.02%
39.01%
Roll Win (12M)
68.02%
40.61%
68.02%
Roll Win (24M)
70.81%
42.70%
78.38%
Roll Win (36M)
78.03%
42.77%
85.55%



(3) Net Payout
Long
Short
Long Short
Ann Ret (Arith)
17.44%
1.33%
16.13%
Ann Ret (CAGR)
15.99%
-2.92%
16.23%
Ann Std Dev
22.51%
29.44%
13.96%
Ann Sharpe
0.7103
-0.0992
1.1626
Win Ratio
60.10%
52.40%
67.79%
MDD
51.38%
76.23%
24.41%
Roll Win (12M)
80.71%
39.59%
90.36%
Roll Win (24M)
89.19%
37.84%
95.14%
Roll Win (36M)
95.95%
39.31%
100.00%




각 개별 팩터 모두
Long Portfolio (상위 30%) 가
Short Portfolio (하위 30%) 대비
우월한 성과가 있음이 확인됩니다.


이번에는 논문에서 처럼
3가지 팩터를 동시에 고려하도록 하겠습니다.


논문에서는 3가지 팩터를 조합할때

1) Volatility 기준 상/하위 50%씩 구분
2) 변동성 하위 50% 중 High Momentum & High Payout 
포트폴리오를 구성했습니다.

(Sequential and Integrated Portfolio)




그러나 해당 테스트에서는 멀티팩터의 본질에 맞게
3가지를 한번에 고려하는 방법을 택하도록 하겠습니다.

그림으로 나타내면 아래와 같겠죠?




붉은 부분이 Long Portfolio,
푸른 부분이 Short Portfolio입니다.


(4) Conservative Portfolio
Long
Short
Long Short
Ann Ret (Arith)
20.68%
-0.43%
22.14%
Ann Ret (CAGR)
20.49%
-4.90%
21.95%
Ann Std Dev
19.61%
30.65%
19.77%
Ann Sharpe
1.0446
-0.1598
1.1103
Win Ratio
63.94%
50.00%
65.87%
MDD
42.77%
78.32%
43.21%
Roll Win (12M)
84.77%
34.01%
92.89%
Roll Win (24M)
93.51%
32.97%
98.92%
Roll Win (36M)
98.84%
32.37%
100.00%



역시나 롱 포트폴리오가 숏 포트폴리오 대비
우수한 성과를 보입니다.





Long Short 포트폴리오의 회귀분석 결과입니다.
HML과 UMD 모두에 상당한 노출도가 있으며,

alpha값의 t-value가 4 가량 되어
매우 유의한 결과임이 확인됩니다.


혹시 동일가중의 효과가 아닌지 테스트하기 위해
시가총액 가중 포트폴리오를 짜도록 하겠습니다.



(5) Conservative Portfolio (Cap Weight)
Long
Short
Long Short
Ann Ret (Arith)
18.26%
4.37%
14.77%
Ann Ret (CAGR)
17.80%
-0.20%
13.15%
Ann Std Dev
18.89%
30.53%
21.15%
Ann Sharpe
0.9421
-0.0066
0.6215
Win Ratio
63.46%
50.48%
59.62%
MDD
42.45%
67.76%
39.26%
Roll Win (12M)
83.25%
52.79%
83.76%
Roll Win (24M)
90.81%
47.03%
90.81%
Roll Win (36M)
100.00%
40.46%
97.69%




수익률과 알파 효과가 많이 감소하였지만
여전히 유의미한 알파를 보입니다.



이번에는 논문에서와 동일하게
Conservative Portfolio 기준
대형주 내 상위 100 종목, 동일가중 포트폴리오를 구성합니다.




Ann Ret (Arith)
20.94%
Ann Ret (CAGR)
20.91%
Ann Std Dev
19.21%
Ann Sharpe
1.088
Win Ratio
62.02%
MDD
38.73%
Roll Win (12M)
84.77%
Roll Win (24M)
94.59%
Roll Win (36M)
98.84%


좋군요 :D

100 종목 동일 가중이면
실제 펀드로 운용도 가능하겠구요!!




이번에는 대형주가 아닌 중형주
(시가총액 기준 50%~20%) 에서
동일한 포트폴리오를 구성합니다.






Ann Ret (Arith)
22.63%
Ann Ret (CAGR)
21.88%
Ann Std Dev
23.49%
Ann Sharpe
0.9313
Win Ratio
62.02%
MDD
50.22%
Roll Win (12M)
83.25%
Roll Win (24M)
82.70%
Roll Win (36M)
93.64%

뭐 비슷한 성과를 보입니다.