【问题标题】:EWMA Volatility in R using data frames使用数据框的 R 中的 EWMA 波动性
【发布时间】:2014-07-10 13:49:05
【问题描述】:

我正在尝试从名为 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

【问题讨论】:

    标签: r loops dataframe volatility


    【解决方案1】:

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

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

    这使我们能够利用一些线性代数来完成矩阵乘法的工作。为简洁起见,我将为您的 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 倍。

    【讨论】:

    • 非常好的解决方案!确实快得多。你介意我把它翻译成葡萄牙语并发布在 Stack Overflow 葡萄牙语版本上吗?
    • @RiskTech 没问题。
    猜你喜欢
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2019-10-15
    相关资源
    最近更新 更多