我对宽度为非零的零长度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
您丢失了有关空时间序列的信息,而您希望每个空系列都有一整列NAs。
也许拇指的简单规则就是不使用空的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(...)
仍然不起作用,则需要额外的修复。
总结:
这是@userR
提出的解决方案的长篇评论在我的虚构时间窗口as.Date(1:3)
中,为每个日期创建/定义一个带有NA的空时间序列会很简单,这可能适用于理论情况。
在实际场景中,当您沿给定时间窗口查询数据时,您永远不会填满所有日期。
澄清一下,比如你在2000-02-01 / 2000-02-04期间查询证券A和B的数据 基于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是实际缺失值,最后一行NAs是由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以填补未对准间隙。
如上所述,根据C
和A
的日期定义第三个安全B
会产生一个弱定义,因为当您更改投资组合时,您也会更改定义这种安全性,但C
始终是相同的安全性,数据源不返回任何数据
因此,恕我直言,C
可以建模为NA
,NULL
,零长度xts等,但不能作为上下文敏感值。
答案 0 :(得分:2)
1。应该如何使用空的xts对象?
2。它们是否打算在没有观察的情况下对时间序列进行建模?
回答两者:
空xts对象通常是在xts对象中超出值范围的时间范围内进行子集化的结果。您期望getSymbols("AAPL"); AAPL["1900"]
返回什么?
什么时候空的xts对象有用呢?好吧,如果我想填充NA数据行,我会创建一个带有一组日期的空xts
对象(没有实际数据),以后可能会用于其他目的。例如,如果我们在不均匀的时间戳上有bid/ask
个值,我们可能想要创建5个第二个OHLC条,条形码时间戳的整齐开始(实际上,如果要合并不同频率的条形数据,请务必注意,一定要使用条形码时间戳的结尾,以避免意外引入前瞻性偏见)。空的xts对象有助于实现目标:
# Create sample tick data:
set.seed(5)
st_time <- as.POSIXct('2007-01-02 09:00:00')
x <- xts(x= matrix(c(1:10, 1:10 +0.01),nc = 2) + rnorm(10, 0, 0.01),
order.by = st_time + rnorm(10,0, 3) + seq(5, 25, length.out = 10),
dimnames = list(NULL, c("bid","ask")))
x
# bid ask
# 2007-01-02 09:00:04.816884 2.0138436 2.023844
# 2007-01-02 09:00:06.203266 2.9874451 2.997445
# 2007-01-02 09:00:08.682891 0.9915914 1.001591
# 2007-01-02 09:00:10.673608 5.0171144 5.027114
# 2007-01-02 09:00:11.194063 4.0007014 4.010701
# 2007-01-02 09:00:14.003655 7.9936463 8.003646
# 2007-01-02 09:00:15.694152 5.9939709 6.003971
# 2007-01-02 09:00:16.541393 6.9952783 7.005278
# 2007-01-02 09:00:23.500229 8.9971423 9.007142
# 2007-01-02 09:00:24.221933 10.0013811 10.011381
to.period(x, period = "secs", k = 5, indexAt='startof')
# x.Open x.High x.Low x.Close
# 2007-01-02 09:00:04.816884 2.013844 2.013844 2.0138436 2.0138436
# 2007-01-02 09:00:06.203266 2.987445 2.987445 0.9915914 0.9915914
# 2007-01-02 09:00:10.673608 5.017114 7.993646 4.0007014 7.9936463
# 2007-01-02 09:00:15.694152 5.993971 6.995278 5.9939709 6.9952783
# 2007-01-02 09:00:23.500229 8.997142 10.001381 8.9971423 10.0013811
# 5 sec bar Timestamps are messy, so let's fix them using an empty xts object
# Use of an empty xts object:
emp_5sec_interval <- xts(order.by = st_time + seq(5, 25, by = 5),)
x2 <- merge(x, emp_5sec_interval, fill = na.locf)
x2
# bid ask
# 2007-01-02 09:00:04.816884 2.0138436 2.023844
# 2007-01-02 09:00:05.000000 2.0138436 2.023844
# 2007-01-02 09:00:06.203266 2.9874451 2.997445
# 2007-01-02 09:00:08.682891 0.9915914 1.001591
# 2007-01-02 09:00:10.000000 0.9915914 1.001591
# 2007-01-02 09:00:10.673608 5.0171144 5.027114
# 2007-01-02 09:00:11.194063 4.0007014 4.010701
# 2007-01-02 09:00:14.003655 7.9936463 8.003646
# 2007-01-02 09:00:15.000000 7.9936463 8.003646
# 2007-01-02 09:00:15.694152 5.9939709 6.003971
# 2007-01-02 09:00:16.541393 6.9952783 7.005278
# 2007-01-02 09:00:20.000000 6.9952783 7.005278
# 2007-01-02 09:00:23.500229 8.9971423 9.007142
# 2007-01-02 09:00:24.221933 10.0013811 10.011381
# 2007-01-02 09:00:25.000000 10.0013811 10.011381
x_ohlc <- to.period(x2, period = "secs", k = 5, indexAt='startof')
x_ohlc
# x2.Open x2.High x2.Low x2.Close
# 2007-01-02 09:00:04.816884 2.0138436 2.013844 2.0138436 2.0138436
# 2007-01-02 09:00:05.000000 2.0138436 2.987445 0.9915914 0.9915914
# 2007-01-02 09:00:10.000000 0.9915914 7.993646 0.9915914 7.9936463
# 2007-01-02 09:00:15.000000 7.9936463 7.993646 5.9939709 6.9952783
# 2007-01-02 09:00:20.000000 6.9952783 10.001381 6.9952783 10.0013811
# 2007-01-02 09:00:25.000000 10.0013811 10.001381 10.0013811 10.0013811
如果您想对已退市的证券进行建模,则创建一个具有有效日期的xts对象,并使用NA填充相应的列(实际上可能超过一列,如OHLC,买/卖)。例如使用像(正如useR已经暗示的那样)的东西合并已退市的证券
y=xts(rep(NA, 3), as.Date(1:3))
我不会使用您建议的delist=NA
方法。
最终,xts作者是关于空xts对象的设计权限......
答案 1 :(得分:0)
我认为这里的问题是如何定义“空时间序列”。你定义“空系列”的方式是它有零行。您的第一次合并会忽略merge()
,因为它不知道如何使用零长度系列。 xts
排除了您的空系列,因为没有公共列可以通过合并。实际上,您的已删除系列应该有3行,每行有NAs。这样,您可以将它们与具有相同行数的library(xts)
x=xts(matrix(rep(NA, 3), dimnames=list(NULL, "Delist1")), as.Date(1:3))
y=xts(1:3, as.Date(1:3))
names(y)="List1"
z = merge(x,y)
# > z
# Delist1 List1
# 1970-01-02 NA 1
# 1970-01-03 NA 2
# 1970-01-04 NA 3
class(z)
# > class(z)
# [1] "xts" "zoo"
个对象进行比较。
url: http://site url/_api/web/GetFileByServerRelativeUrl('/Folder Name/file name')/$value
method: GET
headers:
Authorization: "Bearer " + accessToken