R 中的 Log-Return 模拟不会导致预期结果
Log-Return simulation in R does not lead to expected result
我目前正在尝试在 R 中模拟 log-returns 并计算一项简单投资的预期损益。我的代码可以正常工作,但我无法理解为什么预期利润不等于:
(exp(annual_mean * (holding_period/253)) * investment) - investment
在我的示例中等于 5350。然而,运行下面的模拟总是导致利润在 5580 左右:
investment <- 1000000
holding_period <- 45
annual_mean <- 0.03
annual_sd <- 0.05
simulations <- 1000000
# Create Matrix for log-returns
Paths <- matrix(data = NA, nrow = holding_period, ncol = simulations);
# feed matrix with log-returns
for (k in 1:simulations)
{
Returns <- rnorm(holding_period, mean = annual_mean/253,
sd = annual_sd/sqrt(253));
Paths[, k] <- investment * exp(cumsum(Returns));
}
# calculate EPnL
EPnL <- mean(Paths[holding_period, ] - investment);
print(EPnL)
考虑到大量的模拟,我预计不会与预期利润有如此大的偏差。我也尝试了更多的模拟,但结果还是一样。
我试图通过这个模拟表明,模拟次数越多,实际值越接近预期值。
我希望你们理解我的问题。我知道这更像是一个与金融相关的话题,但我想我这边的代码有一些误解。
非常感谢!
我认为问题出在您对 cumsum
的使用上 - 您将 returns 视为利率相加而不是 multiply/compound。如果您稍微更改代码并改用 cumprod
,它似乎会给出正确的结果...
# feed matrix with log-returns
for (k in 1:simulations)
{
Returns <- rnorm(holding_period, mean = annual_mean/253, sd = annual_sd/sqrt(253))
Returns <- 1 + Returns
Paths[, k] <- investment * cumprod(Returns)
}
# calculate EPnL
EPnL <- mean(Paths[holding_period, ] - investment)
print(EPnL)
我终于找到了这个问题的答案。我完全忽略了一个事实,即我正在通过将正态分布 return 与初始投资相乘并不断复利来改变它。
虽然乘法使 return 服从正态分布,但指数函数变换随机变量,使其服从对数正态分布。因此,均值等于 exp(μ+σ^2/2),其中 μ 和 σ^2 等于相关正态分布的均值和标准差。
我目前正在尝试在 R 中模拟 log-returns 并计算一项简单投资的预期损益。我的代码可以正常工作,但我无法理解为什么预期利润不等于:
(exp(annual_mean * (holding_period/253)) * investment) - investment
在我的示例中等于 5350。然而,运行下面的模拟总是导致利润在 5580 左右:
investment <- 1000000
holding_period <- 45
annual_mean <- 0.03
annual_sd <- 0.05
simulations <- 1000000
# Create Matrix for log-returns
Paths <- matrix(data = NA, nrow = holding_period, ncol = simulations);
# feed matrix with log-returns
for (k in 1:simulations)
{
Returns <- rnorm(holding_period, mean = annual_mean/253,
sd = annual_sd/sqrt(253));
Paths[, k] <- investment * exp(cumsum(Returns));
}
# calculate EPnL
EPnL <- mean(Paths[holding_period, ] - investment);
print(EPnL)
考虑到大量的模拟,我预计不会与预期利润有如此大的偏差。我也尝试了更多的模拟,但结果还是一样。
我试图通过这个模拟表明,模拟次数越多,实际值越接近预期值。
我希望你们理解我的问题。我知道这更像是一个与金融相关的话题,但我想我这边的代码有一些误解。
非常感谢!
我认为问题出在您对 cumsum
的使用上 - 您将 returns 视为利率相加而不是 multiply/compound。如果您稍微更改代码并改用 cumprod
,它似乎会给出正确的结果...
# feed matrix with log-returns
for (k in 1:simulations)
{
Returns <- rnorm(holding_period, mean = annual_mean/253, sd = annual_sd/sqrt(253))
Returns <- 1 + Returns
Paths[, k] <- investment * cumprod(Returns)
}
# calculate EPnL
EPnL <- mean(Paths[holding_period, ] - investment)
print(EPnL)
我终于找到了这个问题的答案。我完全忽略了一个事实,即我正在通过将正态分布 return 与初始投资相乘并不断复利来改变它。 虽然乘法使 return 服从正态分布,但指数函数变换随机变量,使其服从对数正态分布。因此,均值等于 exp(μ+σ^2/2),其中 μ 和 σ^2 等于相关正态分布的均值和标准差。