在 R 中模拟 xts 对象

Simulate over an xts object in R

我正在寻找可以帮助我实现此目标的功能或程序包。我浏览了几个包,但找不到我要找的东西:

假设我有一个包含 10 列和 250 行的 xts 对象。

我想做的是 运行 模拟,这样我就可以对这段时间的绩效指标进行稳健的计算。

所以,假设我有 250 个数据点,我想 运行 x 使用函数 (PerformanceAnalytics::SharpeRatio) 改变数据的随机样本计算夏普比率的模拟次数随机样本长度为30-240,然后求平均值。请记住,我想对每一列都这样做,如果可能的话,我宁愿不必使用 apply。我也想找一些能比较快地处理信息的东西。

什么包或功能最适合这个目的?

谢谢!

子集 xts 您想要随机采样的行的对象应该足够好,性能明智,如果这是您的主要关注点。如果您想要一些其他具体示例,您可能会发现查看最近添加到 R blotter 包中的 monte carlo 模拟函数很有用:
https://github.com/braverock/blotter/blob/master/R/mcsim.R

您的要求非常详细且难以遵循,但我认为这个示例可能就是您所追求的?

虽然这个解决方案确实使用了应用函数!因为它只会让生活更轻松。如果您不使用 lapply,代码将快速扩展并分散快速实现目标的注意力(并且您冒着引入 bug 的风险,代码更长、更混乱;尽可能使用 apply family 函数的原因之一)。

library(quantmod)
library(PerformanceAnalytics)


# Set up the data:

syms <- c("GOOG", "FB", "TSLA", "SNAP", "MU")
getSymbols(syms)


z <- do.call(merge, lapply(syms, function(s) {
  x <- get(s)
  dailyReturn(Cl(x))
}))


# Here we have 250 rows, 5 columns:
z <- tail(z, 250)
colnames(z) <-  paste0(syms, ".rets")

subSample <- function(x, n.sub = 40) {
  # Assuming subsampling by row, preserving all returns and cross symbol dependence structure at a given timestamp
  ii <- sample(1:NROW(x), size = n.sub, replace = FALSE)
  # sort in order to preserve time ordering?
  ii <- sort(ii)
  xs <- x[ii, ]
  xs
}

set.seed(5)
# test:
z2 <- subSample(z, n.sub = 40)
zShrp <- SharpeRatio(z2)[1, ]


# now run simulation: 

nSteps <- seq(30, 240, by = 30)

sharpeSimulation <- function(x, n.sub) {
  x <- subSample(x, n.sub)
  SharpeRatio(x)[1, ]
}

res <- lapply(nSteps, FUN = sharpeSimulation, x = z)
res <- do.call(rbind, res)

resMean <- colMeans(res)
resMean
# GOOG.rets     FB.rets   TSLA.rets   SNAP.rets     MU.rets 
# 0.085353854 0.059577882 0.009783841 0.026328660 0.080846592

你知道 SharpeRatio 使用 sapply 吗?您可能还会使用其他性能指标。因为你似乎有反对 apply 的东西(可能是 R 中的所有 apply 函数),这可能值得注意。