簡體   English   中英

使用數據幀的R中的EWMA波動率

[英]EWMA Volatility in R using data frames

我試圖從名為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上的行數和列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個101個變量),在這種情況下是否還有避免循環? DECAY_FACTOR = 0.97

你可以用一些矩陣代數來避免這個循環。 假設原始數據是向量(a_1, a_2, a_3, ..., a_n) ,我們希望根據您的定義創建EWMA方差(x_1, x_2, x_3, ..., x_n) d是衰減因子。 如果我正確理解您的代碼,您目前有一個遞歸定義

遞歸定義

這讓事情變得困難。 我相信這種非遞歸定義是相同的

非遞歸定義

這使我們可以利用一些線性代數來完成矩陣乘法的工作。 為簡潔起見,我將為您的data.frame和decay factor分配較短的變量名稱

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倍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM