2017-11-18 119 views
2

下面是来自小插曲的相关代码,稍微修改以使其适合页面,并使其易于再现。可视化代码被忽略。评论来自vignette作者。为什么模拟股票收益率在R中的pbo(回测过拟合概率)包中的“pbo”小插图中重新缩放并重新居中?

(全小插曲: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循环转化数据,并执行这种重新的缩放和重新定位需要用真实的回报来完成?或者,这只是作者为了让他的模拟回报更像真实的东西而做的事情?

谷歌搜索和搜索通过计算器翻转了一些文章和关于缩放到时间的平方根的波动,但这看起来不像我见过的。通常它们涉及将短期(即每日)波动性度量乘以时间的根源,但这不完全是这样。此外,该软件包的文档不包含这部分重新缩放和重新对中代码。文档:https://cran.r-project.org/web/packages/pbo/pbo.pdf

所以:

  • 为什么以这种方式改变了数据/这是什么 转型的结果呢?

  • 难道只需要这个模拟数据,还是我需要
    同样改变真实的回报?

回答

0

我张贴的R-帮助邮件列表上这个问题,并得到了如下回答:

“嗨,乔, 的定心和重新缩放为他的榜样的目的而作出,并 特别值得注意的是,夏普函数的rf(riskfree) 参数的默认值为.03/252,即年利率为3%,转换成日利率为 ,用十进制表示 这意味着这个函数的另一个参数x应该是DAILY 返回,以十进制表示。

假设他想从 的年收益分布中创建随机数据,均值为MU_A和ANNUAL STD偏差SIGMA_A,均以十进制表示。 等价的每日回报将意味着MU_D = MU_A/252和标准 偏差SIGMA_D = SIGMA_A/SQRT(252)。

他通过名称mu_base和SIGMA_D通过名称sigma_base调用MU_D。

他的循环现在转换其矩阵中的随机数,以便每列 具有平均MU_D和标准偏差SIGMA_D。

HTH, 埃里克“

我遵循了这样的:

”如果我理解正确的话,如果我想用从backtests而不是模拟的回报实际回报,我需要以确保我的风险调整回报率衡量标准,在这种情况下,夏普比率与我的回报(即每日回报率,每日回报率,每月月度回报率等)相匹配。而且我不需要像投资者模拟回报那样来转换回报,因为真实回报将具有他们拥有的任何属性(意味着他们将拥有他们碰巧拥有的任何平均值和标准值)。 “

我被告知这是正确的。

+0

我通过电子邮件发送软件包的作者,他确认这个解释是准确的 –