我经常遇到在定量交易模型建模时如何处理NA值的问题。以下示例是关于自1997-01-01以来EOD数据存储在xts对象中的库存,其中有四列名为" High"," Low"" Close&#34 ;,"卷&#34 ;.数据来自彭博社。当我想计算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个?
我希望某种&#34;最佳实践&#34;可能是这篇文章的结果,因为我认为这个问题也适用于其他财务上的R用户,无论他们是从彭博,雅虎财经还是其他来源获取数据。
答案 0 :(得分:1)
我不知道“最佳做法”,但有一种替代方案可能是所谓的“非均匀时间序列算子”,如Operators on Inhomogeneous Time Series所示。
此类问题非常适合Quantitative Finance堆栈交换网站(例如,请参阅How to update an exponential moving average with missing values?)。
答案 1 :(得分:0)
获取包含NA的初始时间序列,例如a.ts
通过使用na.approx
通用函数来近似NAs,用插值替换每个NA(动物园包文档中的更多细节)
b.ts=na.approx(a.ts)
b.ts
是时间
答案 2 :(得分:0)
尝试na.omit
。
我遇到了同样的问题,这为我解决了这个问题。