问题描述
我需要根据日常观察每两个月计算一次回报自相关。我无法弄清楚如何每两个月对股票的每日价格历史进行子集。我的数据集有多只股票,不同股票的历史不同。
下面是一只股票的示例
data = data.frame(date = c("2000-01-27","2000-01-28","2000-01-29","2000-01-30","2000-02-27","2000-02-28","2000-03-27","2000-03-28","2000-03-29","2000-03-30","2000-04-27","2000-04-28","2000-04-29","2000-04-30","2000-05-27","2000-05-28","2000-05-29","2000-05-30"),return = sample(-3:15,18,replace = T))
在上面的 MWE 中,结果应该包括 3 个自相关系数:第一个使用第 1 个月和第 2 个月的观察值,第二个使用第 3 个月和第 4 个月的观察值,第三个使用第 5 个月的观察值。当然,对于某些股票月数可能被 2 整除。自相关低于
autocorr = function(x,k){ # x is the return vector,k is the autocorrelation order (assumed 1)
x = x - mean(x)
n = length(x)
var = x %*% x / (n-1)
gamk = x[1:(n-k)] %*% x[(k+1):n] / (n-k-1)
rho = gamk/var
return(rho[1,1])
}
解决方法
使用 cut 将日期划分为 2 个月段,然后使用 tapply 将 autocorr 应用于每个段的返回。
with(data,tapply(return,cut(as.Date(date),"2 months"),autocorr,1))