【发布时间】:2017-07-24 21:22:19
【问题描述】:
我对长度为零且宽度不为零的 xts 对象感到困惑,为了方便起见,这里将其称为 empty xts 对象。
我认为它们是对没有观察到的证券进行建模的好方法,例如退市证券。
x=xts(matrix(numeric(0), dimnames=list(NULL, "Delist1")), as.Date(numeric(0)))
x
# Delist1
但是,当涉及合并空证券时,它们就会消失:
y=xts(1:3, as.Date(1:3))
names(y)="List1"
merge(x,y)
# List1
# 1970-01-02 1
# 1970-01-03 2
# 1970-01-04 3
当您有多个时间序列时,这尤其不方便,其中一些可能是空的:
z=xts(matrix(numeric(0), dimnames=list(NULL, "Delist2")), as.Date(numeric(0)))
L=list(x,y,z) # etc.
Reduce(merge, L)
# List1
# 1970-01-02 1
# 1970-01-03 2
# 1970-01-04 3
您丢失了有关空时间序列的信息,而您希望每个空序列都有一整列的 NA。
也许简单的经验法则就是不要使用空的 xts 对象并使用 NA:
x=c(Delist1=NA)
z=c(Delist2=NA)
L=list(x,y,z) # etc.
X=Reduce(merge.xts, L)
setNames(X, sapply(L, names))
# Delist1 List1 Delist2
# 1970-01-02 NA 1 NA
# 1970-01-03 NA 2 NA
# 1970-01-04 NA 3 NA
但是,前两个系列不能是 NA:
L=list(x,z,y) # etc.
Reduce(merge.xts, L)
# Error use:
do.call(merge.xts, L)
无论如何,如果L 的所有元素都是空的,do.call(...) 仍然不起作用,需要额外的修复。
总结:
- 应该如何使用空的 xts 对象?
- 他们是否打算在没有观察的情况下对时间序列进行建模?
更新
这是对@userR 提出的解决方案的长评论
在我虚构的时间窗口as.Date(1:3) 中,创建/定义一个空的时间序列并为每个日期定义一个 NA 会很简单,这可能适用于理论案例。
在现实世界的场景中,当您在给定的时间窗口内查询数据时,您永远不会填满所有的日子。
为了澄清,假设您查询证券 A 和 B 在 2000-02-01/2000-02-04 期间的数据。
基于 NA 的空系列应该是这样的:
(delist=xts(rep(NA,4), as.Date("2000-02-01")+0:3))
# [,1]
# 2000-02-01 NA
# 2000-02-02 NA
# 2000-02-03 NA
# 2000-02-04 NA
提供者返回的实际数据可能是这样的:
A
# [,1]
# 2000-02-01 1
# 2000-02-02 2
# 2000-02-03 3
B
# [,1]
# 2000-02-01 1
# 2000-02-02 NA
# 2000-02-03 3
假设没有 2000-02-04 日期,因为这不是交易日。
合并给出:
merge(A,B, delist)
# A B delist
# 2000-02-01 1 1 NA
# 2000-02-02 2 NA NA
# 2000-02-03 3 3 NA
# 2000-02-04 NA NA NA
显然[2,2]中的NA是一个实际的缺失值,最后一行NA是delist的定义人为推导出来的。
相反,单一 NA 方法不涉及这些问题:
delist=NA
merge(A,B, delist)
# A B delist
# 2000-02-01 1 1 NA
# 2000-02-02 2 NA NA
# 2000-02-03 3 3 NA
我们无法提前确切知道返回的交易日期。不同的市场/交易所/证券实施不同的约定,因此如果可能的话,在查询它们之前确定交易日至少是不切实际的。
更新:持久性
还有一个更微妙的问题。
以上,证券A 和B 具有基于实际观察的持久表示。当上下文需要它时,例如在merge() 中,会添加 NA 以填补错位间隙。
如上所述,根据A 和B 的日期定义第三个证券C 是一个弱定义,因为当您更改投资组合组合时,您也在更改此证券的定义,但@987654341 @ 始终与数据源未返回数据的安全性相同。
因此,恕我直言,C 可以建模为 NA、NULL、零长度 xts 等,但不能建模为 上下文敏感 值。
【问题讨论】:
-
我明白你的意思。我是否正确假设您的
delist系列中的 NA 数量 only 取决于从查询返回的最长系列中的行数?如果是这种情况,您是否可以不创建delist查询您的数据?这样,您就可以在能够将delist存储为xts对象的同时,不人为地添加不必要的NA。你可以这样做xts(matrix(rep(NA, length(y)), dimnames=list(NULL, "Delist1")), order.by = index(y)) -
如果我理解正确,请告诉我,我将编辑我的答案以适应。
-
@user:在合并范围内,您可以从非空系列中取任意日期。但是,我认为根据在其他对象中找到的值对对象(空时间序列)进行 定义 并不是一个好主意。您可能事先不知道将提供哪些日期,更重要的是,如果您添加或删除新证券,定义会中断。最好重新定义 merge() 以便接受空 xts 对象并在输出中生成 NA 列。
-
我理解你的顾虑,但我不认为有问题,因为
delist总是有东西要合并,否则单独分析delist有什么意义呢?您始终可以根据最长的系列以编程方式定义delist。这样您就不必知道最长的系列有多长,程序知道。合并后,delist列不再依赖于初始定义,因此删除任何现有系列不会破坏任何内容。我虽然同意重新定义merge()以接受空 xts 是一个更好的主意,但到目前为止我想不出解决方案。 -
"empty" xts 对象在您定义它们时在代码中没有明确定义,因此目前不受支持。有“零宽度”xts 对象,它们是具有索引但没有数据的 xts 对象。您的“空”对象没有索引,但有没有数据的“列”。我称之为“零长度”。我还打开了an issue 来记录和讨论这种细微的差异。
标签: r time-series xts