在 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 函数),这可能值得注意。
我正在寻找可以帮助我实现此目标的功能或程序包。我浏览了几个包,但找不到我要找的东西:
假设我有一个包含 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 函数),这可能值得注意。