我想生成一系列回报x,使得回报的标准差为0.03,乘积为1 + x = 1.总结一下,回报有两个条件:
1)sd(x) == 0.03
2)prod(1+x) == 1
这可能吗?如果可以,我该如何在R?
中实现它?谢谢。
答案 0 :(得分:5)
稍微复杂一点的方法是使用对数正态分布的知识:来自?dlnorm
,Var = exp(2 * mu + sigma ^ 2)*(exp(sigma ^ 2) - 1)。我们希望几何平均值等于1,因此对数刻度上的平均值应为0.我们有Var = exp(sigma^2)*(exp(sigma^2)-1)
,无法明显地解析这个问题,但我们可以使用uniroot
:
找到正确的对数差异:
vfun <- function(s2,v=0.03^2) { exp(s2)*(exp(s2)-1)-v }
s2 <- uniroot(vfun,interval=c(1e-6,100))$root
生成值:
set.seed(1001)
x <- rnorm(1000,mean=0,sd=sqrt(s2))
x <- exp(x-mean(x))-1 ## makes sum(x) exactly zero
prod(1+x) ## exactly 1
sd(x)
这会产生标准差不完全等于0.03但接近的值。如果我们想要,我们也可以解决这个问题......
答案 1 :(得分:3)
一种非常简单的方法是简单地模拟返回,直到您拥有满足要求的集合。但是,您需要指定对要求的容差(请参阅here原因)。
nn <- 10
epsilon <- 1e-3
while ( TRUE ) {
xx <- rnorm(nn,0,0.03)
if ( abs(sd(xx)-0.03)<epsilon & abs(prod(1+xx)-1)<epsilon ) break
}
xx
产量
[1] 0.007862226 -0.011437600 -0.038740969 0.028614022 0.006986953
[6] -0.004131429 0.030846398 -0.037977057 0.046448318 -0.025294236