【发布时间】:2020-11-29 09:57:23
【问题描述】:
我试图做一些体力劳动来计算我自己的滚动 beta 以获得一些股票日志回报,并遇到了这个特殊的问题。
为了真正重现这个问题,我粘贴了我的完整数据集(csv 文件)here。
此数据集有一个日期列,但在我进行计算时已将其排除。下面 sn-p 将创建与我实验过的相同的数据集。
library(readr)
library(dplyr)
library(data.table)
test <- read_csv(YOUR_PATH_TO_MY_DATASET) %>%
select(-date) %>%
as.data.table
然后我对典型的stats::cor 函数运行滚动应用。
library(zoo)
roll.cor <- rollapplyr(test,
width=50,
function(x) cor(x,
method="spearman"),
by.column=F)
我的输入列的长度是 1724(我们稍后会提到这个数字。)
现在有趣的地方来了。
我发现rollingapply 只填满了输入矩阵的长度(不包括obs 的第一个width 数字),至少在stats::cor(和corrr::correlate)的情况下。
我的意思是:在我的示例中,我的窗口大小为 50,因此第一个相关性计算将采用矩阵的前 50 个obs。例如test$A[1:50] 与 test$B[1:50] 等等。然后第二个计算将前滚一个ob 并变为test$A[2:51] 与test$B[2:51] 然后我们有test$A[3:52] 与test$B[3:52]、test$A[4:53] 与test$B[4:53] 等等。我们可以很容易地证明这一点:
# following results match up with the result we get from rollapply.
cor(testA$[1:50], test$B[1:50], method="spearman")
# 0.6520358
cor(testA$[2:51], test$B[2:51], method="spearman")
# 0.662828385
cor(testA$[3:52], test$B[3:52], method="spearman")
# 0.655938477
由于 stats::cor 函数返回的相关矩阵的行数与变量数一样多,因此每次运行 stats:cor 都会给我 5 行。 rollapply 在 stats:cor 的第 335 次运行时停止,仅仅是因为 335 * 5 = 1675 (1724 - 49 = 1675)。如果我们取出前 50 个obs(包括第一个ob),我们最终得到1675 个obs,而rollapply 决定在达到这个长度后停止。我们见证了这一点,
tail(roll.cor, n=5)
cor(test$A[335:384), test$B[335:384], method="spearman")
# 0.6806554
因此,rollapply 基本上停在了obs 的第 335 位,而 obs 的其余部分就被丢弃了(至少似乎是这样)。
尽管如此,我仍然希望这种滚动机制能够持续到我们达到最后 50 个obs,即test$A[1675:1724] 与test$B[1675:1724];这样我们就可以得到1675 * 5 = 8375 的行数(回想一下stats::cor 的每次运行都会给出5 行)。
这应该是rolling 在R 中的工作方式吗?或者这是以前没有发现的东西?
给定obs 的数量(本例中为 8375 行),如何获得“真正的”完整运行滚动相关性?
【问题讨论】:
标签: r dplyr correlation zoo rolling-computation