Post List

레이블이 Asset Allocation인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Asset Allocation인 게시물을 표시합니다. 모든 게시물 표시

2019년 7월 14일 일요일

Efficient Frontier (Mean Variance Optimization) using ggplot2 in R


library(quantmod)
library(PerformanceAnalytics)
library(magrittr)
library(ggplot2)

symbols = c('005930.KS', '068270.KS', '005380.KS', '055550.KS', '017670.KS')
names = c('삼성전자', '셀트리온', '현대차', '신한지주', 'SK텔레콤')
getSymbols(symbols, src='yahoo')

prices = do.call(cbind, lapply(symbols, function(x) Cl(get(x)))) %>% setNames(symbols)
rets = Return.calculate(prices) %>% na.omit()
names(rets) = names
covs = cov(rets) * 252

먼저 필요한 패키지들을 불러온 후, 삼성전자, 셀트리온, 현대차, 신한지주, SK텔레콤에 해당하는 종목 가격을 불러옵니다. 그 후 수익률과 공분산을 계산하도록 합니다. 공분산은 연율화를 해주기 위해 252를 곱해줍니다.

library(quantmod)
charts.PerformanceSummary(rets, main = 'rets')


수익률 그래프를 그려보면 셀트리온의 누적수익률이 압도적으로 높습니다.

yearly_mean = Return.annualized(rets, geometric = FALSE) %>% c()
yearly_vol = StdDev.annualized(rets) %>% c()
# diag(covs) ^ (1/2)

yearly_stat = cbind(yearly_mean, yearly_vol) %>%
  data.frame()

연율화 수익률과 연율화 변동성을 계산하도록 합니다. 연율화 변동성의 경우 위에서 구한 연율화 분산-공분산의 대각 부분의 제곱근을 구해도 같습니다. 이를 cbind()를 이용해 열로 묶습니다.


yearly_stat %>%
  ggplot(aes(x = yearly_vol, y = yearly_mean, label = names, color = names)) +
  geom_point(shape = 18) +
  scale_x_continuous(expand = c(0.02, 0.02)) + 
  scale_y_continuous(expand = c(0.02, 0.02)) +
  geom_text(size = 3, vjust = -0.7) +
  theme(legend.position = 'none') +
  xlab('Volatility') +
  ylab('Return')



ggplot을 이용해 x축에는 연율화 변동성, y축에는 연율화 수익률을 나타내 줍니다. 셀트리온의 수익률과 변동성이 압도적으로 높습니다.


# Simulation
numAssets = length(symbols)
numPortfolio = 10000
sim = list()

for (i in 1 : numPortfolio) {
  
  wt = runif(numAssets, min=0, max=1)
  wt = wt / sum(wt)
  expected_return = wt %*% yearly_mean
  expected_vol = (t(wt) %*% covs %*% wt) %>% sqrt()
  expected_sharpe = (expected_return-0.05) / expected_vol
  
  sim[[i]] = c(wt, expected_return, expected_vol, expected_sharpe)
  
}

sim = do.call(rbind, sim) %>% data.frame()
colnames(sim) = c(names, 'Return', 'Volatility', 'Sharpe')


본격적으로 시뮬레이션을 실행합니다. 시뮬레이션 횟수를 총 10,000번이며 많을 수록 좋습니다. 먼저 runif() 함수를 이용해 난수를 생성하며, 공매도 방지를 위해 0에서 1 사이의 값에서 난수를 생성하도록 합니다. 그 후 합이 1이 되도록 정규화를 해줍니다. (개별 종목별 비중제한을 두고 싶으면 while 구문을 이용해 정규화를 계속해주면 됩니다.)

기대수익률은 비중과 수익률의 단순 가중평균합이 됩니다.
포트폴리오의 분산은 w'Ωw로 나타낼 수 있으며, 해당값에 sqrt()를 치해주면 포트폴리오의 표준편차가 됩니다.
마지막으로 샤프지수는 포트폴리오 수익률에서 무위험 수익률을 차감한 값을, 포트폴리오 변동성으로 나눠줍니다. 무위험 수익률은 5%로 가정합니다.

해당 값들을 c()를 이용해 벡터로 묶어준 후 sim 리스트에 저장합니다.
시뮬레이션이 끝나면 do.call() 함수를 이용해 행으로 묶습니다.

target_minvol = sim[which.min(sim$Volatility), ]
target_maxsharpe = sim[which.max(sim$Sharpe), ]

> target_minvol
      삼성전자   셀트리온    현대차  신한지주  SK텔레콤    Return Volatility    Sharpe
4657 0.2447684 0.09979261 0.0992029 0.1240248 0.4322112 0.1306394  0.1896045 0.4253035
> target_maxsharpe
      삼성전자  셀트리온    현대차    신한지주   SK텔레콤    Return Volatility    Sharpe
3457 0.3303538 0.5068116 0.1004232 0.009327201 0.05308417 0.3044934  0.3103827 0.8199342

효율적 경계선에서 중요한 지점은 크게 최소분산 지점과 최대샤프 지점입니다. 최소분산 지점은 which.min() 함수를 통해 표준편차가 가장 작은 지점, 최대샤프 지점은 which.max() 함수를 통해 샤프지수가 최대인 지점을 찾으면 됩니다.

# plot simulation
p = sim %>%
  ggplot(aes(x = `Volatility`, y = `Return`, color = `Sharpe`)) +
  geom_point() +
  scale_color_gradient(low = 'blue', high = 'red') +
  theme_classic()

p



ggplot을 이용해 시뮬레이션 결과를 그려주도록 합니다. aes() 내부에 color 인자를 Sharpe로 지정하여 샤프지수에 따라 색이 다르며, 샤프지수가 높을수록 붉게 표시됩니다.


# plot min vol and max sharpe
p2 = p +
  geom_point(data = target_minvol,
             aes(x = Volatility, y = Return),
             col = 'black', shape = 18, size = 3) +
  geom_point(data = target_maxsharpe,
             aes(x = Volatility, y = Return),
             col = 'black', shape = 18, size = 3) +
  annotate('text',
           x = target_minvol$Volatility + 0.03,
           y = target_minvol$Return,
           label='Min Vol',
           fontface=2) +
  annotate('text',
           x = target_maxsharpe$Volatility + 0.03,
           y = target_maxsharpe$Return,
          label='Max Sharpe',
          fontface=2) +
  geom_point(data = yearly_stat,
             aes(x = yearly_vol, y = yearly_mean),
             color = 'black', shape = 4, size = 3)
p2



앞선 그림에 추가적으로 최소분산 및 최대 샤프지수 지점을 표시해 주었습니다. 또한 검은색 X는 개별 주식의 변동성과 수익률에 해당하는 부분으로써, 포트폴리오 구성을 통해 훨씬 효율적인 투자가 가능해짐이 보입니다.

# plot CML

p2 + 
  geom_abline(intercept = 0.05,
              slope = target_maxsharpe$Sharpe,
              size = 1) +
  expand_limits(x=0) +
  expand_limits(y=0) 



마지막으로 무위험 수익률과 최대샤프지수 지점를 이은 CML을 그려줍니다. 인터셉트는 무위험 수익률, 기울기는 샤프지수가 됩니다. Max Sharpe 지점에 투자하는 것이 가장 이상적인 포트폴리오이며, 투자자의 risk averse에 따라 직선의 왼쪽이나 오른쪽으로 이동하며 위험자산과 무위험자산의 투자 비중을 조절하게 됩니다.

2019년 2월 17일 일요일

금리 인상은 리스크패리티(Risk Parity) 전략에 독약인가?




브릿지워터의 All Weather 포트폴리오를 시작으로
Risk Parity 전략을 사용하는 펀드들은
어느새 상당한 규모로 성장하였습니다.

그러나 이러한 전략에 대한 대표적인 비판은 다음과 같습니다.


1. 포트폴리오 비중의 대부분이 채권이며,
성과의 대부분이 채권에서 온다.

2. 안정적인 백테스트의 대부분은 금리 인하시기였으며,
금리가 인상되면 채권 손해로 수익률이 하락할 것이다.


심지어 시장을 망치는 주범으로까지 비난받고 있습니다.


이와 같은 비판이 정말 맞을까요?

이를 확인하기 위해 글로벌 10개 자산 대상
리스크패러티 전략 포트폴리오의 
성과를 분해해보도록 하겠습니다.


(데이터 소스: HenryQuant 패키지의 asset_data)





장기간 꽤나 안정적인 수익률을 보이지만,
2015년과 2018년 큰 마이너스 수익률이 있었습니다.

전략에 대한 비판이 본격적으로 나온 시점도 이때부터 입니다.




다음은 시점별 주식, 채권, 대체자산의 비중입니다.

대부분 비중이 채권으로 구성된다는 믿음과는 다르게,
주식 보다 약간 많은 수준이며,
대체자산도 비중이 꽤나 높습니다.




비중들의 평균값입니다.
주식 23.62% / 채권 42.11% / 대체자산 34.26% 로써
채권과 대체자산이 오히려 비슷한 비중을 보이고 있습니다.




다음은 누적수익률을 각 자산별로 성과분해한 비중입니다.
성과의 대부분이 채권에서 온다는 비판과는 다르게
대략 1/3씩 기여를 하고 있습니다.




어찌됐건 포트폴리오에서 채권의 비중이 많은 점을
부정할 수는 없습니다.

그렇다면 과연, 금리가 인상되기 시작하면
채권 부분의 수익률이 망가질까요?




Line 부분은 미국의 금리,
막대그래프는 채권의 연간 수익률 입니다.

모두들 알다시피 1980년대 쯤 이후부터
미국 금리는 지속적으로 하락하는 모습을 보였습니다.


그렇다면 금리 인상시기, 채권의 수익률을 보기 위해
1950년 대부터 1980년대까지를 확대해보도록 하겟습니다.




1. 1955년부터 1960년까지 금리가 지속적으로 인상될때는
채권 수익률 역시 지속적으로 마이너스를 보입니다.

2. 그러나 그 이후 금리가 완만한 인상세를 보일때는
오히려 플러스를 기록하기도 합니다.

3. 1975년부터 1980년까지 다시한번 급격한 인상이 있을때
채권은 좋지 않은 모습을 보입니다.


결과적으로 급격한 금리 인상일 있을 경우
금리의 상승은 채권에 부정적인 영향을 미치지만,
완만한 금리 인상의 경우 그다지 큰 충격을 받지는 않는 듯 합니다.


사실 리스크 패리티에 대한 비판적 의견이
2019년 부터 미국의 금리인상을 앞두고 나왔던 거지만,
안올린다니... 걱정 안하시는게 낫지 않을까요?




2018년 11월 12일 월요일

Asset Allocation: Excel Practice (EW, MVP, MDP, Inv Vol, Risk Parity)



먼저 아래의 실습용 엑셀 파일을
다운로드 받아 주세요





먼저 covariance matrix 시트에는
실습에 사용될 10개 자산의 분산-공분산 매트릭스가 있습니다.
일별 수익률을 기준으로 연율화된 값입니다.



1. 동일비중





동일비중 포트폴리오 입니다.
모든 자산의 비중이 같으므로 설명할 내용조차 딱히 없습니다.



2. 최소분산 포트폴리오 (MVP)




포트폴리오의 분산을 최소화 시키는 포트폴리오 입니다.

분산은 w'Ωw로 나타낼 수 있으며
여기서 w는 비중의 벡터 형태, '는 전치행렬 형태,
Ω는 분산-공분산 행렬을 나타냅니다,

이를 엑셀로 나타내는 수식은 C23 셀에 나타낸 것과 같습니다.
먼저 엑셀에서 행렬을 곱하는 함수는 MMULT 이며,
전치행렬을 구하는 법은 TRANSPOSE 입니다.

따라서 

MMULT(TRANSPOSE(C11:C20),F11:O20)

연산은 w' * Ω 값을 나타냅니다.
해당 값을 다시 MMULT를 통해 w와 곱해주는 수식은 다음과 같습니다.

=MMULT(MMULT(TRANSPOSE(C11:C20),F11:O20),C11:C20)


또한 엑셀에서 행렬의 연산은 ctrl + shift + enter 를 통해 입력해주어야 하며,
이를 통해 수식의 양옆에 {} 기호가 생기게 됩니다.




동일비중으로 포트폴리오의 분산을 구할 경우 0.90%가 나오며,
표준편차는 루트값인 9.50% 값이 나오게 됩니다.

이번에는 엑셀의 해찾기 기능을 통해
포트폴리오의 분산이 최소화 되는 값을 찾아보도록 합니다.




엑셀의 해찾기 기능은 데이터 탭에 있습니다.
만일 해당 탭이 없는 분은
엑셀의 파일 - 옵션 - 분석 도구 - Excel 추가 기능 (이동) 후
분석 도구와 해 찾기 추가 기능을 체크해 주시면 됩니다.









먼저 목표셀은 포트폴리오 분산에 해당하는 D23 셀을 선택하며,
대상은 최소를 선택합니다.

변수 셀은 비중에 해당하므로 D11 부터 D20 까지 셀을 선택합니다.

제약조건으로는

1) 모든 비중이 0보다 클 것
2) 모든 비중의 합이 1일 것

이므로 이에 해당하는 제약 조건을 추가로 입력해 줍니다.

그 후 해찾기 버튼을 누르면
위에 입력된 목적함수, 제약조건에 해당하는 
최적의 값을 찾아주게 됩니다.




해당 조건을 만족하는 변수값 (D11:D20)이 변경되었음이 확인됩니다.
포트폴리오의 분산은 기존 0.90%에서 0.18%로 줄어들었으며,
표준편차는 9.50%에서 4.20%로 줄어들었습니다.


위의 방법으로 분산이 최소화되는 최적값을 찾을 수는 있습니다.

그러나 하나의 자산 비중이 75% 이상인 코너해 문제가 발생하게 됩니다.
따라서 각 자산별 최소 및 최대 비중 제약조건을 추가해 주도록 합니다.




Min Vol + Max 시트로 이동하도록 하겠습니다.

이번에는 개별 자산의 최소 비중이 5%, 최대 비중이 20%인 제약조건
추가해주도록 하겠습니다.

위와 같은 제약조건도 해찾기를 통해 매우 쉽게 추가할 수 있습니다.




역시나 목표는 포트폴리오의 분산에 해당하는D23 셀을 지정해 주며,
변수 셀은 비중에 해당하는 D11 부터 D20 까지의 셀을 지정해 줍니 다.

추가적인 제약조건으로 변수셀의 비중이
5% 이상 및 20% 이하일 것을 지정해주며,

비중의 합이 1인 제약조건 역시 추가해줍니다.




종목별 제약조건(최소 5%, 최대 20%)이 제대로 반영되어
비중이 계산되어 졌습니다.




동일가중, 최소분산, 제약조건하에서 최소분산의 ex-ante 변동성을 비교하면,
제약조건이 없는 최소분산 포트폴리오의 표준편차가 가장 낮으며,
제약조건이 추가될 경우 포트폴리오의 표준편차가 다소 올라감이 확인됩니다.



3. 최대분산효과 포트폴리오 (MDP)




MDP는 분산비율 (DR: Diversification Ratio)를
최대화하는 포트폴리오입니다.

먼저 분자 항목은 각 자산별 변동성의 단순 가중합을 나타냅니다.
분모 항목은 포트폴리오의 표준편차를 나타냅니다.

먼저 분자 항목을 구하기 위해서는
각 개별 자산의 변동성(표준편차)을 구해야 합니다.

분산-공분산 행렬에서 i행 j열 값은 σ(i,j)를 나타냅니다.
따라서 i=j인 셀의 값은 σii, 즉 (σi)^2 으로도 나타낼 수 있으며,
해당 값의 제곱근을 구한다면 개별자산의 표준편차인 σi를 나타내게 됩니다.

R11셀부터 R20셀 까지는 
분산-공분산 행렬의 대각행렬에 해당하는 값들의 제곱근을 통해 계산된
각 개별자산의 표준편차 값입니다.




먼저 분자에 해당하는 부분은
비중에 해당하는 C11:C20 셀과,
개별 표준편차에 해당하는 R11:R20 셀을 통해 구하며,
가중합을 구하는 함수인 SUMPRODUCT를 이용해 주도록 합니다.

=SUMPRODUCT(C11:C20,R11:R20)




분모의 경우 앞에서 포트폴리오를 계산한 방법과 동일하게
MMULTTRANSPOSE 함수를 이용하여 계산해주며,

분산이 아닌 표준편차이기에 SQRT 함수를 이용하여
제곱근 값을 계산해 주도록 합니다.


위에서 구한 분자와 분모를 통해 DR을 계산하면 1.63이 나오게 됩니다.
MDP 포트폴리오는 이 DR이 최대화 되록 해찾기를 통해 구해주도록 합니다.




목표는 DR에 해당하는 D25 셀을 입력해 주며,
max DR이 목표이므로 대상에 최대값을 선택해 줍니다.

변수 셀에는 비중에 해당하는 D11부터 D20까지 셀을 입력해주며,
제약조건은 기존과 동일하게 최소 5%, 최대 20%, 합 100%를 입력해 줍니다.




역시나 정해진 제약조건을 만족하는 값이 잘 계산되며,
DR역시 1.63에서 2.04로 증가하게 됩니다.



4. Inverse Volatility


흔히 Naive Risk Parity 라는 이름으로 알려진
역변동성 포트폴리오 입니다.

딱히 최적화기법이 필요없이 손쉽게 계산할 수 있습니다.




먼저 앞서 계산된 개별 자산의 표준편차의 역수를 구해주도록 합니다.





'개별 자산의 변동성의 역수 / 변동성 역수의 합'
값을 통해 역변동성 포트폴리오를 쉽게 계산할 수 있습니다.




표준편차와 비중간의 관계를 보면,
표준편차가 클수록 비중이 작고,
표준편차가 작을수록 비중이 큼이 확인됩니다.




5. Risk Parity


먼저 Marginal Risk Contribution(MRC)은
포트폴리오 변동성의 wi에 대한 편미분 값이며,

Risk Contribution(RC)는 MRC * Wi 값입니다.

리스크 패러티는 모든 자산의 RC 값이
동일하게 되는 포트폴리오를 의미합니다.




위의 Proof 를 살펴보면
MRC는 분산-공분산 매트릭스(Ω)와 비중(w)의 곱을
포트폴리오의 표준편차로 나눈 값으로 계산됩니다.




먼저 MRC에 해당하는 셀인 D11부터 D20까지의 셀을
드래그 하여 선택해 줍니다.

분산-공분산 행렬에 해당하는 J11부터 S20까지의 셀과
비중에 해당하는 C11부터 C20까지의 셀을
MMULT함수를 이용항 곱해준 후,

포트폴리오의 표준편차에 해당하는 C24 셀로 나누어 주도록 합니다.

ctrl + shift + enter를 통해 위 값을 계산해주면,
D11:D20셀 까지 자동으로 개별 자산의 MRC 값이 계산되게 됩니다.




RC는 MRC * W 이므로
C11셀과 D11셀을 곱하여 해당 자산의 RC를 구할 수 있으며,
E11부터 E20까지는 모든 자산의 RC 값이 계산됩니다.

단, 해당 값은 합이 1로 표준화되지 않은 값이므로,
'RC / RC의 합'을 통해 비중이 1이 되도록 표준화 해주도록 하며,
F11부터 F20까지의 셀이 해당 방법으로 계산된 RC 값입니다.

G11부터 G20까지의 셀은 목표가 되는 RC이며,
리스크 패러티의 경우 모든 자산의 RC가 10%로 동일합니다.




H11 셀의 값은 실제 RC와 목표 RC 간의 차이의 제곱값이며,
H21 셀은 해당 방법으로 구한 10개 자산의 차이의 제곱값의 합입니다.

리스크 패러티 포트폴리오는
모든 자산의 RC가 10%로 동일해야 합니다.

만일 실제로 RC가 10%로 동일하다면,
F11값은 0.10이 될 것이며, G11과의 차이는 0이 될 것입니다.

또한 모든 값의 차이가 0 이므로 차이의 합인 H21셀 또한 0이 될 것입니다.

그러나 현실적으로 해당 값이 0이 되는 것은 불가능하며,
해당 값이 최소가 되는 지점을 해찾기를 통해 구해주도록 합니다.
(제곱의 합이므로 음수가 될 수는 없겠죠?)



목표값은 제곱의 합에 해당하는 H21 셀을 선택해 주며,
변수 셀은 비중에 해당하는 C11부터 C20까지의 셀을 선택해 줍니다.

또한 제약조건으로는 비중의 합에 해당하는 C21셀이 1이 되도록 합니다.




해찾기로 계산된 결과를 보면
모든 자산의 RC값이 0.10으로 같으며
차이의 합이 거의 0에 가까움이 확인됩니다.

즉, 리스크 패러티를 만족하는 포트폴리오가 계산되었습니다.

목표 부분을 원하는 RC 값으로 입력한다면
Risk Budget 포트폴리오도 손쉽게 만들 수 있습니다.




하지만 엑셀로 매번 백테스트 할 수는 없으 코딩을 해야겠죠??? 

2018년 11월 3일 토요일

Time Frame Momentum in S&P 500, 이론 및 구글 스프레드시트를 이용한 실제 구현법




장기적인 투자 목적으로 100%에 주식에 투자하는 것은
의외로 꽤나 좋은 선택입니다.



1950년부터 현재까지 70년 가량 미국주식 (SP 500에) 장기투자할 시
연간 대략 7%의 수익률을 기록하게 됩니다.

여러분이 만일 30살이고 60세에 은퇴한다는 가정을 하면
30년간 7%의 수익률만 기록해도 누적으로는
(1+0.07)^30 - 1 = 6.61, 즉 600% 이상의 수익률을
기록할 수 있다는 나이브한 계산이 나오게 됩니다.





From
Trough
To
Depth
Recovery
1
2007-11-30
2009-02-27
2013-03-28
-52.56%
49
2
2000-09-29
2002-09-30
2007-05-31
-46.28%
56
3
1973-01-31
1974-09-30
1980-07-31
-46.18%
70
4
1968-12-31
1970-06-30
1972-05-31
-32.90%
23
5
1987-09-30
1987-11-30
1989-07-31
-30.17%
20


그러나 문제는 이따금 겪게되는 폭락장입니다.
위 그래프와 테이블은 하락의 폭만을 나타낸 것입니다.

2007년 부터 2009년까지는 무려 -52% 손해가 났으며,
이러한 손해가 복구되는데는 무려 49개월이 걸렸습니다.

이 외에도 주식시장에서는 20%이상 손해가 발생하는 경우는 비일비재 합니다.


만일 여러분이 오직 주식에 100% 투자를 한다고 생각해 봅시다.
과연 내 자산 중 절반 가량이 날아가는데
장기적인 미래를 보고 버틸수 있을까요???


답은 No 일겁니다.


이러한 하락을 피하기 위해 종종 사용되는 것이
Time Series Momentum 입니다.

10개월 이동평균선, 혹은 12개월 누적수익률이
0보다 크면 홀딩, 아니면 전량 매도하는 로직이죠.

이는 Meb Faber의 전설적인 논문
A Quantitative Approach to Tactical Asset Allocation 에도
잘 나타나 있습니다.



검은색은 SP500 단순 보유,
붉은색은 매월말 12개월 누적수익률이 0 이상이면 매수,
아니면 매도인 포트폴리오의 비교 입니다.

단순하게 수익률 측면에서는 SP500 보유가 우월한 듯 보입니다.
그러나 차이는 하락 방어에 있습니다.




이따금 발생하는 하락장에서
타이밍 포트폴리오는 월등하게 하락의 폭을 줄여줍니다.



Buy & Hold
Timing
Ann Ret (Arith)
8.25%
6.51%
Ann Ret (CAGR)
7.47%
6.07%
Ann Std Dev
14.23%
10.97%
Ann Sharpe
0.5248
0.5532
MDD
52.56%
30.59%



연율화 수익률은 7.5% vs 6.1% 인 반면
변동성은 타이밍 포트폴리오가 월등히 작습니다.

MDD도 기존 52%에서 30%까지 하락하게 됩니다.



그러나 이러한 포트폴리오의 문제는
전체 투자비중이 0 아니면 1이라는 지나치게 디지털적인 모습이란 것입니다.


하락장에서는 전량 매도하여 하락을 피하지만,
그 후 강한 반등에서는 주식비중이 0 이므로 배를 곪게 되죠,


이를 해결 하기위해 Time Frame Momentum을 적용합니다.
3,4,5,,,,,12개월 누적수익률을 각각 측정한 후
수익률이 0보다 크면 1, 아니면 0의 값을 구합니다.

그 후 10개 숫자의 평균 만큼을 투자하도록 합니다.
이의 예시는 다음과 같습니다.


개월수
누적수익률
>0 여부
3개월
6.01%
1
4개월
9.23%
1
5개월
10.45%
1
6개월
0.99%
1
7개월
-8.48%
0
8개월
2.44%
1
9개월
4.65%
1
10개월
2.31%
1
11개월
-0.78%
0
12개월
-0.19%
0
합계
7


총 7개가 0보다 크므로 투자비중은
7/10 = 70%가 되도록 합니다.


Timing
Time Frame
Ann Ret (Arith)
6.51%
6.15%
Ann Ret (CAGR)
6.07%
5.79%
Ann Std Dev
10.97%
9.99%
Ann Sharpe
0.5532
0.5795
MDD
30.59%
26.93%

단순 수익률로만 보면 둘은 거의 비슷해 보입니다.




S&P 500
Timing
Time Frame
2009
23.45%
6.97%
15.35%
2003
26.38%
11.60%
18.30%
1975
31.55%
-1.64%
7.72%
1970
0.10%
0.00%
4.45%


두 모델의 가장 큰 차이는 폭락 후 반등장에서 있습니다.

Time Frame 모멘텀을 적용할 경우
하락장에서는 비중을 서서히 줄여나가는 반면,
반등장에서는 서서히 비중을 올려나가므로
주식시장의 상승을 어느정도 따라갈 수 있습니다.



다음은 해당모형을 2004년 부터 실제 ETF에 적용한 결과 입니다.
투자하지 않는 비중은 단기채에 투자합니다.

 

SP 500
Time Frame
Ann Ret (Arith)
7.68%
6.00%
Ann Ret (CAGR)
6.21%
5.54%
Ann Std Dev
18.22%
11.05%
Ann Sharpe
0.3408
0.5016
MDD
56.47%
14.94%


수익률은 비슷하지만 MDD가 현격하게 개선되었습니다.


시점별 투자비중입니다
최근에는 미국의 모멘텀이 꺾이며 투자비중이 다소 내려온것이 확인됩니다.


그렇다면 과연 이는 어떻게 투자가 가능할까요?
물론 미국에 상장된 SPY와 같은 ETF에 직접 투자하는 것도 좋지만,
환전 및 환변동, 세금 등의 문제가 번거롭습니다.

국내에도 SP500을 추종하는 ETF가 3개정도 상장되어 있습니다.










세가지 ETF 모두 환헷지 형이라 원달러 간의 영향은 받지 않으며, 
오직 SP 500 수익률만의 영향을 받습니다.

차이점이 있다면,
KODEX와 TIGER ETF는 선물을 통해 복제하며,
ARIRANG ETF는 현물 바스켓을 통해 복제합니다.

현물 복제의 경우 배당금을 받을 수 있겠죠?


그렇다면 SP 500 지수의 Time Frame Momentum 은 어떻게 계산할 수 있을까요?


야후 파이낸스(finance.yahoo.com)에 접속하여 ^GSPC 를 입력하면
SP500 지수에 해당하는 정보를 받을 수 있습니다.
링크는 다음과 같습니다.



그 후 Historical Data 항목에서 Frequency를 Monthly를 설정한 후 Apply를 누르면,
월간기준 SP 500 지수의 정보를 얻을 수 있습니다.




해당 데이터의 바뀐 url을 보면 다음과 같습니다.

https://finance.yahoo.com/quote/%5EGSPC/history?period1=1509691276&period2=1541227276&interval=1mo&filter=history&frequency=1mo

이 중 period1과 period2는 각각
데이터 시작시점과 종료시점을 나타내니다.

해당 url과 구글 스프레드 시트의 크롤링 기능을 이용하면,
위 테이블을 스프레드 시트로 가져올 수도 있습니다.







먼저 시작일과 종료일에 해당하는 time stamp를 만들어 주어야 합니다.

시작일의 start 날짜는 현재일에서 대략 400일 전에 해당하는
=TODAY()-400

종료일은 현재 날짜에 해당하는
=today()

를 입력해 줍니다.

time stamp는 1970년 1월 1일 기준이며,
해당일자와 입력 날짜와의 차이에

시 * 분 * 초 24 * 60 * 60, 즉 86400을 곱해줍니다.

위에서 생성된 timestamp를 yahoo finance의 url에 응용하면 다음과 같습니다.


https://finance.yahoo.com/quote/%5EGSPC/history?period1="&B3&"&period2="&C3&"&interval=1mo&filter=history&frequency=1mo


이중 B3 셀은 start 시점을, C3 셀은 end 시점을 의미하며,
날짜가 지나면 자동으로 갱신됩니다.

또한 IMPORTHTML 함수를 이용하면 해당 url의 테이블 내용을 
구글 스프레드시트로 불러올 수도 있습니다.


IMPORTHTML("https://finance.yahoo.com/quote/%5EGSPC/history?period1="&B3&"&period2="&C3&"&interval=1mo&filter=history&frequency=1mo","table")






17년 7월부터 18년 11월까지의 SP500 지수에 해당하는
야후 파이낸스의 데이터를 불러옵니다.

날짜의 왼쪽에는 1,2,3, ... ,13에 해당하는 인덱스를 직접 입력합니다.




다음은 vlookup 함수를 이용하여
인덱스에 해당하는 날짜와 지수(Close) 부분을 가져옵니다.




마지막으로 타임 프레임별 누적수익률을 구하고,
0 이상인지의 유무를 판단합니다.

2018년 11월 1일을 기준으로 각각 3개월, 4개월,,,, 12개월 전 가격과 비교하여
타임 프레임별 수익률을 구합니다.

그 후 오른쪽에는 if 함수를 사용하여 해당값이 0보다 큰가를 비교합니다

마지막으로 10개 셀의 평균을 구해주면,
현재 시점에서는 SP 500 에 70%를 투자하라는 결과가 나오게 됩니다.