r - 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")
解决方案
我推荐你跑步者包。有一个根据小插图中的日期滚动回归的示例。您的示例可以通过以下方式解决:
# 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)
推荐阅读
- spring-boot - Spring Boot - 跨域请求被阻止(原因:CORS 标头“Access-Control-Allow-Origin”缺失)
- php - 如何在桌子上有粘性的头饰
- flutter - 如何在颤动中动态设置文本部分的样式?
- java - 如何使用正则表达式从字符串中提取参数和值
- django - 如何使用 HTML 属性只读而不是禁用使 Django 表单字段只读
- php - 单击添加到购物车后重定向到同一页面
- c++ - 重现 cppreference 的 as-if 规则中显示的示例代码
- reactjs - 未定义属性的问题(无法读取未定义的属性“查找”)
- html - 我的导航栏在手机中垂直堆叠。我希望它在一行中是水平的
- deep-learning - 使用带有自定义损失函数的 tensorboard.plugins.hparams api 进行超参数调整