在R中生成股票价格对数正态分布及计算CRRA期望效用的技术问询
正确生成对数正态分布并计算CRRA投资者期望效用
首先得指出你踩了一个常见的坑:R中rlnorm()的参数不是原始分布的期望和标准差,而是对数转换后的变量的均值(meanlog)和标准差(sdlog)。你直接把股票的期望收益率r传给meanlog,这就导致生成的分布不符合预期。
第一步:正确推导对数正态分布的参数
假设你关注的是股票的期末价格相对于期初价格的比值(记为R = P_T/P_0),这个比值服从对数正态分布,即ln(R) ~ N(μ, σ²)。其中:
- 你从CAPM得到的
σ就是ln(R)的标准差(也就是rlnorm()需要的sdlog),这个是对的; - 但
r是R的期望收益率,即E[R] = 1 + r,而不是ln(R)的均值μ。
根据对数正态分布的性质,E[R] = exp(μ + σ²/2),我们可以反推出μ:
sigma <- 0.01825838 r <- 0.13053162 meanlog <- log(1 + r) - (sigma^2)/2
代入你的数值计算:log(1.13053162) ≈ 0.1225,sigma²/2 ≈ 0.000166,所以meanlog ≈ 0.122334。
现在用这个参数生成分布:
# 生成1000个R的样本(P_T/P_0) dist_r <- rlnorm(1000, meanlog = meanlog, sdlog = sigma)
你可以验证一下:
mean(dist_r)应该接近1.1305(也就是1+r);sd(log(dist_r))应该接近0.01825838。
第二步:计算CRRA投资者的期望效用
常相对风险厌恶(CRRA)的效用函数形式为:
$$
U(W) =
\begin{cases}
\frac{W^{1-\gamma}}{1-\gamma} & \text{当 } \gamma \neq 1 \
\ln(W) & \text{当 } \gamma = 1
\end{cases}
$$
其中γ是风险厌恶系数,W是期末财富。
假设投资者初始财富为W0,全仓投资该股票,那么期末财富W = W0 * dist_r。我们可以写一个简单的函数来计算效用,再求均值得到期望效用:
# 定义CRRA效用函数 crra_utility <- function(wealth, gamma) { if (gamma == 1) { return(log(wealth)) } else { return(wealth^(1 - gamma) / (1 - gamma)) } } # 设定参数:初始财富、风险厌恶系数 W0 <- 1000 # 示例初始财富 gamma <- 2 # 示例风险厌恶系数 # 计算期末财富 W <- W0 * dist_r # 计算期望效用 expected_utility <- mean(crra_utility(W, gamma)) cat("投资者的期望效用值:", round(expected_utility, 4), "\n")
小提示
- 模拟样本量可以适当增大(比如
1e5),这样期望效用的估计会更稳定; - 如果你的目标是直接生成期末股票价格
P_T,只需用P0 * dist_r即可(P0为期初价格),CRRA效用的计算逻辑完全一致。
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

