在建模定量交易模型时,我经常遇到如何处理NA值的相同问题。以下示例是关于自1997-01-01以来EOD数据的库存存储在xts对象中,其中有四列名为“High”,“Low”,“Close”,“Volume”。数据来自彭博社。当我想计算滚动20天的卷时,会出现错误消息:
SMA(stock$Volume, 20)
Error in runSum(x, n) : Series contains non-leading NAs
我很快找到了问题(我知道这是NA值,因为我已经尝试了1000次)并且发现了缺少体积数据的两天。我在下面复制了那些日子的数据。作为一个快速观察,TTR中的SMA
,EMA
等函数如果前面有数字并且后跟数字,则无法处理NAs。
stock <- as.xts(matrix(c(94.46,92.377,94.204,NA,71.501,70.457,70.979,NA), 2, 4,
byrow = TRUE, dimnames = list(NULL, c("High","Low","Close","Volume"))),
as.Date(c("1998-07-07", "1999-02-22")))
处理此问题的最佳方法是什么?是否将stock$Volume
存储为NA值被移除的临时对象,然后计算滚动体积并将其与merge.xts
合并,同时添加fill = NA
以便再次插入NA值?但是,这是正确的,因为你采取过去20个交易日而不仅仅是在20天窗口中可用的19个交易日?
我希望某种“最佳实践”可以成为这篇文章的结果,因为我认为这个问题也适用于其他财务上的R用户,无论他们是从彭博,雅虎财经还是其他来源获取数据。
我不知道“最佳实践”,但一种替代方案可能是所谓的“非均匀时间序列算子”,如Operators on Inhomogeneous Time Series所示。
这类问题非常适合Quantitative Finance堆栈交换站点(例如参见How to update an exponential moving average with missing values?)。
拿你的初始时间序列包含NA,例如a.ts
通过使用na.approx
来近似NA,用一个通用函数替换每个NA用插值(动物园包文档中的更多细节)
b.ts=na.approx(a.ts)
b.ts
是时候
试试na.omit
。
我有同样的问题,这为我解决了。