Dr.Kernelの見た世界

ゆとり第一世代の医師。読んだ本の感想や社会と経済、気になるテクノロジーやヘルスケアの話

レバレッジETFの乖離を詳しく見てみる(SPXL編)

※記事の最新バージョンはこちらに移動しています。
drkernel.net

レバレッジETFの構成銘柄

レバレッジETFであるSPXL(S&P500の毎日の値動きに対して3倍の値動きをするETF)の構成を見てみると、現物であるIVVの他に、S&Pのデリバティブ先物スワップ)、現金ファンドで構成されていることがわかります。デリバティブを使うということは、金利負担が発生による下方圧力を生み出す可能性があります。

先日レバレッジ投資をしている方々の中でも話題に上がっていました。金利が高くなることによりSPXLのリターンが悪くなるのではないかという懸念です。

特にデリバティブの中ではスワップの割合が多いのですが、スワップとは、金利分を支払う代わりにS&P500のリターン(キャピタルゲイン、インカム)を得る商品のようです。

つまり、SPXLはデリバティブレバレッジをかけるために金利を払う。一方で、手元のキャッシュで金利を得ている。ただレバレッジのための金利負担の方が当然大きいです。レバレッジを掛けたことで、先物分からはS&P500のキャピタルゲインが得られます。スワップ取引がちゃんと理解できているか怪しいですが、S&P500 ETFスワップからはキャピタルゲインとインカム分が得られているはずです。

金利が高くなってきたときに金利による下方圧力が心配の種でしたが、hassさんが証券会社に問い合わせてくださったようで、実際の金利負担分はそこまで大きくないとのことでした。

f:id:drkernel:20180728121610p:plain

Direxion SPXL, SPXS Funds (http://www.direxioninvestments.com/products/direxion-daily-sp-500-bull-3x-etf
Investpedia 5 Equity Derivatives and How They Work (https://www.investopedia.com/articles/optioninvestor/10/equity-derivatives.asp#ixzz5MVlM7Mct)

先進国株の分析

ただ、そうは言っても実際どの程度トラッキングエラーが生じているのかが気になるものです。
なので解析をしてみました。

前提として以下の式で表される毎日の乖離を調べてみました。

(SPXLの日変動) = (IVVの日変動) ×3 + (乖離)

毎日の乖離がどの程度か?

SPXLが設定された2008年11月から解析をしてみたところ、1日の乖離は平均すると+0.005%、むしろプラスです。プラスもマイナスも含めた乖離幅の絶対値は0.18%でした。大きな乖離が毎日発生しているわけではなさそうです。
当初IVVとかSPYのETFで解析をしたために、分配金の日にETFの価格が変動する影響がでていました。下の画像ではS&P500自体の指数と比較しています。

2017年12月に大きく下方に乖離している日がありますが、SPXL自体の分配金がでた頃なのでその影響でしょうか。全体的には、設定された当初は市場環境もあってか毎日の乖離が大きい印象ですが最近は落ち着いているように見えます。

f:id:drkernel:20180728141857j:plain

月ごとの集計

毎日のデータでは解釈が難しいので、月ごとに区切って、毎日の乖離の平均を見てみます。先程よりもやや上方に乖離しているのがわかりやすいと思います。このプラスの乖離は年間に換算すると約+2.5%でした。商品の性質上発生する金利分差し引かれても上方に乖離しているのは、IVVやスワップから発生するインカムの可能性があります。金利で引かれる分を考慮すると+5~6%程度になるのは配当金分というのは納得いきます。本来S&P500の配当込みのインデックスとの比較が望ましいのでしょうが、Rで取得の方法がわからなかったので割愛します。

ただ、この1,2年の傾向を見てみると乖離が下に引きずられているのがわかると思います。環境を考えるとFF金利の上昇でしょうか。今後金利が高くなるとさらに金利負担分がSPXLのリターンに重くのしかかる可能性があります。

f:id:drkernel:20180728142459j:plain

年率換算するとどれほどのインパクトがあるものなのか?

実際にこの乖離が年率に換算するとどの程度のインパクトをおよぼすものなのかを見てみます。月ごとのリターンを年率換算して、その差をとった値なので、かなりナンセンスではあるのですが、、、
これまで概ね乖離としても上方に乖離していたのが、最近ではやや下振れしており、特に今年1月と7月に大きく下に乖離した影響もあり、今年は-9.2%程度乖離しています。ただ、2-6月については乖離は限定的であり、金利による慢性的な乖離というわけではなさそうです。ただ、金利が高くなるとさらに下向きの圧力がかかると思います。

f:id:drkernel:20180728142510j:plain

結論

今回データを調べて細かく解釈したことで、よりレバレッジETFについての理解が深まった気がします。SPXLは大体S&P500インデックス(配当なし)の3倍の値動きを実現します。レバレッジを利用するための金利負担を支払う必要があり、少しずつリターンを下方に押し下げる圧力があります。ただ、現物ETFスワップから得られる分配金分が価格に内包されており、それがSPXLのリターンを上昇させています。

SPXLに期待するリターンをごく簡単に表すと、
リターン = キャピタルゲイン * 3 + インカム * 3 - 金利 * 2
と定式化できそうです。もちろん今後、金利上昇によるリターンの低下やS&P500自体の暴落などが起きたときは大きなリスクになりえるのでご注意ください。


レバレッジETFのシミュレーション結果を線形回帰でやってみました。
drkernel.hatenablog.com

レバレッジETFは高リスクなので、リスクマネジメントは必須です。
drkernel.hatenablog.com

・株式ポートフォリオ管理用のスプレッドシート
drkernel.hatenablog.com

解析者用のRコード

#### Setting ####
library(lubridate)
library(xts)
library(quantmod)
library(PerformanceAnalytics)

#### S&P500 ETFとレバレッジETFの乖離を探る ####
end <- Sys.Date() 
start <- "2008-11-05"

#### Fetch Stock Data ####
SPXL = getSymbols("SPXL", src = 'yahoo', auto.assign = FALSE, warnings = FALSE, from=start, to=end)
SP500 = getSymbols("^GSPC", src = 'yahoo', auto.assign = FALSE, warnings = FALSE, from=start, to=end)

#### Calculate Return ####
period = "daily"
SPXL_return = periodReturn(SPXL, period = period, subset=paste(start, "::", sep = ""), type = 'arithmetic')
SP500_return = periodReturn(SP500, period = period, subset=paste(start, "::", sep = ""), type = 'arithmetic')

#### Analysis, ∆SPXL = ∆SP500 * 3 + (Slippage) ####
real = SPXL_return
ideal = SP500_return * 3
delta = real - ideal
delta = delta * 100

#### Daily Slippage ####
par(ps = 10)
chartSeries(delta, minor.ticks=FALSE, type="l",
            theme = chartTheme("white", up.col="black"),
            name = 'SPXL Daily Slippage (SPXL - S&P500 * 3,%)', ylab='Residuals', xlab='Date',
            yrange = c(-2, 2)
            )
mean(delta)
mean(sqrt(delta ^ 2))
index(delta[delta > 0.5])

#### Daily slippage (monthly mean) ####
delta_monthly <- apply.monthly(delta,mean)
chartSeries(delta_monthly, minor.ticks=FALSE, type="l",
            theme = chartTheme("white", up.col="black"),
            name = 'SPXL Daily Slippage (Monthly mean) (%)', 
            ylab='slippage', xlab='Date',
            yrange = c(-0.15, 0.15)
            )

#### Annualized slippage (monthly) ####
merged_returns <- merge.xts(real, ideal)
colnames(merged_returns) <- c("real", "ideal")
delta_annualized <- apply.monthly(merged_returns, Return.annualized)*100
delta_annualized$Annualized_slippage <- delta_annualized$real - delta_annualized$ideal
chartSeries(delta_annualized$Annualized_slippage,
            minor.ticks=FALSE, type="l",
            theme = chartTheme("white", up.col="black"),
            name = 'SPXL Annualized slippage (monthly) (%)',
            ylab='slippage', xlab='Date',
            yrange = c(-100, 100)
            )
View(delta_annualized)
mean(delta_annualized$Annualized_slippage)
mean(delta_annualized$Annualized_slippage["2018-01-01::"])