如何在不按日期排序的情况下使用 R 重新采样 XTS 时间序列?

How can I resample a XTS timeseries with R without sorting by date?

我在 xts 对象中有一个损益表,我将要 运行 进行某种 Monte Carlo 分析,以便通过对原始 xts 时间序列进行多次重采样计算出最大回撤。

# let's say qq is a timeseries of PnL
qq <- xts(1:10, order.by = as.Date('2016-01-01')+0:9)
set.seed(0)
# I create an index vector of 5 random samples without replacing
idx <- sample(1:10, 5)
# with that seed, idx = c(9, 3, 10, 5, 6)
qq[idx] # returns
           [,1]
2016-01-03    3
2016-01-05    5
2016-01-06    6
2016-01-09    9
2016-01-10   10

问题是 xts 总是按日期对其元素进行排序,那么有没有办法让 xts 时间序列的子集包含未排序的元素?

           [,1]
2016-01-09    9
2016-01-03    3
2016-01-10   10
2016-01-05    5
2016-01-06    6

与其父项 class(动物园)一样,xts 对象必须始终有序。无法创建无序的 xts(或 zoo)对象。

在您的情况下,您不需要指数来计算回撤。所以你可以只使用对象的coredata。或者,如果您想将索引值保留为名称,则可以使用 as.matrix

R> (ss <- coredata(qq)[idx])
[1]  9  3 10  5  6
R> (ss <- as.matrix(qq)[idx,])
2016-01-09 2016-01-03 2016-01-10 2016-01-05 2016-01-06 
         9          3         10          5          6 

然后你可以计算最大回撤。

R> ss-cummax(ss)       # drawdown
2016-01-09 2016-01-03 2016-01-10 2016-01-05 2016-01-06 
         0         -6          0         -5         -4 
R> min(ss-cummax(ss))  # max drawdown
[1] -6