使用零长度xts对象

时间:2017-03-04 21:01:04

标签: r time-series xts

我对宽度为非零的零长度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(...)仍然不起作用,则需要额外的修复。

总结:

  1. 如何使用空的xts对象?
  2. 他们是否打算在没有观察的情况下对时间序列进行建模?
  3. 更新

    这是@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
    

    我们无法提前确切知道所返回的交易日期。不同的市场/交易所/证券实施不同的惯例,因此在查询之前确定交易日数至少是不切实际的。如果可能的话。

    更新:持久性

    还有一个更微妙的问题 以上,证券AB具有基于实际观察的持久表示。当上下文需要它时,例​​如在merge()中,添加NA以填补未对准间隙。 如上所述,根据CA的日期定义第三个安全B会产生一个弱定义,因为当您更改投资组合时,您也会更改定义这种安全性,但C始终是相同的安全性,数据源不返回任何数据 因此,恕我直言,C可以建模为NANULL,零长度xts等,但不能作为上下文敏感值。

2 个答案:

答案 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