Имитация объекта 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), это, возможно, стоит отметить.

Другие вопросы по тегам