模拟R中的xts对象

时间:2017-12-13 01:15:34

标签: r random simulation xts bootstrapping

我正在寻找能够帮助我实现这一目标的功能或包。我查看了几个包但找不到我要找的东西:

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

我想要做的是运行一个模拟,这样我就可以在一段时间内对我的绩效指标进行可靠的计算。

所以,假设我有250个数据点,我想在数据的随机样本上运行x次模拟,使用函数(PerformanceAnalytics::SharpeRatio)计算夏普比率,将随机样本变为长度30 -240,然后找到平均值。请记住,我想为每个列执行此操作,如果可能,我宁愿不必使用apply。我也想找到能够快速处理信息的东西。

哪种包装或功能最适合此目的?

谢谢!

1 个答案:

答案 0 :(得分:2)

为您想要随机抽样的行设置xts个对象应该足够好,性能明智,如果这是您主要考虑的问题。如果您想要一些其他具体示例,您可能会发现查看最近添加到R blotter包中的蒙特卡罗模拟函数很有用:
https://github.com/braverock/blotter/blob/master/R/mcsim.R

你的要求非常详细,有点难以理解,但我认为这个例子可能就是你所追求的?

此解决方案确实使用了apply函数!因为它只会让生活更轻松。如果您不使用lapply,代码将迅速扩展并分散注意力,从而快速实现目标(并且您可能会冒更长,更脏的代码引入错误;在可能的情况下使用应用系列函数的一个原因)。

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中都应用了函数),这可能值得注意。