【问题标题】:Rolling Standard Deviation in a Matrix in RR中矩阵中的滚动标准偏差
【发布时间】:2014-06-05 17:03:34
【问题描述】:

下面是股票每日收益矩阵示例 (ret_matriz)

      IBOV        PETR4        VALE5        ITUB4        BBDC4        PETR3    
[1,] -0.040630825 -0.027795652 -0.052643733 -0.053488685 -0.048455772 -0.061668282
[2,] -0.030463489 -0.031010237 -0.047439725 -0.040229625 -0.030552275 -0.010409016
[3,] -0.022668170 -0.027012078 -0.022668170 -0.050372843 -0.080732363  0.005218051
[4,] -0.057468428 -0.074922051 -0.068414670 -0.044130126 -0.069032911 -0.057468428
[5,]  0.011897277 -0.004705891  0.035489885 -0.005934736 -0.006024115 -0.055017693
[6,]  0.020190656  0.038339130  0.009715552  0.014771317  0.023881732  0.011714308
[7,] -0.007047191  0.004529286  0.004135085  0.017442303 -0.005917177 -0.007047191
[8,] -0.022650593 -0.029481336 -0.019445057 -0.017442303 -0.011940440 -0.046076458
[9,]  0.033137223  0.035274722  0.038519205  0.060452104  0.017857617  0.046076458

例如,考虑一个 5 天的移动窗口,因此我想要一个新的矩阵,如下所述:

     IBOV        PETR4    ...       
[1,] 0           0        ...
[2,] 0           0        ... 
[3,] 0           0        ...
[4,] 0           0        ...
[5,] sd[1:5,1]  sd[1:5,2] ...
[6,] sd[2:6,1]  sd[2:6,2] ...
[7,] sd[3:7,1]  sd[3:7,2] ...
[8,] sd[4:8,1]  sd[4:8,2] ... 
[9,] sd[5:9,1]  sd[5:9,2] ...

使用 zoo 包我能够达到结果,但它有点慢,关于如何提高速度以达到相同结果的任何想法?

动物园代码如下:

require(zoo)

apply(ret_matriz, 2, function(x) rollapply(x, width = 5, FUN = sd, fill = 0, align = 'r')) 

【问题讨论】:

  • 不用apply,我觉得rollapply(df, width=5, FUN=sd, fill=0, align="r")如果by.column = TRUE就够用了(默认值)
  • 您的数据有多大?
  • 143 个变量的 4062 次观察

标签: r matrix zoo standard-deviation rollapply


【解决方案1】:

1) apply 部分可以去掉。为简洁起见,我们还使用rollapplyr

rollapplyr(ret_matriz, 5, sd, fill = 0)

2) 而且rollmeanrollapply 快,所以我们可以使用公式sd = sqrt(n/(n-1) * (mean(x^2) - mean(x)^2)) 来构造它:

sqrt((5/4) * (rollmeanr(ret_matriz^2, 5, fill = 0) - 
              rollmeanr(ret_matriz, 5, fill = 0)^2))

【讨论】:

    【解决方案2】:

    您可以改用TTR::runSD

    library(quantmod)
    getSymbols("SPY")
    spy <- apply(ROC(SPY), 2, runSD, n=5)
    # head(spy)
    #         SPY.Open    SPY.High     SPY.Low   SPY.Close SPY.Volume SPY.Adjusted
    # [1,]          NA          NA          NA          NA         NA           NA
    # [2,]          NA          NA          NA          NA         NA           NA
    # [3,]          NA          NA          NA          NA         NA           NA
    # [4,]          NA          NA          NA          NA         NA           NA
    # [5,]          NA          NA          NA          NA         NA           NA
    # [6,] 0.004369094 0.003112967 0.001064232 0.005035266  0.1577499  0.005063025
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2017-10-18
      • 2022-11-27
      • 2021-05-22
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多