gpt4 book ai didi

r - 使用数据帧的 R 中的 EWMA 波动性

转载 作者:行者123 更新时间:2023-12-01 04:19:52 25 4
gpt4 key购买 nike

我试图从名为 base_retorno_diario 的数据框的一系列股票每日返回中获得 EWMA 波动率。

  Data        IBOV         ABEV3       AEDU3 ALLL3   BBAS3        BBDC3        BBDC4
1 2000-01-04 -0.063756245 0.00000000 0 0 -0.029935852 -0.080866107 -0.071453347
2 2000-01-05 0.024865308 -0.03762663 0 0 -0.008082292 0.043269231 0.060889055
3 2000-01-06 -0.008510238 -0.03157895 0 0 0.014074074 0.014285714 0.008098592
4 2000-01-07 0.012557359 -0.02484472 0 0 -0.022644266 0.017719219 0.000000000
5 2000-01-10 0.043716564 0.00000000 0 0 0.050074738 0.005357143 0.006985679
6 2000-01-11 -0.026401514 -0.02388535 0 0 -0.008540925 -0.059058615 -0.046479362

新数据框的第一行( n_rown_col 是返回数据框的行数和列数 base_retorno_diario )
EWMA_VARIANCE = as.data.frame( base_retorno_diario[1,2:n_col]^2 )

然后我创建了以下循环
i = 2
while(i<=n_row){
EWMA_VARIANCE = rbind(EWMA_VARIANCE,
EWMA_VARIANCE[(i-1), 1:(n_col-1)] * DECAY_FACTOR +
(1-DECAY_FACTOR) * base_retorno_diario[i,2:n_col]^2
)
i=i+1
}

它工作正常,但花费的时间太长(原始数据框有 3560 个 obs 的 101 个变量),在这种情况下是否有办法避免循环? DECAY_FACTOR = 0.97

最佳答案

您可以使用一些矩阵代数来避免此循环。让我们假设原始数据是一个向量 (a_1, a_2, a_3, ..., a_n)我们想要创建 EWMA 方差 (x_1, x_2, x_3, ..., x_n)根据你的定义。让 d是衰减因子。如果我正确理解你的代码,你目前有一个递归定义

recursive definition

这让事情变得困难。我相信这个非递归定义是相同的

non-recursive definition

这允许我们利用一些线性代数来完成矩阵乘法的工作。为简洁起见,我将为您的 data.frame 和衰减因子分配较短的变量名称

dd <- base_retorno_diario
d <- DECAY_FACTOR

现在我们首先计算所有平方值,然后取我们可以看到的成对差异,这是非递归定义的一部分。
asquare <- as.matrix(dd[,2:7])^2
asqdiffs <-sapply(data.frame(asq), diff)

现在我们创建一个合适的矩阵,其值为 d取非递归定义的求和部分,然后执行减法(初始项有一点偏移)
dx <- outer(1:nrow(asqdiffs), 1:nrow(asqdiffs), FUN=function(x,y) 
ifelse(x>=y, d^(x-y+1),0 )
)
EWMA_VARIANCE <- asq - rbind(0, dx %*% asqdiffs)

这种方法似乎产生与您相同的结果,但在我的测试中它大约快 20 倍。

关于r - 使用数据帧的 R 中的 EWMA 波动性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23791321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com