Имитация объекта XTS в R
Я ищу функцию или пакет, который поможет мне с этой целью. Я просмотрел несколько пакетов, но не могу найти то, что ищу:
Допустим, у меня есть объект XTS с 10 столбцами и 250 строк.
То, что я хочу сделать, это запустить симуляцию, чтобы я получил надежный расчет моей метрики производительности за период.
Итак, допустим, что у меня 250 точек данных, я хочу выполнить x количество симуляций для случайных выборок данных, вычисляющих коэффициент Шарпа с использованием функции (PerformanceAnalytics::SharpeRatio
) варьируем случайные выборки длиной 30-240, а затем находим среднее. Имейте в виду, что я хочу сделать это для каждого столбца, и я бы предпочел не использовать apply, если это возможно. Я также хотел бы найти что-то, что обрабатывает информацию довольно быстро.
Какой пакет или функции лучше всего подходят для этой цели?
Спасибо!
1 ответ
Подменю xts
Объекты для строк, которые вы хотите выбрать случайным образом, должны быть достаточно хорошими с точки зрения производительности, если это ваша главная задача. Если вам нужны другие конкретные примеры, вам может быть полезно взглянуть на функции моделирования Монте-Карло, недавно добавленные в R blotter
пакет:
https://github.com/braverock/blotter/blob/master/R/mcsim.R
Ваши требования довольно подробны и немного сложны для подражания, но я думаю, что этот пример может быть тем, что вы ищете?
Это решение использует функции применения, хотя! Потому что это просто облегчает жизнь. Если вы не используете 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), это, возможно, стоит отметить.