Post List

2016년 7월 20일 수요일

Multifactor Allocation Using Momentum



단일 스마트베타를 이용하여
적립식 투자를 하는것도 굉장히 유용하지만

변동성을 줄이기 위해 멀티팩터로 분산 투자하는 것이
여러 측면에서 효율적입니다.

가장 심플한 방법으로는
월별로 동일가중으로 맞추는게 편하지만
모멘텀을 이용한 비중배분을 해보도록 하겠습니다.

먼저 선정된 전략은
ETF로 실제 투자가 가능한
고배당 / 로우볼 / 모멘텀 / 퀄리티밸류 입니다.

먼저, 각각의 기초지수에 대한 결과입니다.

### 년도별 수익률 ###


고배당
로우볼
모멘텀
퀄리티밸류
2001
77.98%
55.90%
81.50%
71.56%
2002
15.39%
3.79%
-3.11%
8.86%
2003
47.04%
28.03%
59.50%
38.75%
2004
28.93%
33.33%
10.44%
33.56%
2005
43.82%
72.94%
87.64%
111.67%
2006
14.98%
14.80%
21.72%
10.58%
2007
37.60%
37.42%
89.85%
39.23%
2008
-43.35%
-29.34%
-36.23%
-32.58%
2009
50.50%
32.37%
50.69%
48.51%
2010
22.26%
17.38%
29.58%
20.10%
2011
-6.86%
3.93%
9.19%
-0.51%
2012
4.80%
16.64%
8.47%
15.92%
2013
4.12%
17.19%
-1.91%
15.99%
2014
-1.50%
0.51%
7.57%
8.86%
2015
6.78%
6.44%
7.92%
3.59%



### 요약 통계량 ###


고배당
로우볼
모멘텀
퀄리티밸류
Cum Return
9.01
11.39
19.92
19.84
Ann Return
16.02%
17.64%
21.68%
21.65%
Ann Std Dev
23.89%
17.04%
26.57%
23.17%
Sharpe (Rf=0%)
0.67
1.03
0.82
0.93
MDD
52.98%
38.68%
51.48%
44.74%

다음은 전략별, 그리고 동일가중 포트폴리오의
년도별 수익률 비교입니다.



이번에는 본격적으로, 모멘텀을 이용한
비중조절 수익률 입니다.

방법은 간단합니다.

각 전략별 과거 6개월 수익률로
1~4위 까지 순위를 매긴 후,
순위가 높을 수록 많은 weight를 줍니다.

동일가중을 시작으로,
순위별 비중차이가 점점 벌어지게 테스트 하였습니다.


RANK
Cum
Return
Ann
Return
Ann
Std Dev
Sharpe
MDD
1st
2nd
3rd
4th
(1)
25%
25%
25%
25%
10.27
16.82%
20.44%
82.30%
44.67%
(2)
28%
26%
24%
22%
10.41
16.91%
20.56%
82.28%
45.05%
(3)
30%
27%
23%
20%
10.53
16.99%
20.64%
82.32%
45.23%
(4)
40%
30%
20%
10%
10.97
17.27%
21.11%
81.82%
46.57%
(5)
50%
30%
20%
0%
11.15
17.38%
21.64%
80.32%
48.55%
(6)
50%
50%
0%
0%
12.77
18.33%
21.84%
83.93%
44.19%

 (1) 번의 경우 동일가중이며,
(5) 번과 (6) 번은 하위 전략의 비중을
0% 로 하였습니다.

비중차이가 점점 커질수록
수익률은 높아지며,
변동성 또한 커집니다.

(1)
(2)
(3)
(4)
(5)
(6)
2001(*)
20.84%
21.26%
21.53%
22.96%
24.59%
23.35%
2002
6.55%
6.72%
6.88%
7.38%
7.47%
10.13%
2003
43.28%
43.31%
43.34%
43.38%
43.26%
44.14%
2004
26.39%
26.08%
25.87%
24.85%
23.85%
23.66%
2005
78.04%
79.81%
81.07%
87.03%
92.42%
97.19%
2006
15.63%
15.61%
15.56%
15.51%
15.75%
13.76%
2007
50.65%
51.38%
51.91%
54.25%
56.06%
59.36%
2008
-35.18%
-35.17%
-35.11%
-35.15%
-35.64%
-32.75%
2009
45.92%
45.27%
44.87%
42.68%
40.22%
41.90%
2010
22.49%
22.29%
22.17%
21.48%
20.72%
21.18%
2011
1.79%
2.03%
2.22%
2.92%
3.19%
5.79%
2012
11.48%
11.17%
10.94%
9.94%
9.17%
7.70%
2013
8.69%
9.11%
9.48%
10.82%
11.39%
16.62%
2014
3.89%
3.94%
3.96%
4.13%
4.42%
3.59%
2015
6.41%
6.35%
6.27%
6.08%
6.21%
4.04%
2016
-1.29%
-1.51%
-1.66%
-2.35%
-2.90%
-3.86%

* 모멘텀을 위해 6개월 수익률이 필요한 관계로
2001년 7월~12월의 수익률 입니다.







##############################################
########## 설치가 안된 패키지는 ##############
##### install.package("패키지이름") 으로 #####
############# 설치해 주세요 ################## 

 library(zoo)
 library(quadprog)
 library(PerformanceAnalytics)
 library(quantmod)

 multi = read.csv("multi.csv", row.names = 1)
 ret = as.matrix(Return.calculate(multi))
 ret_port = as.matrix(apply(ret,1,mean))
 colnames(ret_port) = c("Equal Weight")
 ret_mom = matrix(0,nrow(ret), ncol(ret))

 for (i in 6 : nrow(ret)) { ret_mom[i, ] = apply(ret[ (i -5): i, ] + 1,2, prod) - 1 } 

 ###############################################

 ret_stra = matrix(0,nrow(ret),1)
 rownames(ret_stra) = rownames(ret)
 colnames(ret_stra) = c("Momentum Weight")

 for (i in 7 : (nrow(ret) - 1) ) {
 con = matrix(0,2,ncol(ret))
 con[1,] = rank(-ret_mom[i, ])

 con[2, which(con[1, ] == 1)] = 0.50
 con[2, which(con[1, ] == 2)] = 0.50 
 con[2, which(con[1, ] == 3)] = 0.00 
 con[2, which(con[1, ] == 4)] = 0.00

 ret_stra[i+1] = con[2,] %*% ret[i+1, ] 
 } 

 ############################################### 

 Return.cumulative(ret)
 rbind(table.AnnualizedReturns(ret), maxDrawdown(ret))
 
 Return.cumulative(ret_port)
 rbind(table.AnnualizedReturns(ret_port), maxDrawdown(ret_port)) 
 
 Return.cumulative(ret_stra)
 rbind(table.AnnualizedReturns(ret_stra), maxDrawdown(ret_stra)) 

 charts.PerformanceSummary(ret, main="Each Smart Beta")
 charts.PerformanceSummary(ret_port)
 charts.PerformanceSummary(ret_stra)

 cbind(apply.yearly(ret, Return.cumulative), apply.yearly(ret_port, Return.cumulative),apply.yearly(ret_stra, Return.cumulative))

 barplot(t(cbind(apply.yearly(ret, Return.cumulative), apply.yearly(ret_port, Return.cumulative))), beside = TRUE, col = 1:5)
 legend('topright', c("고배당", "로우볼","모멘텀", "퀄리티밸류", "동일가중"), lty = 1, col = 1:5, bty='n', cex = 1.2)

댓글 5개:

  1. 안녕하세요. 블로그 글 잘 읽고 있습니다. 최근에 R 코드를 자주 올리시는데,
    관심이 있으시면 R 코드에 Syntax HIghlighting을 적용해보시는 것은 어떨까요?
    참고가 될만한 링크를 아래에 첨부합니다.

    How to insert code blocks in Blogger posts
    http://rusya7.blogspot.kr/2015/02/how-to-insert-code-blocks-in-blogger.html

    How to Format Code and Syntax Highlighting to Blogger
    http://www.danielhansen.net/2014/06/how-to-format-code-and-syntax.html

    SyntaxHighlighter Brush for the R Language
    http://yihui.name/en/2010/09/syntaxhighlighter-brush-for-the-r-language/

    Using SyntaxHighlighter and R Brush in Blogger
    http://thebiobucket.blogspot.kr/2011/11/using-syntaxhighlighter-and-r-brush-in.html

    A Prism Syntax Highlighter for R
    http://mathematicalcoffee.blogspot.kr/2013/05/a-prism-syntax-highlighter-for-r.html

    답글삭제
    답글
    1. 해외 블로그에서 이기능 많이 보긴했는데
      설치하려니 많이 어렵네요...

      삭제
    2. 이틀 동안 고생을 했으나 자꾸 뻑이나네요
      제가 xml 쪽은 아예 몰라서 디버깅 어떻게 해야되는지도 모르겠고요...

      그냥 간단하게 블로그스팟에서 R 코드 삽입하는 법 정리된 걸 알려주시면
      매우 감사하겠습니다.

      삭제
    3. http://dkang0121.blogspot.kr/2016/07/r-code-block-syntax-highlighting-httpwww_22.html
      블로그스팟이 생각보다 까다롭네요. 원래 자바스크립트 한두줄이면 끝날 것을..

      http://ddmix.blogspot.kr/2015/11/syntax-highlighter-blogger.html
      주로 참고했고 highlight.js(https://highlightjs.org/static/demo/)사용해서 구현했습니다.
      Ctrl+U 누르면 브라우저 소스코드를 볼 수 있으니 참고하시구요.

      삭제
    4. 아 덕분에 적용 잘 했습니다.
      일단은 github 로 스타일 적용했고,
      마음에 드는 스타일은 이상하게
      작동을 안하네요...

      차차 해결해보도록 하겠습니다.
      감사합니다.!!

      삭제