Post List

2016년 7월 25일 월요일

"Enhancing Low Volatility Strategy" using Weighted Standard Deviation


 Low volatility 전략은 과거 수익률을 기준으로
변동성이 낮은 종목에 투자 하는 전략입니다.

그러나, 샘플 기간이 길어질수록
지나치게 오래된 데이터를 이용하게 됩니다.

월간 수익률 기준 5년간 변동성을 사용할 경우
무려 3~5 년전 수익률도 포함됩니다.

이는, 현재 시점 주식의 특성과
다소 괴리가 있는 데이터 일 수 있습니다.

따라서, 현재 시점에 좀 더 많이 weight 를 주는 것
이론적으로는 바람직 합니다.




일반적으로 계산되는 variance 에 비해,
weighted variance 는 i 시점별 weight를 부여하여
계산됩니다.

Wt = λ^(t)  로 설정하여,
최근 데이터에 더 많은 weight 를 주도록 하겠습니다.

예를 들어, 람다 값이 0.5 라면
현재 데이터에는 0.5의 weight가,
t-1 기간에는 0.5^2 = 0.25,
t-2 기간에는 0.1250 이 부여가 됩니다.

이는 EWMA 와도 비슷한 로직 입니다.


EWMA weights N = 200


2000년 부터 코스피 200 종목 대상,
60개월 월간 수익률 변동성 낮은 20종목,
동일가중 포트폴리오
백테스트를 실시합니다.

Lambda 값을 1부터 줄여나가며 테스트 합니다.
(Lambda = 1 은 일반 표준편차 입니다.)




Lambda
1
0.99
0.97
0.95
Cum Return
4.3578
4.5758
5.8815
5.9808
Ann Return
0.1071
0.1098
0.1240
0.1250
Ann Std Dev
0.1876
0.1880
0.1847
0.1819
Ann sharpe
0.5709
0.5839
0.6713
0.6870
MDD
0.4173
0.3984
0.4080
0.3454


람다 값을 줄일 수록
(과거 자료에 weight를 줄일 수록)

 수익률이 높아지며,
변동성은 낮아집니다.

이는 최근 해당종목의 특성을
더욱 잘 반영한 결과로 판단됩니다.

특히, Drawdown 에서 확연한 차이가 납니다.

다음은 연도별 수익률 입니다.

1
0.99
0.97
0.95
2000
-15.21%
-16.74%
-9.79%
-8.93%
2001
61.04%
63.94%
63.88%
57.11%
2002
1.03%
3.82%
5.91%
5.61%
2003
20.94%
18.18%
25.64%
29.99%
2004
24.05%
26.84%
32.75%
28.09%
2005
47.98%
51.57%
54.26%
49.83%
2006
13.76%
11.13%
15.68%
17.02%
2007
28.77%
30.43%
28.03%
28.06%
2008
-33.53%
-32.81%
-34.14%
-28.08%
2009
19.51%
19.06%
20.37%
17.62%
2010
12.96%
12.88%
13.00%
17.67%
2011
-3.03%
-4.19%
-3.88%
-6.24%
2012
18.50%
20.39%
15.33%
12.44%
2013
13.20%
13.46%
13.31%
15.75%
2014
2.85%
0.45%
-1.85%
0.82%
2015
2.16%
2.84%
2.12%
-0.66%
2016 (~6)
-2.64%
-2.13%
2.27%
1.59%



이 외에도 Time Series 데이터를 사용하는 경우,
Weighted Mean or Variance 를 사용하는 것이
성과 개선에 긍정적 역할을 할 것으로
기대됩니다.


install.packages("Hmisc")
library(Hmisc)

.....

wt = 0.95^(1:60)

std_wei = matrix(NA, ro, co)
for (i in 61 : ro) { 
  for (j in 1: co) {
    if ( ( sum(is.na(ret_1m[i : (i- ini + 1), j] )) == 0 )  & (sd(ret_1m[i : (i- ini + 1), j]) != 0) )  {
      std_wei[i,j] = sqrt(wtd.var(ret_1m[i : (i-ini+1),j], wt)) }
  }
}
....

이하는 기존 설명한 Low Volatility 코드와 같습니다. 

댓글 없음:

댓글 쓰기