2017-10-17 96 views
1

我有計算EWMA波動對於給定的證券下述R函數:獲取XTS從基於矩陣運算一個R函數對象

EWMAvol = function(returns, lambda, rollwindow){ 
    EWMA.mat = matrix(NA, nrow = nrow(returns), ncol = ncol(returns)) 
    for (k in 1 : ncol(returns)){ 
    for (j in rollwindow : nrow(returns)){ 
     td = returns 
     data = as.matrix(td[(j - rollwindow + 1) : j, k]) 
     ewmaVar.mat = matrix() 
     ewmaVar.mat[1] = 0 
     for (i in 2 : rollwindow){ 
     ewmaVar.mat[i] = lambda * ewmaVar.mat[i-1]+ (1 - lambda) * data[i]^2 
     } 
     EWMA.mat[j, k] = sqrt(ewmaVar.mat[length(ewmaVar.mat)]) 
    } 
    } 
    return(EWMA.mat) 
} 

的數據,該函數依賴於爲:

> class(rets) 
[1] "xts" "zoo" 

它來自功能從PerformanceAnalytics包。

,我目前得到的輸出是:

> class(EWMAvol) 
[1] "matrix" 

是否有可能從我的代碼返回xtszoo對象/數據? 另外,我想保留列名稱。我怎樣才能做到這一點?

謝謝。

回答

1

Return.calculate函數返回xts,因此您可以使用index來將最終返回值轉換爲xts

我代你的函數的最後一行

return(EWMA.mat) 

與以下做:

EWMA.xts = xts::xts(EWMA.mat, order.by = zoo::index(returns)) 
colnames(EWMA.xts) = colnames(returns) # to preserve column names 
return(EWMA.xts) 
+0

謝謝+1。現在是一個小問題 - 我如何保留列名? – AK88

+1

很簡單!我會編輯我的答案 – lebelinoz

+0

太好了!由於您是Quant,因此在這裏關注您的活動。只是好奇,你完成了你的因子模型嗎? – AK88