βはいかにして時系列推移するのか?

市場リスクへの感応度を計算するために(ヒストリカル)ベータ(β)の推定とか投資理論でよくやるわけですが、ロバスト回帰とかしないでそのまま単純な線形回帰分析した場合、それの時系列推移ってどんなもんなんじゃい・・・ってのを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)