簡體   English   中英

將 R 中的 NA 替換為當前的 rollapply 值

[英]Replace NA's in R with the current rollapply value

我有一個來自特斯拉回報的 10 年數據集(2 天差異百分比)

tsla <- quantmod::getSymbols("TSLA", from = base::as.Date("2011-01-01"), to = base::as.Date("2022-01-31"), auto.assign = F)
tsla = as_tibble(tsla)
head(tsla)

我還有一個感興趣的 function:


alpha = 0.01
garnor = function(x){
  require(fGarch)
  t = length(x)
  fit = garchFit(~garch(1,1),data=x,trace=F,cond.dist="norm")
  m = fit@fitted
  cv = fit@sigma.t
  var = m+cv*qnorm(1-alpha)
  return(var[t])
}

現在我想以一種棘手的方式回溯測試 function:回顧期將是前 252 個交易日。然后每個月(即 21 天)我想評估風險。這意味着 21 天風險將保持不變。但是 rollapply function 輸出 NA。我想用以前的值替換 NA,然后 plot y 值(y 列)和后向值(一個圖中的后列)。

d = tsla%>%
  dplyr::select(TSLA.Adjusted)%>%
  dplyr::mutate(Close = TSLA.Adjusted)%>%
  dplyr::mutate(y = as.numeric((Close - dplyr::lag(Close, 2)) / Close))%>%
  dplyr::select(Close,y)%>%
  tidyr::drop_na()%>%
  dplyr::mutate(back = zoo::rollapplyr(y,width = 252,FUN = garnor,by = 21,fill=NA))

例如 output 看起來像這樣:

252  5.54 -0.0307    0.0927
253  5.42 -0.0354   NA     
254  5.38 -0.0297   NA     
255  5.45  0.00477  NA     
256  5.52  0.0257   NA     
257  5.65  0.0347   NA     
258  5.65  0.0223   NA     
259  4.56 -0.239    NA     
260  5.32 -0.0620   NA     
261  5.36  0.150    NA     
262  5.35  0.00598  NA     
263  5.32 -0.00789  NA     
264  5.35  0.000374 NA     
265  5.48  0.0299   NA     
266  5.59  0.0429   NA     
267  5.79  0.0525   NA     
268  5.87  0.0464   NA     
269  5.91  0.0213   NA     
270  5.81 -0.00894  NA     
271  5.92  0.000338 NA     
272  6.05  0.0390   NA     
273  6.23  0.0504    0.104 
274  6.36  0.0487   NA     
275  6.32  0.0142   NA     
276  6.39  0.00407  NA     
277  6.52  0.0301   NA     
278  6.22 -0.0267   NA     
279  6.30 -0.0346   NA     
280  6.63  0.0624   NA     
281  6.72  0.0628   NA     
282  6.84  0.0295   NA     
283  6.99  0.0392   NA     
284  6.9   0.00928  NA     
285  6.84 -0.0219   NA     
286  6.91  0.000869 NA     
287  6.75 -0.0139   NA     
288  6.72 -0.0271   NA     
289  6.76  0.00177  NA     
290  6.68 -0.00629  NA     
291  6.88  0.0174   NA     
292  6.81  0.0185   NA     
293  6.75 -0.0190   NA     
294  6.62 -0.0281    0.0950
295  6.62 -0.0196   NA     
296  6.61 -0.00121  NA     
297  6.95  0.0466   NA     
298  7.20  0.0816   NA     
299  7.22  0.0374   NA     
300  7.06 -0.0204   NA  

理想情況下,我希望(例如)重復值 0.0927,直到出現下一個值 0.104。而后者以相同的方式(模式)重復。我該如何進行替換?

然后 plot 他們在一起?

使用代表最后一次出現結轉的 na.locf0。 下面我們簡化了代碼。 如果您想要單獨的面板,請省略 facet = NULL。 下面的代碼不使用 dplyr,因此如果您沒有加載 dplyr,您可以只寫 lag 代替 stats::lag。 (dplyr 用它自己的不兼容版本破壞了 R 的滯后。)

library(quantmod)
library(fGarch)
library(ggplot2)

garnor <- function(x, alpha = 0.01) {
  t <- length(x)
  fit <- garchFit(~ garch(1,1), data = x, trace = FALSE, cond.dist = "norm")
  m <- fit@fitted
  cv <- fit@sigma.t
  var <- m+cv*qnorm(1-alpha)
  var[t]
}

getSymbols("TSLA", from = "2011-01-01", to = "2022-01-31")
adj <- Ad(TSLA)
y <- na.omit(1 - stats::lag(adj, 2) / adj)
back <- na.locf0(rollapplyr(y, 252, by = 21, garnor))
names(back) <- "Back"
autoplot(cbind(y, back), facets = NULL)

截屏

暫無
暫無

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

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