首页 > 解决方案 > 使用 R 的具有高频数据的多协方差矩阵

问题描述

我正在处理包含 200 万个观测值的高频数据。现在,我需要计算每日的已实现协方差矩阵,定义为:

在此处输入图像描述

在此处输入图像描述为盘中在此处输入图像描述价格向量和在此处输入图像描述盘中价格的数量

我的数据具有以下结构:

Year Month Day FivMin   A   B   C   D
2000   1    1    1      1   2   3   4
2000   1    1    2      2   3   0   1
2000   1    1    3      3   4   1   2
2000   1    1    4      0   1   2   3
2000   1    2    1      1   2   3   4
2000   1    2    2      5   3   4   1
2000   1    2    3      3   0   1   2
2000   1    2    4      4   1   9   3
2000   1    3    1      1   2   3   4
2000   1    3    2      0   1   7   1
2000   1    3    3      3   4   1   2
2000   1    3    4      1   -2   2   3
2000   1    4    1      0   2   3   4
2000   1    4    2      2   1   4   1
2000   1    4    3      3   0   1   2
2000   1    4    4      0   2   2   3
2000   1    5    1      1   2   3   4
2000   1    5    2      2   3   4   1
2000   1    5    3      0   -1   1   2
2000   1    5    4      9   1   2   3

变量 A、B、C 和 D 代表每五分钟记录一次的价格。所以我的第一个想法是使用group_by变量年、月和日来创建在此处输入图像描述矩阵。在此之后,我需要计算每天的 Realized Cov。

例如,第一天我实现的 Cov 将是:

在此处输入图像描述

这个操作必须每天重复。我不知道是否有针对此问题的软件包。也许,最好使用循环。

谢谢你帮助我。

标签: rarraysbigdata

解决方案


这是使用split(用于分组)+ tcrossprod(用于 cov 矩阵)的基本 R 解决方案

res <- lapply(split(df,df[c("Year","Month","Day")]), 
              function(x) tcrossprod(t(x[c("A","B","C","D")])))

这样

> res
$`2000.1.1`
   A  B  C  D
A 14 20  6 12
B 20 30 12 22
C  6 12 14 20
D 12 22 20 30

$`2000.1.2`
   A  B   C  D
A 51 21  62 27
B 21 14  27 14
C 62 27 107 45
D 27 14  45 30

$`2000.1.3`
   A  B  C  D
A 11 12  8 13
B 12 25 13 11
C  8 13 63 27
D 13 11 27 30

$`2000.1.4`
   A  B  C  D
A 13  2 11  8
B  2  9 14 15
C 11 14 30 24
D  8 15 24 30

$`2000.1.5`
   A  B  C  D
A 86 17 29 33
B 17 15 19 12
C 29 19 30 24
D 33 12 24 30

数据

df <- structure(list(Year = c(2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 2000L, 
2000L, 2000L, 2000L, 2000L, 2000L), Month = c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
), Day = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 5L, 5L, 5L, 5L), FivMin = c(1L, 2L, 3L, 4L, 1L, 2L, 
3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), A = c(1L, 
2L, 3L, 0L, 1L, 5L, 3L, 4L, 1L, 0L, 3L, 1L, 0L, 2L, 3L, 0L, 1L, 
2L, 0L, 9L), B = c(2L, 3L, 4L, 1L, 2L, 3L, 0L, 1L, 2L, 1L, 4L, 
-2L, 2L, 1L, 0L, 2L, 2L, 3L, -1L, 1L), C = c(3L, 0L, 1L, 2L, 
3L, 4L, 1L, 9L, 3L, 7L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L
), D = c(4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 
1L, 2L, 3L, 4L, 1L, 2L, 3L)), class = "data.frame", row.names = c(NA, 
-20L))

推荐阅读