退屈な企業に大きく賭ける (2)

前回、退屈な企業に大きく賭ける (1)で、低ボラティリティの株式にレバレッジをかけて高ボラティリティの成長株よりも優れたSharpe Ratioを狙う戦略を紹介した。借金だけを用いたレバレッジはテールリスクに対して脆弱であって実際の適用に難がある。しかし我々にはまだ道具が残されている。Call Optionである。Call Optionが何であるかを説明すると流石に記事が長くなりすぎるので、ご存知ない方はまずテキストで勉強されたい。

多くのオプションのテキストは種々のプライシングモデルについて延々と説明しているか、または短期売買のための様々な合成ポジションを列挙している。しかしいずれも本日議論する単純なレバレッジ戦略には必要ない。ブラック・ショールズの式も必要ない。中長期のBuy & Hold前提でCall Optionをロングする投資家には、以下のテキストが良いと思う。MorningstarのFounder CEOであるJoe Mansuetoも推薦している。


The Intelligent Option Investor: Applying Value Investing to the World of Options

これ以降、定量的に評価して妥当なアプローチでなければ議論する価値がない。したがって実データに基づいて話をする。そのため、題材として実在の株式またはETF: 今回はS&P500指数に連動するETFである SPYを取り上げる。インデックスを取り上げる理由は次の二つである。

  • 多くの投資家にとってはインデックス・ファンドをホールドする方が、個別株を買うよりも理にかなっている
  • 将来のリターンの確率分布を得るにあたって、過去の価格時系列から単純な統計手法で推定した分布がある程度信頼できる
    • 後述する周辺化されたリターン確率分布を用いるアプローチ
    • 個別株には今回の方法は不適切である。SPY ETFにも本来は不適切であるが、個別株よりは問題が少ない

Call Optionへの長期投資を行うためには、今日から1年後までの累積リターンに関する確率分布を事前に知らなければいけない。この推定誤差をできるだけ減らすことが良いポジションの鍵である。それだけでそれなりの分析が必要なため、今回は年次リターンの確率分布を予測するところまで取り上げる。次回は、予測された年次リターン確率分布を元にCall Optionのストライク価格やポジション量を最適化する。

SPYを取り上げたのはあくまで分析のためであり、SPYへの投資を推奨するものではないことは免責事項で周知している通りである。Disclosure: 著者は2016年7月26日現在、ごくわずかな量のSPY Call optionをロングしている。

日次リターンの確率分布を推定する

母集団の選定

我々が議論するのは一年間ホールドしたときのパフォーマンスである。しかしその予測を行うための定量データとしては日次の株価を利用する。年次リターンのデータではなく、細かい日次リターンを利用するのは以下の理由による。

  • サンプル数の確保: 過去数十年とっても年次リターンのサンプル数は数十しかなく、分布推定に乗る誤差が大きい
  • 米国経済を長期で見たときの非定常性: 第二次世界大戦後からケネディ政権が出来上がるくらいまでの中間層が成長した時期、レーガン政権が新自由主義を推し進めた時期、近年の金融危機後でGDP成長が停滞した時期、といった時期によってアメリカ経済全体のマクロな成長率は異なっている。ケネディ政権のころの安定したリターンの分布を現代に適用するのは適切ではない

今回の分析では、2004年1月1日から2016年7月26日(昨日)までの価格時系列データを用いることとした。この期間であれば2008年の金融危機以前と、2008年以降のGDP成長率が低下した時期 – 元財務長官のLarry Summersによれば長期停滞が始まっている – と金融緩和による底上げとをどれもそれなりに含んでいる。

  • 個別企業の場合は株価は企業業績が決めるため、昨年と同じ業績が今年も続くと仮定するのが正しくないケースが多い
  • S&P500指数も本来は企業株価の集合体なので同様の制限がある。多くの企業がFree Cash Flowと株価の関係から見て過大評価されている時期においては、その後のリターンは市場全体にダウンワードバイアスがあると考えるべきである。よって本来はSPY ETFでも同一のリターン分布を用いるべきではない
    • しかしグリーンスパン議長の時代のように資産価格が膨れ上がった時期、リーマンショック直後の株価が過少評価された時期等を広く含むことによって、周辺化された確率分布は各種のケースをバランス良く含むものと仮定することになる

今回は2004年からのデータを使って2016年後半から2017年前半にかけてのリターンを予測する。なお、非定常性の考慮(通常は期間を短くとった方が良い)とサンプル数の確保(期間を長く取った方が良い)との間のトレードオフを適化したい、というエンジニア的発想の諸氏は、以下のステップをコンピュータプログラムで実装すると良いだろう。

  • 期間 (s-H) から (s-1)までのサンプルを用いて推定した確率分布を用い、期間sでの予測尤度を計算する
  • 上記の予測尤度に関して s = H+1, H+2, … の間の平均が最大となるような窓幅Hを選択する
  • 長期の予測尤度を考えているので、sは年単位である

なぜ日次リターンか

具体的な推定の前に、今回のアプローチの根拠を明らかにしておく。日次リターンを利用する利点に関して、サンプル数以上の根拠は、日次リターンの周辺化された確率分布を精確に求めるだけで、年次リターンの確率分布もそれなりの精度で求まることである。

  • これはリターンそのものの自己相関が無視できるためであり、後述する
  • 「周辺化された確率分布」という用語はもったいぶっているように見えるが、要は時刻を無視した単一の確率分布ということ

用語を以下のように定義し、誤解のないように確率変数名もここで導入しておく。

  • 日次リターン: log(次の日の株価 / ある日の株価) : logは自然対数
    • 日付 t の株価をS_t, 日次リターンの確率変数を X_t = \log(S_{t+1}/S_t)と表記する
  • 年次リターン: (翌年の同じ日の株価 / ある日の株価) – 1
    • 日付 tから 日付(t+T)  (Tは翌年までの市場の営業日数)の年次リターンを Y_tとする
    • Y_t = \exp( \sum_{s=0}^{T-1} X_{t+s} ) - 1

日次と年次とで、対数を使うか普通の割合を使うか分けているのは、分析上の利便性からである。そして、データに由来する次の理由をもって、年次リターンの確率分布は日次リターンの周辺化された確率分布から推定できると主張する

  • 日次リターンの自己相関はほぼゼロである, i.e., \forall k>0~Corr(X_t, X_{t+k})\simeq 0
  • つまり、昨日が上がったからといって翌日上がりやすいか下がりやすいかという傾向に偏りは見られない。実際の2004年からのSPY日次リターンに関する自己相関係数をlag日数に対してプロットすると図1の通りであり、有意になることはあっても自己相関自体は小さい

SPY.acf1

図1. 2004年から2016年までのSPY日次リターンの自己相関

    • こちらも本当は少し議論があって、2008年の金融危機のような大暴落イベントの時だけは自己相関が正になっていることがドローダウンの分布から推定できるのだが、今回はこれは省く
    • 大暴落のメカニズムまで含めたモデル化について詳しく知りたい人はDidier Sornetteの以下を読むと良い


Why Stock Markets Crash: Critical Events in Complex Financial Systems

  • ゆえに、日付 t から (t+T)までの日次リターン時系列を生成する確率過程として、複雑な自己回帰モデル等ではなく単なる周辺確率分布からのi.i.d.なサンプリングを用いてよい

 

実際には上記の議論は大事な点を一つ落としている。それはボラティリティの自己相関である。日次リターンの自己相関はほぼゼロだが、日次リターンの絶対値の自己相関は図2に示す通り長く尾をひく。大きく上がった or 下がった日の翌日は、方向はわからないが同様に大きく動きやすいということである。他にも株価が下がった日の翌日はボラティリティが上がるという性質も広く知られている。

SPY.acf2

図2. 2004年から2016年までのSPY日次リターンの絶対値に関する自己相関

ボラティリティの自己相関を真面目に取り入れようとすると、GARCHやStochastic Volatility Model (SV)を基本とした自己回帰モデルが必要になる。しかし年単位の中長期投資においては、著者の見解ではGARCHを使う必要はない。これは以下の理由による。

  • GARCHは直近のリターンを状態としたマルコフ連鎖をモデル化したものである。このマルコフ連鎖はどの初期状態からスタートしても一年も経つと定常状態にかなり近くなる
  • 一年間のリターン予測精度という観点では、ダイナミクスを精密にモデル化・推定した上で遷移をシミュレートした場合と、周辺化された分布から単純にi.i.d.でサンプリングした場合とで、あまり違いがない
  • ダイナミクスを精密にモデル化した場合パラメータ数が増えるため、ベイジアンの適切な方法を用いない限りむしろ予測精度が悪化する

一般の投資家にとってはこれだけ理解すれば十分である。しかし何でも機械学習化したがるエンジニア諸氏のためにさらに補足を加えておこう。大多数の人はスキップして欲しい。

    • 自己相関を利用したボラティリティ予測モデルはGARCH familyだけではない
    • 例えば機械学習で知られる非線形回帰モデルを使ったアプローチも研究されている。過去のリターンを説明変数にして、未来のリターンの絶対値、またはリターンの確率分布そのものを条件付き密度推定するわけである
    • しかしこれら非線形の自己回帰モデルは長期予測に用いた場合バイアスが乗ることが指摘されており、このバイアスを減らさない限りおそらくは単純なi.i.d.サンプリングよりも精度が悪い
    • 長期リターンをダイレクトに回帰する方法と、シミュレーションによる自己回帰モデルの連鎖との中間のアプローチもある。代表的なのはMixed-Data Sampling と呼ばれる回帰テクニックである
    • 残るファクターとして考慮の必要があるのはボラティリティの長期記憶性: 一年経ってもしつこく残り続ける弱い自己相関である。これは今回の分析では切り捨ててしまうが、興味がある人は以下のテキストで学ぶと良いだろう。


長期記憶過程の統計―自己相似な時系列の理論と方法

日次リターンから年次リターンをシミュレート

日次リターンの確率分布P(X)が得られたとする。この分布からモンテカルロ法を用いてリターンサンプルを生成することにより、年次リターンの分布の近似値を簡単に求めることができる。

  • i = 1,2,\ldots,nまで以下を繰り返す。nは10,000くらい取ればよい
    • P(X)からT個のサンプル X_{i1}, X_{i2}, ..., X_{iT} を生成する
    • Y_i = \exp(\sum_{t=1}^T X_{it}) - 1 とする
    • サンプル  (Y_i)_{i=1}^n に対してカーネル密度推定法を用いてノンパラメトリックに年次リターンの分布を推定する

n = 10,000程度ではモンテカルロ法のランダムノイズに由来する誤差が特にテールの推定においてそれなりに残る。しかし元々のP(X)ですら近似値をデータから求めているにすぎないのでこのnを莫大にする利便性は低い。大量の計算機資源を持ちかつリスク評価に特に敏感な諸氏に関しては、例えば以下のようにして不確実性も上乗せして定量化すると良いだろう。これによりテールリスクは少し上乗せされた形で推定される

  • Y_iの生成に用いる確率分布は共通のP(X)ではなく、iに依存した確率分布P_i(X)とする
  • P_i(X)の推定には、オリジナルの日次リターンデータ全体の代わりに65〜80%のランダムサンプリングした標本を用いる

日次リターンは裾野の重たい分布を使って推定せよ

自己相関は無視しても良いと割り切ったが、何でもナイーブなモデルで済ませられるほど世の中は甘くない。年次リターンをシミュレーションによって求める場合、その元となる周辺化された日次リターンの確率分布はできる限り精密に推定する必要がある。日次リターンには確率が低い大暴落と多くの頻度を占める緩やかな上昇が含まれるため、その確率分布は重たい裾野と負の歪度が伴う。分散が有限かどうかはマンデルブローがLévy alpha-stable distributionを導入して以来、議論が続いたがRama Contが包括的にstylized factsをまとめているように、有限分散であることを仮定して良いことがわかってきた。裾野は正規分布よりは重たいものの、どこかで切れているということである。Contの研究含めた包括的なサーベイが欲しい人には下記を読むことをお勧めする。


ウォール街の物理学者

裾野が重たく左右非対称であり、日次リターンのモデル化に向く確率分布にNormal Inverse Gaussian (NIG) distributionがある。パターン認識の機械学習タスクばかりやって正規分布または指数分布族に毒された人々には馴染みがうすいが、金融計量経済学ではよく使われるスタンダードなツールである。今回はこのNIG distributionをRを使って適合する。大変有り難いことに、Rにはghyp という NIGの適合を簡単にやってくれるパッケージがある。なお自力でアルゴリズムを実装したいエンジニアはこちらの論文に示されたEMアルゴリズムを実装すると良い。著者はJavaで実装した自己のオリジナルパッケージを広範なシミュレーションを含むより複雑なモデリングに使っている。

価格時系列が変数priceSeqに入っているとすると、たとえば以下のRコードで実際に適合された確率密度関数を描画することができる。

library(ghyp)
retSeq = diff(log(priceSeq))
dist = fit.NIGuv(retSeq, save.data=FALSE, silent=TRUE)
print(summary(dist))
daily_mean &nbsp <- mean(dist)
daily_q0005 <- qghyp(0.005, dist)
daily_q0995 <- qghyp(0.995, dist)
daily_q0001 <- qghyp(0.001, dist)
daily_q0999 <- qghyp(0.999, dist)
curve(dghyp(x/100, dist), col=&amp;amp;quot;black&amp;amp;quot;,
  main=sprintf(&amp;amp;quot;%s: Daily-Return Distribution\nfrom 2004 to 2016&amp;amp;quot;, ticker),
  ylab = &amp;amp;quot;probability density&amp;amp;quot;,
  xlab = &amp;amp;quot;log(Price of day (t+1) / Price of day t) [%]&amp;amp;quot;,
  xlim = c(100*daily_q0001, 100*daily_q0999),
  cex.main = 2.5, cex.lab = 1.5, cex.axis = 1.5
)

dghyp(daily_mean, dist) * 2/3
abline(v = 100*daily_mean, col=&amp;amp;quot;blue&amp;amp;quot;)
abline(v = 100*daily_q0005, col=&amp;amp;quot;blue&amp;amp;quot;, lty=2)
abline(v = 100*daily_q0995, col=&amp;amp;quot;blue&amp;amp;quot;, lty=2)
genlabel <- function(name, value){   sprintf(&amp;amp;quot;%s\n%s%1.1f%s&amp;amp;quot;, name, ifelse(value&amp;amp;gt;0, &amp;amp;quot;+&amp;amp;quot;, &amp;amp;quot;&amp;amp;quot;), 100*value, &amp;amp;quot;%&amp;amp;quot;)
}
bh <- dghyp(daily_mean, dist)
text(100*daily_mean, bh*2/3, genlabel(&amp;amp;quot;mean&amp;amp;quot;, daily_mean), col=&amp;amp;quot;blue&amp;amp;quot;, cex=1.5)
text(100*daily_q0005, bh/3, genlabel(&amp;amp;quot;0.5%-tile&amp;amp;quot;, daily_q0005), col=&amp;amp;quot;blue&amp;amp;quot;, cex=1.5)
text(100*daily_q0995, bh/3, genlabel(&amp;amp;quot;99.5%-tile&amp;amp;quot;, daily_q0995), col=&amp;amp;quot;blue&amp;amp;quot;, cex=1.5)

 

実際に得られるグラフは図3のようになる。ダウンサイドである0.5%-tileの方がアップサイドである99.5%-tileよりも大きい。

SPY.daily

図3. 適合された日次リターンの確率密度関数

シミュレートされた年次リターン

さて日次リターンの確率分布が求まれば後は乱数を利用して年次リターンをシミュレートするだけである。カーネル密度推定法を使ったおおよその確率密度関数を描画する方法は次のとおりである。大真面目にやる場合はカーネル幅をサンプル領域に応じてadaptiveにすることでより滑らかで的確な関数が得られるが、大まかに全体を知ることが目的なのでここではそこまでやらない。

次回説明するSPY Call Optionの満期で1年に近いのが2017年6月30日満期のため、Tは2016年7月26日から2017年6月16日 (11か月程度)で出力する。

library(ghyp)
y = numeric(n)
for(j in c(1:n)){ y[j] = sum(rghyp(T, dist)) }
annual_stock_mean &amp;amp;lt;- mean(exp(y)-1)
annual_stock_q0005 &amp;amp;lt;- quantile(exp(y)-1, probs=c(0.005))
annual_stock_q0995 &amp;amp;lt;- quantile(exp(y)-1, probs=c(0.995))
kde_stock &amp;amp;lt;- density(100 * (exp(y)-1))
bh &amp;amp;lt;- max(kde_stock$y)
plot(kde_stock, col=&amp;amp;quot;black&amp;amp;quot;,
  main=sprintf(&amp;amp;quot;%s: Return Dist. until %s\nfor Common Stock Only&amp;amp;quot;, ticker, bestAttr$Expire),
  ylab = &amp;amp;quot;probability density&amp;amp;quot;,
  xlab = &amp;amp;quot;Annual Return [%]&amp;amp;quot;,
  cex.main = 2.5,
  cex.lab = 1.5,
  cex.axis = 1.5
)

abline(v = 100*annual_stock_q0005, col=&amp;amp;quot;blue&amp;amp;quot;, lty=2)
abline(v = 100*annual_stock_q0995, col=&amp;amp;quot;blue&amp;amp;quot;, lty=2)
text(100*annual_stock_mean, bh*2/3, genlabel(&amp;amp;quot;mean&amp;amp;quot;, annual_stock_mean), col=&amp;amp;quot;blue&amp;amp;quot;, cex=1.5)
text(100*annual_stock_q0005, bh/3, genlabel(&amp;amp;quot;0.5%-tile&amp;amp;quot;, annual_stock_q0005), col=&amp;amp;quot;blue&amp;amp;quot;, cex=1.5)
text(100*annual_stock_q0995, bh/3, genlabel(&amp;amp;quot;99.5%-tile&amp;amp;quot;, annual_stock_q0995), col=&amp;amp;quot;blue&amp;amp;quot;, cex=1.5)

こうして得られる年次リターンの予測分布は図4のとおり。対数で見た時とは違い、右側に裾野が広がっている。期待値は+9%で、歴史的なS&P500リターンよりも高く出ているが、これは近年の金融緩和の影響と、NIG分布の推定誤差の影響とが混じっている。ブートストラッピング or ベイジアンで更に精度を上げるのは読者個人にお任せする。

SPY.annual.stock

図4. シミュレートされたSPY年次リターン分布の確率密度関数

さて、図4が普通にETFを買うだけのポジションなのに対して、作成方法まだ非公開の図5は現金+Call Optionsで同様にロングした時のリターン分布だ。現金+CallはETF Onlyに比べて、期待値が高く、右の裾野がより伸びている(大儲けする可能性がより高い)。しかしダウンサイドを見た場合でも0.5%-tileは普通にETFを買う場合よりマシになっている。0.5%-tileよりさらにダウンする可能性もETFだとあるが、現金+Call Optionsの場合はここで裾野が完全に切れており、最悪ケースはETFよりもずっと良い

SPY.annual.call

図5. 現金とCall Optionsのポートフォリオに関するシミュレートされた年次リターン分布

期待値が普通株よりも高く、ベストケースが普通株よりもよくて、ワーストケースも普通株より良い。言葉だけ聞くとこんなに美味しい話はなさそうに聴こえるがいかがであろうか。もちろんこれはフリーランチではない。現金+Callポジションはまぁまぁ儲かる可能性はETF Onlyよりも低いのである。加えて、良い分布特性が得られるかどうかはオプション市場で良いCall Optionが安値で売られているかどうかにも左右される。しかしそのような機会はそこまで稀ではないことも分かっている。

次回は同じSPYに対するロングポジションでも、どのようにして図5のようなリターン特性を合成可能なのかを説明する。

広告

投稿者: rikija

機械学習・認知科学・投資アルゴリズムの研究者。作曲家 (アマチュアですが鋭意努力中) Twitter: @rikija / https://twitter.com/rikija 論文実績等は https://sites.google.com/site/rikiyatakahashi/ を参照

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中