Вот соответствующий код из виньетки, слегка измененный, чтобы он поместился на странице здесь и чтобы его было легко воспроизвести. Код для визуализаций опущен. Комментарии от автора виньетки.
(Полная виньетка: https://cran.r-project.org/web/packages/pbo/vignettes/pbo.html)
library(pbo)
#First, we assemble the trials into an NxT matrix where each column
#represents a trial and each trial has the same length T. This example
#is random data so the backtest should be overfit.`
set.seed(765)
n <- 100
t <- 2400
m <- data.frame(matrix(rnorm(n*t),nrow=t,ncol=n,
dimnames=list(1:t,1:n)), check.names=FALSE)
sr_base <- 0
mu_base <- sr_base/(252.0)
sigma_base <- 1.00/(252.0)**0.5
for ( i in 1:n ) {
m[,i] = m[,i] * sigma_base / sd(m[,i]) # re-scale
m[,i] = m[,i] + mu_base - mean(m[,i]) # re-center
}
#We can use any performance evaluation function that can work with the
#reassembled sub-matrices during the cross validation iterations.
#Following the original paper we can use the Sharpe ratio as
sharpe <- function(x,rf=0.03/252) {
sr <- apply(x,2,function(col) {
er = col - rf
return(mean(er)/sd(er))
})
return(sr)
}
#Now that we have the trials matrix we can pass it to the pbo function
#for analysis.
my_pbo <- pbo(m,s=8,f=sharpe,threshold=0)
summary(my_pbo)
Вот та часть, которая меня интересует:
sr_base <- 0
mu_base <- sr_base/(252.0)
sigma_base <- 1.00/(252.0)**0.5
for ( i in 1:n ) {
m[,i] = m[,i] * sigma_base / sd(m[,i]) # re-scale
m[,i] = m[,i] + mu_base - mean(m[,i]) # re-center
}
Почему данные преобразуются в цикле for, и нужно ли такое масштабирование и повторное центрирование выполнять с реальной отдачей? Или это просто то, что автор делает, чтобы его смоделированные возвращения больше походили на настоящие?
Поиск в Google и поиск через stackoverflow выявил несколько статей и сообщений о масштабировании волатильности до квадратного корня из времени, но это не совсем похоже на то, что я видел. Обычно они включают умножение некоторой краткосрочной (т.е. ежедневной) меры волатильности на корень времени, но это не совсем так. Кроме того, документация для пакета не включает этот фрагмент кода повторного масштабирования и повторного центрирования. Документация: https://cran.r-project.org/web/packages/pbo/pbo.pdf
So:
Почему данные преобразуются таким образом/что является результатом этого преобразования?
Нужно ли это только для этих смоделированных данных, или мне нужно
аналогичным образом преобразовывать реальные доходы?