βはいかにして時系列推移するのか?
市場リスクへの感応度を計算するために(ヒストリカル)ベータ(β)の推定とか投資理論でよくやるわけですが、ロバスト回帰とかしないでそのまま単純な線形回帰分析した場合、それの時系列推移ってどんなもんなんじゃい・・・ってのをRでやってみた。
まずは2010年9月〜2011年9月までの、三菱UFJフィナンシャルグループと日経平均株価データを取得(via RFinanceYJ パッケージ)
library(RFinanceYJ) #download stock prices of nikkei-225 and MUFJ Financial group mufg <- quoteStockXtsData("8306.T", since="2010-09-30",date.end="2011-09-30")$Close nikkei <- quoteStockXtsData("998407.O", since="2010-09-30",date.end="2011-09-30")$Close
取得した株価データをリターン系列に倒す
#convert to return returns <- merge(mufg / lag(mufg) - 1, nikkei / lag(nikkei) - 1) names(returns) <- c("MUFG","NIKKEI")
各日に対して直近125日分のデータから三菱UFJFGのベータを推計
#estimate beta by rolling regression size.window <- 125 coefs <- rollapplyr(returns, size.window, function(x)coef(lm(x[,1]~x[,2])), by.column = FALSE)
はい、これでおしまい。R素晴らしい!R簡単!
ベータの推計値の時系列をプロットしてみると
plot(as.xts(coefs[, 2]))
結構・・・うごくねぇ・・・
〜がんばってアニメーションにしてみた〜
これを見てわかるように、一個のはずれ値があるかないかが重要ですね、はずれ値怖い回帰分析怖い。
このアニメーションを作るためのコードは↓。上で作ったデータ使ってるんでそっちも実行した後にやる。
またコードの実行にはanimationパッケージ、それからImageMagick(別途インストール)が必要。
x <- na.omit(coredata(returns)[ ,2]) y <- na.omit(coredata(returns)[ ,1]) x.max <- c(-max(abs(x)), max(abs(x))) y.max <- c(-max(abs(y)), max(abs(y))) x.lab <- names(returns)[2] y.lab <- names(returns)[1] Snap <- function(val){ val.x <- na.omit(coredata(val)[ ,2]) val.y <- na.omit(coredata(val)[ ,1]) lm.xy <- lm(val.y~val.x) plot(val.x, val.y, xlim = x.max, ylim = y.max, xlab = x.lab, ylab = y.lab) abline(lm.xy) text(x.max[1], y.max[2], paste("Beta :", round(coef(lm.xy)[2],3)), pos = 4) text(x.max[1], y.max[1], as.character(last(index(val))), pos = 4) } library(animation) saveGIF({ for(i in 1:(nrow(returns)-size.window)){ Snap(returns[(i:(i+size.window)),]) } },interval = 0.01)