我正在寻找能够帮助我实现这一目标的功能或包。我查看了几个包但找不到我要找的东西:
假设我有一个包含10列和250行的xts对象。
我想要做的是运行一个模拟,这样我就可以在一段时间内对我的绩效指标进行可靠的计算。
所以,假设我有250个数据点,我想在数据的随机样本上运行x次模拟,使用函数(PerformanceAnalytics::SharpeRatio
)计算夏普比率,将随机样本变为长度30 -240,然后找到平均值。请记住,我想为每个列执行此操作,如果可能,我宁愿不必使用apply。我也想找到能够快速处理信息的东西。
哪种包装或功能最适合此目的?
谢谢!
答案 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中都应用了函数),这可能值得注意。