6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rを使って極値理論をファイナンスへ応用してみた(その2)

Last updated at Posted at 2018-04-26

その1はこちら(極値理論の簡単な解説、Block maximaの実装を行っています)
https://qiita.com/hrkz_szk/items/43debffda9697d9dd7a9

r-block maximaモデル

Block maximaでは最大値のみを抽出しましたが、問題となるのはサンプル数。特にファイナンス系のデータの場合、数十年単位で最大値を確保できないことが多いです。そこで、r-block maximaモデルとThresholdモデルがその対処法になります。r-block maximaは、上からr個の値を抽出します。例えば、2-block maximaモデルでは、最大値とその次に大きい値を抽出します。Thresholdモデルは次回紹介したいと思いますが、これらを統合したのが点過程というモデルです。

データ

ここでは、BMWの株価の損失について、2-block maximaモデルで推定していきたいと思います。具体的に、1年ごとの最大値とその次に大きい値を抽出し、ismevrlarg.fitを使ってGEV分布への推定を行います。
データに関しては、evirというパッケージにあるdata(bmw)を使用します。こちらは1973年1月2日から1996年7月23日におけるBMW社の株価のログリータンがvectorで入っています。

library(evir)
data("bmw")
head(bmw)

[1]  0.047704097  0.007127223  0.008883307 -0.012440569 -0.003569961  0.000000000
plot(bmw, t="l")

データの抽出

ログリータンをプラスの損失に変換し、さらにパーセント表示に変換。その後、一年間の最大値とその次に大きい値を抽出。

BmwLoss <- -1.0 * bmw * 100 
Years <- format(attr(BmwLoss, "time"), "%Y")
attr(BmwLoss, "years") <- Years
Yearu <- unique(Years)
idx <- 1:length(Yearu)
r <- 2
BmwOrder <- t(sapply(idx, function(x)
              head(sort(BmwLoss[attr(BmwLoss, "years") == Yearu[x]], decreasing = TRUE), r)))
rownames(BmwOrder) <- Yearu
colnames(BmwOrder) <- paste("r", 1:r, sep = "")

サンプルの分布

plot(Yearu, BmwOrder[, 1], col = "black", ylim = range(BmwOrder),
     ylab = "Losses BMW (percentages)", xlab = "",
     pch = 20, bg = "black")
points(Yearu, BmwOrder[, 2], col = "blue", pch = 20, bg = "blue")

推定

library(ismev)
BmwOrderFit <- rlarg.fit(BmwOrder)

$conv
[1] 0

$nllh
[1] 77.76214

$mle
[1] 4.4798274 1.7524702 0.3034724

$se
[1] 0.3411369 0.2891531 0.1587266

convのゼロは、うまく推定されたことを示しています。nllhはマイナスのログ尤度の最小値で、mleが尤度関数を用いて推定されたパラメータ、seはパラメータの標準誤差になります。$\xi$が0.3034724とプラスなので、今回の分布はFrechet分布に従うことが分かります。このため、この分布はヘビーテイルであり、損失が有限ではないということになります。

パラメータの検証

信頼区間

私の知る限りismevにはパラメータの信頼区間を自動的に計算してくれるコードを知らないので、ここでは原始的な方法で95%の信頼区間を求めてみます。

lower <- BmwOrderFit$mle - 1.96*BmwOrderFit$se
upper <- BmwOrderFit$mle + 1.96*BmwOrderFit$se
data.frame(lower=lower, upper=upper, row.names = c("mu", "sigma", "xi"))
lower upper
mu 3.811199061 5.1484558
sigma 1.185730115 2.3192103
xi -0.007631649 0.6145765

muとsigmaはゼロをまたいでいませんが、最も大切なxiがゼロの可能性が。しかし、ゼロをまたいでいると行ってもとても小さな幅なので、ここでは深追いはせずに…。

モデルの検証

rlarg.diag(BmwOrderFit)

Block maximaモデルの事例と同じように、Probability PlotとQuantilte Plotとともに右上の方がラインに沿っておらず、推定したモデルでは説明しきれていないことを示しています。しかし、再現レベルはサンプルデータが95%の内側に入っているので、この点は良いのかなと思います。

続編

その3はこちら。Thresholdモデルを使った分析を行っています。
https://qiita.com/hrkz_szk/items/8b01552e0e09583d4c35

参考文献





6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?