首页 > 解决方案 > 36 个月的滚动回归,至少有 24 次观察

问题描述

例如,假设数据从 1999 年 1 月开始,然后在 1999 年 1 月到 2001 年 12 月的 36 个月窗口上运行第一次回归,要求只有在至少 24 个月的数据可用时才会出现输出。否则,该股票应跳过该特定回归。下一次滚动回归将从 1999 年 2 月开始,到 2002 年 1 月结束(注意最少观察次数),依此类推,直到 2020 年 3 月。由于是每月滚动回归,因此将从 12 月开始每月报告回归输出2001 年至 2020 年 3 月。需要运行的所需回归方程:

E(ri)= α +β1(rmt) + β2(rmt-1) + ut

E(ri) = 证券的预期超额回报 α = 截距,β1= 超额市场回报系数,β2= 滞后超额市场回报系数,rm t = 时间 t 的市场超额回报,rm t-1 = 超额回报时间 t-1 的市场,ut = 误差项

以下代码已运行,但它不查看访问多只股票并且不检查条件

在 R Studio 上使用它

library(ggplot2)
library(tseries)

spy <- get.hist.quote(instrument="SPY", start="2003-01-01",
                      end=Sys.Date(), quote="AdjClose",
                      provider="yahoo", origin="1970-01-01",
                      compression="d", retclass="zoo")
ief <- get.hist.quote(instrument="IEF", start="2003-01-01",
                      end=Sys.Date(), quote="AdjClose",
                      provider="yahoo", origin="1970-01-01",
                      compression="d", retclass="zoo")
z <- merge.zoo(spy,ief)

rollingbeta <- rollapply(z.logrtn,
                         width=262,
                         FUN = function(Z)
                         {
                           t = lm(formula=SPY~IEF, data = as.data.frame(Z), na.rm=T);
                           return(t$coef)
                         },
                         by.column=FALSE, align="right")

在此处输入图像描述

标签: rregressionzoorolling-computation

解决方案


我推荐你跑步者包。有一个根据小插图中的日期滚动回归的示例。您的示例可以通过以下方式解决:

# work with df
df <- as.data.frame(z)
df$date <- as.Date(rownames(df))

# calculate rolling coefficients 
library(runner)
df$intercept <- runner(
  df,
  idx = "date",
  k = "36 months",
  f = function(x) {
    if (nrow(x) < 24) return(NA)
    t <- lm(Adjusted.spy ~ Adjusted.ief, x)
    t$coef[1]
  }  
)


df$slope <- runner(
  df,
  idx = "date",
  k = "36 months",
  f = function(x) {
    if (nrow(x) < 24) return(NA)
    t <- lm(Adjusted.spy ~ Adjusted.ief, x)
    t$coef[2]
  }  
)


plot(y = df$slope, x = df$date)

在此处输入图像描述


推荐阅读