随机控制与 Merton 组合:在连续时间下求最优消费-投资
Merton (1969) 用随机控制把「该投多少风险资产、该花多少」从拍脑袋变成闭式解。本文从财富 SDE 与 HJB 方程讲清最优股权敞口 w*=(μ−r)/(γσ²) 与最优消费率 κ* 的推导,用 3000 条蒙特卡洛路径对比最优/低配/过度杠杆三类投资者,并诚实点出 CRRA 不现实、参数恒定、忽略交易成本、以及「Merton 最大化的是效用而非财富中位数」四类致命局限(中阶)。
Merton (1969, 1971) 是连续时间金融的基石。它回答了一个看似朴素、实则极难的问题:一个理性投资者,在股票有风险、无风险利率存在、自己有消费欲望的前提下,应该把多少比例的财富投进风险资产、每年该花掉多少? 在 Merton 之前,这类问题只能靠直觉;Merton 用随机控制(Hamilton-Jacobi-Bellman 方程)把它变成了几行闭式公式。
本文先把模型搭起来,给出最优解的显式形式,再用真实蒙特卡洛模拟(不是画图凑数)对比三种投资政策,最后诚实拆解 Merton 假设里最危险的四处裂缝。
一、模型设定:财富是一个随机过程#
投资者持有一笔财富 ,可以分配:
- 比例 投入风险资产(期望收益 、波动 );
- 剩下 投入无风险资产(收益 );
- 同时以消费率 连续抽走财富用于消费。
财富的演化满足随机微分方程(SDE):
投资者的目标不是「钱越多越好」(那样会永远不消费、全仓梭哈),而是整个生命周期消费效用总和的期望最大:
其中 是主观时间偏好(越急功近利越大)、 是相对风险厌恶系数(CRRA)。这是问题的「目标函数」。
二、最优股权敞口 w*:只由三个量决定#
对 HJB 方程做一阶条件(此处省略偏导推导,只给结论),最优风险敞口有一个与市场状态无关的惊人简单闭式解:
直觉:股权敞口只取决于超额收益 、你的风险厌恶 、和波动平方 。市场再怎么涨跌,只要你相信 恒定,最优 就恒定。代入一组合理参数:
import numpy as np
r, mu, sig = 0.02, 0.10, 0.20 # 无风险 2%, 风险资产期望 10%, 波动 20%
gamma = 2.0 # 相对风险厌恶系数
rho = 0.05 # 主观贴现率
w_star = (mu - r) / (gamma * sig**2)
print(f"最优股权敞口 w* = {w_star:.4f}") # 1.0000 → 100% 投风险资产python的含义:在 、、 下,把全部财富投进股票才是最优。注意这里没有杠杆——若你把波动降到 15%,或风险厌恶降到 1.5, 会突破 100%,需要借钱加杠杆。

上图把 画成超额收益(横轴)与风险厌恶(纵轴)的函数。右下角 的虚线以上区域需要杠杆——这也是现实里机构用互换、期货放大权益暴露的理论依据。
三、最优消费率 κ*:现在花还是留给未来#
投资只是半道题,另一半是消费。无限视界下最优消费率同样有闭式:
def merton_consume(rho, r, gamma, mu, sig):
D = (mu - r)**2 / (2 * gamma * sig**2) # 风险溢价项
return (rho - (1 - gamma) * r - (1 - gamma) * D) / gamma
k_star = merton_consume(rho, r, gamma, mu, sig)
print(f"最优消费率 κ* = {k_star:.4f}") # 0.0550 → 每年花掉财富的 5.5%python意味着:你每年把 5.5% 的财富用于消费,剩下全部按 投进股票。消费和投资两个旋钮被同一个目标函数同时解出——这正是随机控制优于「先攒钱再决定怎么投」的割裂式思维的地方。
四、真实模拟:三种政策跑 30 年#
闭式解很美,但美不美要看它在随机世界里长什么样。我们用月度 Euler 离散化模拟 3000 条财富路径,对比三类投资者——三者消费率都取 Merton 最优 ,只改股权权重,从而孤立「配置政策」本身的效果:
def sim_wealth(w, kappa, W0=1.0, T_years=30, steps_per_yr=12, n_paths=3000, seed=20260719):
rng = np.random.default_rng(seed)
N = T_years * steps_per_yr
dt = 1.0 / steps_per_yr
Z = rng.standard_normal((n_paths, N))
W = np.empty((n_paths, N + 1)); W[:, 0] = W0
drift = (r + w * (mu - r) - kappa) * dt
diff = w * sig * np.sqrt(dt)
for i in range(N):
W[:, i + 1] = W[:, i] * np.exp(drift + diff * Z[:, i])
W[:, i + 1] -= kappa * W[:, i] * dt # 连续消费抽离
W[:, i + 1] = np.maximum(W[:, i + 1], 0.0)
return W
W_mert = sim_wealth(w_star, k_star) # Merton 最优 w*=100%
W_under = sim_wealth(0.40, k_star) # 低配 w=40%
W_over = sim_wealth(1.50, k_star) # 过度杠杆 w=150%python
三条中位数轨迹清晰分开:过度杠杆(w=150%)中位财富最高(2.32x),Merton 最优居中(0.73x),低配(w=40%)最低(0.18x)。这个顺序初看反直觉——为什么「最优」反而跑不赢过度杠杆?
五、风险厌恶如何切分「现在 vs 未来」#
把 单独拎出来扫一遍,能看到消费-投资的天平是怎么倾斜的:
g_vec = np.linspace(1.2, 8.0, 60)
w_vec = (mu - r) / (g_vec * sig**2)
k_vec = np.array([merton_consume(rho, r, g, mu, sig) for g in g_vec])python
- 小(风险厌恶低)→ 高(敢满仓甚至加杠杆),但 也高(更敢花);
- 大(风险厌恶高)→ 低(退缩到无风险), 也低(不敢花、拼命攒)。
一句话:越怕风险的人,既不敢投也不敢花——这解释了为什么保守投资者常常「钱没花出去、也没赚到」。
六、末期财富分布:股权暴露抬升中位、肥了右尾#
30 年跑完,看末期财富的分布(对数纵轴,避免少数巨富路径压扁图):

过度杠杆(w=150%)的分布最靠右、右尾最肥——高股权暴露吃到了权益溢价,但也意味着左尾更薄(破产概率更高,只是本例参数下没破产)。Merton 最优(w=100%)居中。
补充:w* 与财富水平无关(myopic 性质)#
注意 的公式里没有任何 ——它只取决于市场参数和你的偏好,与「你现在有多少钱」无关。这与直觉相悖:穷人该更激进(要翻本)还是更保守(输不起)?Merton 的回答是「都不」:在 CRRA + 参数恒定的世界里,最优风险比例与财富水平脱钩,因为你的风险厌恶只由 决定,不随 变。这个性质叫 myopic(短视)最优——每一刻的最优决策只看当前市场,不用「回望」一生规划。它很优雅,但也是假设脆弱性的来源:一旦 真的随财富变化(现实如此),w* 立刻变成 的函数。
补充:与静态 Markowitz 均值-方差的对照#
Markowitz 在单期里解的是 s.t. ,最优权重与 Merton 的 在「风险溢价/风险」结构上同源,但有两个本质区别:(1)Markowitz 是单期、给定目标收益 求权重,Merton 是连续多期、连消费一起联合最优;(2)Markowitz 的样本协方差极易估计误差放大(经典「误差最大化器」问题),Merton 闭式虽然干净,但对 的估计误差同样极度敏感。所以两者不是替代关系,而是「同一风险-收益权衡思想在单期 vs 连续期框架下的两种呈现」。
七、四类致命局限(务必先看这段)#
- CRRA 效用不现实:真实投资者在高财富时风险厌恶会下降(越有钱越敢赌),低财富时反而升高。Merton 假设 恒定,把人简化成一条直线。
- 参数 恒定是最大幻觉:本文用 10%/2%/20% 是拍的。现实中 和 都时变、且 极难估计(误差一点, 就从 100% 变成 200% 或 50%)。Merton 对输入参数极度敏感,这是它最危险的实战裂缝。
- 忽略交易成本与约束:模型允许任意比例(包括负数=做空、>1=杠杆)、零摩擦。真实账户有佣金、滑点、卖空限制、保证金催缴, 在实盘常常不可达。
- Merton 最大化的是效用,不是财富:图四里 Merton 中位财富(0.73x)低于过度杠杆(2.32x),因为 每年抽走大量财富、且 CRRA 效用在破产附近极陡——最优解牺牲了财富中位数来换取「不破产 + 平滑消费」。别把 Merton 解当成「最赚钱的配置」,它是「让一辈子消费最舒服的配置」。
八、实盘落地:把 w* 当再平衡锚(含交易成本近似)#
闭式 不是让你一次性建仓后就躺平,而是给你一个动态再平衡目标。实务里最常见的落地方式:每月末把风险资产权重拉回 (或带阈值的「漂移带」再平衡)。下面这段把交易成本近似成固定比例 ,看它对期末财富的中位影响:
def sim_wealth_tc(w, kappa, tc=0.001, W0=1.0, T_years=30, steps_per_yr=12, n_paths=3000, seed=20260719):
rng = np.random.default_rng(seed)
N = T_years * steps_per_yr; dt = 1.0/steps_per_yr
Z = rng.standard_normal((n_paths, N))
W = np.ones(n_paths) * W0
old_w = np.zeros(n_paths) # 期初无持仓
cost = np.zeros(n_paths)
drift = (r + w*(mu-r) - kappa)*dt; diff = w*sig*np.sqrt(dt)
for i in range(N):
# 再平衡到目标 w(仅在期初 i==0 演示, 实务每月执行)
if i == 0:
traded = np.abs(w - old_w)
cost += traded * W * tc
W = W * np.exp(drift + diff*Z[:, i]) - kappa*W*dt
W = np.maximum(W, 0.0)
return W - cost
W_tc = sim_wealth_tc(w_star, k_star)
print(f"含 0.1% 交易成本后中位财富 = {np.median(W_tc):.3f}x (无成本 0.73x)")python关键结论:交易成本对 Merton 最优策略的侵蚀小于对过度杠杆策略——因为 是平稳目标,再平衡频率可以压低;而 的过度杠杆每次再平衡都要买卖更多敞口,摩擦成本放大得更狠。这也是 Merton 解在「考虑摩擦后仍然稳健」的一个侧面证据。但注意:本例只在期初调仓一次,真实月度再平衡的累积成本需用完整循环重算,且 应换成你的真实佣金+滑点。
九、正确用法:当「标尺」,别当「圣杯」#
Merton 的真正价值不在那几行公式(实盘没人直接套),而在它给出的结构性直觉:
- 风险敞口应与超额收益成正比、与波动平方成反比——这解释了「波动越大该减仓」;
- 风险厌恶越高该越保守——这解释了为什么临近退休要降权益;
- 消费与投资必须联合决策——「先攒钱再想怎么投」是错的。
把它当组合政策的理论锚点:任何实盘策略偏离 时,你都得能说清「我为什么比 Merton 更激进/更保守、我承担了 Merton 没覆盖的哪种风险」。说不清,就是拍脑袋。
结语#
Merton (1969) 用随机控制把消费-投资从艺术变成可计算的闭式解:股权敞口 、消费率 由贴现与风险溢价共同决定。它的美在于「一个目标函数同时解出投多少、花多少」;它的坑在于 CRRA 不现实、参数恒定、零摩擦、且最优的是效用而非财富。理解这把标尺,比背下公式重要一百倍——它告诉你任何偏离最优的配置,都必须为承担额外风险找到理由。