先日,レバレッジド・ポートフォリオに影響をうけて,自分用にカスタマイズした hass LPF を構築しました.
ただ,レバレッジド・ポートフォリオの開発者のhiroakitさんから,次のようなコメントがありました.
ただ、VIXインバースはそれこそ金融危機とかのときに一気にリスクが高まる商品なので、金融危機のときのシミュレーションがないとテストとしてはあまり意味がないとは思います。
— Hiro implements Serializable (@hiroakit_roko) December 20, 2017
ごもっともなご指摘だったので,サブプライムショックやリーマン・ショックを含む,2002年から2009年までのヒストリカルデータを用いて検証してみました.
ただ,今回の検討は実際の金融危機におけるVIX系ETPの値動きをきちんと表現できていません.そこをチェックしたいはずなのに,実際にはかなり楽観的なモデルになっており,ちゃんとしたテストになっていません.あくまでもお遊びだと思ってください.
追記: hass LPFのリーマン・ショック時の評価をちゃんとしました.さらに,その結果を受けて改良したhass LPF Mk-IIを作りました.
検証方法
検証方法は以下の記事を参考にしています.
外部サイト 2002年~2009年を再現する(可変レバレッジド・ポートフォリオ) | ROKOHOUSE シーゲル流ロジカル投資術
私のレバレッジドポートフォリオは,UPRO,TMF,TLT,ZIVの4つからなります.今回はUPROの代わりにSPXLを使います1同じ指数に連動しているのでほとんど差はありません.
さて,検証期間は2002年8月から2009年12月末までですが,SPXLやTMF,BND,ZIVはその期間に存在しない期間があります.SPXLとTMFは2009年4月,BNDは2007年4月,ZIVは2010年11月から存在しています.
そこで,存在しない期間の日次リターンをその期間にあったSPYやTLTなどから作ります.SPXLやTMF,BNDについては上の記事と同じように求めます.ZIVは先日らふにモデル化したものを使います.
これをざっくり説明すると,ZIVの値動きVIXの日次リターンの関数として表したものです.つまり,$\alpha + \beta\cdot(VIX\ daily\ return)$ですね.なお,$\alpha$はコンタンゴやバックワーデーションなどによる増価/減価を表し,$\beta$はVIX日次リターンに対する感応度です.
ただ,$\alpha$と$\beta$を定数としていることが原因で金融危機が発生した状況での動き方としては非常に楽観的になっています.
楽観的なモデルで検証しても意味はないので,ZIVのらふなモデルのパラメータをふってより保守的な場合(リターンが悪い場合)も考えます.ZIVのバリエーションとして,以下の3パターンを考えます.
- そのままのバージョン ($\alpha$=0.0021,$\beta$=-0.276)
- $\alpha$を小さくしたバージョン ($\alpha$=0.0015,$\beta$=-0.276)
- 加えて$\beta$の絶対値を大きくしたバージョン ($\alpha$=0.0015,$\beta$=-0.4)
以下が検証に利用したRのコードです.
require(quantmod) require(PerformanceAnalytics) # SPY getSymbols("SPY", from="2002-08-01", to="2009-12-31") SPY_return <- Return.calculate(Ad(SPY)) colnames(SPY_return) <- c("SPY") SPXL_return <- SPY_return*3 - 0.0001072794 colnames(SPXL_return) <- c("SPXL (estimated)") # TLT getSymbols("TLT", from="2002-08-01", to="2009-12-31") TLT_return <- Return.calculate(Ad(TLT)) colnames(TLT_return) <- c("TLT") TMF_return <- TLT_return*3 - 0.0001265848 colnames(TMF_return) <- c("TMF (estimated)") # VBMFX getSymbols("VBMFX", from="2002-08-01", to="2009-12-31") VBMFX_return <- Return.calculate(Ad(VBMFX)) colnames(VBMFX_return) <- c("VBMFX") # VIX getSymbols("^VIX", from="2002-08-01", to="2009-12-31") VIX_return <- Return.calculate(Ad(VIX)) ZIV_return <- -0.276*VIX_return+0.0021 ZIV_return_low <- -0.276*VIX_return+0.0015 ZIV_return_low2 <- -0.4*VIX_return+0.0015 colnames(ZIV_return) <- c("ZIV (estimated)") colnames(ZIV_return_low) <- c("ZIV (conservatively estimated)") colnames(ZIV_return_low2) <- c("ZIV (conservatively estimated2)") all_etps <- merge(SPXL_return, TMF_return, VBMFX_return, TLT_return, ZIV_return, ZIV_return_low, ZIV_return_low2) SPXL_TMF_TLT_ZIV <- merge(SPXL_return, TMF_return, TLT_return, ZIV_return) SPXL_TMF_TLT_ZIV2 <- merge(SPXL_return, TMF_return, TLT_return, ZIV_return_low) SPXL_TMF_TLT_ZIV3 <- merge(SPXL_return, TMF_return, TLT_return, ZIV_return_low2) SPXL_TMF_VBMFX <- merge(SPXL_return, TMF_return, VBMFX_return) # 独立して確認 pdf(file="performance.pdf") charts.PerformanceSummary(all_etps) write.table(Return.annualized(all_etps), file="metrics.csv", sep=",", row.names=FALSE, col.names=TRUE) write.table(maxDrawdown(all_etps), file="metrics.csv", sep=",", row.names=FALSE, col.names=TRUE, append=TRUE) # ポートフォリオ ## リバランスあり hass_lpf <- Return.rebalancing(SPXL_TMF_TLT_ZIV, weights=c(0.3, 0.2, 0.3, 0.2), rebalance_on="quarters", geometric=TRUE) hass_lpf_low <- Return.rebalancing(SPXL_TMF_TLT_ZIV2, weights=c(0.3, 0.2, 0.3, 0.2), rebalance_on="quarters", geometric=TRUE) hass_lpf_low2 <- Return.rebalancing(SPXL_TMF_TLT_ZIV3, weights=c(0.3, 0.2, 0.3, 0.2), rebalance_on="quarters", geometric=TRUE) lpf_high <- Return.rebalancing(SPXL_TMF_VBMFX, weights=c(0.4, 0.3, 0.3), rebalance_on="quarters", geometric=TRUE) colnames(hass_lpf) <- c("hass LPF") colnames(hass_lpf_low) <- c("hass LPF (conservative)") colnames(hass_lpf_low2) <- c("hass LPF (conservative2)") colnames(lpf_high) <- c("ROKOHOUSE LPF high") pf_result <- merge(hass_lpf, hass_lpf_low, hass_lpf_low2,lpf_high, SPY_return) charts.PerformanceSummary(pf_result) write.table(Return.annualized(pf_result), file="metrics.csv", sep=",", row.names=FALSE, col.names=TRUE, append=TRUE) write.table(maxDrawdown(pf_result), file="metrics.csv", sep=",", row.names=FALSE, col.names=TRUE, append=TRUE) ## リバランスなし hass_lpf_nor <- Return.rebalancing(SPXL_TMF_TLT_ZIV, weights=c(0.3, 0.2, 0.3, 0.2), geometric=TRUE) hass_lpf_low_nor <- Return.rebalancing(SPXL_TMF_TLT_ZIV2, weights=c(0.3, 0.2, 0.3, 0.2), geometric=TRUE) hass_lpf_low2_nor <- Return.rebalancing(SPXL_TMF_TLT_ZIV3, weights=c(0.3, 0.2, 0.3, 0.2), geometric=TRUE) lpf_high_nor <- Return.rebalancing(SPXL_TMF_VBMFX, weights=c(0.4, 0.3, 0.3), geometric=TRUE) colnames(hass_lpf_nor) <- c("hass LPF (no rebalancing)") colnames(hass_lpf_low_nor) <- c("hass LPF (convervative,no rebalancing)") colnames(hass_lpf_low2_nor) <- c("hass LPF (convervative2,no rebalancing)") colnames(lpf_high_nor) <- c("ROKOHOUSE LPF (no rebalancing)") pf_nor_result <- merge(hass_lpf_nor, hass_lpf_low_nor, hass_lpf_low2_nor, lpf_high_nor, SPY_return) charts.PerformanceSummary(pf_nor_result) write.table(Return.annualized(pf_nor_result), file="metrics.csv", sep=",", row.names=FALSE, col.names=TRUE, append=TRUE) write.table(maxDrawdown(pf_nor_result), file="metrics.csv", sep=",", row.names=FALSE, col.names=TRUE, append=TRUE) dev.off()
結果
個々の値動き
まずは個々のETPの値動きを確認してみましょう.
水色,紫,黄色がそれぞれZIVが順により保守的にした場合の結果です.水色は明らかにやりすぎですよね.VXXの理論価格2VIX先物は2004年頃からあり,指数の計算式も公開されているので理論価格を計算できますでは,サブプライムショックまでに上がった分をその直後にほぼ前戻しになったのちにしばらくぐだっています.したがって,ZIVも水色みたいな動きにはならないはずです.
紫と黄色の結果については,サブプライムショックまでの上昇分とそれ以降の下落・ぐだり方とはだいぶ乖離があるんじゃないかなと想像するものの,黄色についてはリターンとしてはこんなもんじゃないかな,と想像しています.
3ヶ月ごとにリバランス
hass LPFを3ヶ月ごとにリバランスした際の結果はこんな感じです.なお,比較としてSPYとROKOHOUSE式可変レバレッジド・ポートフォリオ(高リスク)も載せています.
いずれの場合もhass LPFは SPY より低ドローダウンで高リターンになっていますね.
繰り返しますが,ZIVはかなり楽観的なモデルになっているのであくまで参考程度です.
リバランスなし
ちなみにリバランスしなかった場合はこんな感じになります.
らふにモデル化したZIVが強すぎるので,黒の線のhass LPFはリバランスをしなかった方が結果が良いです.よくて緑色くらいの結果になるんじゃないかなと思っています.
やっぱりリバランスはしたほうがいいですね.
おわりに
今回はらふにモデル化したZIVを使って hass LPF の2002年から2009年までのパフォーマンスをみてみました.あまりにもモデルがらふすぎたので,VIX系ETPであるZIVをポートフォリオに入れることが実際にいいのか悪いのか判断ができません.楽観的なモデルで結果が悪かったら「やっぱりダメだったね」で終わるのですが,微妙にありえそうな結果(保守的にしたモデル)だったので悶々とします.
いずれにしても検証としては不十分ですので,もうすこしマジメに再検証したいと思います.具体的には,VIX先物は2004年からあるので,それと公開されているVIX中期先物指数の算出式を用いて求めたZIVの理論価格を使って検証しようと思います.まぁめんどうですが.
コメント