跳到主要内容

收益率、分散投资与组合风险

价格从 100 涨到 110,再跌到 99,两期收益率分别是 10% 和 −10%,最后却亏了 1%。再把两种资产放进同一个组合:收益可以按期初权重相加,波动却不能这样相加。理解这两点,才能把价格记录变成收益记录,并算清组合实际承担了什么风险。

下面的价格、收益率和组合参数都是假设数字,金额使用同一种货币单位。除专门计算费用的一节外,先忽略交易成本和税费;持有期间没有外部入金或提款。期权的支付结构和定价假设见金融市场与数学建模,复制组合的定价算例见无套利与二叉树期权定价。

从价格到收益率​

设 Pt−1>0P_{t-1}>0 是期初价格,PtP_t 是期末价格。没有分配收入时,简单收益率 rtr_t 和对数收益率 ℓt\ell_t 为:

rt=Pt−Pt−1Pt−1,ℓt=ln⁡(1+rt)=ln⁡PtPt−1.r_t=\frac{P_t-P_{t-1}}{P_{t-1}},\qquad \ell_t=\ln(1+r_t)=\ln\frac{P_t}{P_{t-1}}.

对数收益要求 1+rt>01+r_t>0;资产归零时,简单收益率为 −100%,对数收益没有有限值。价格必须按拆股等单位变化统一口径,否则机械的价格调整会被误算成盈亏。

跨期计算要把增长因子相乘。若每期收益都留在投资中,TT 期后的财富为:

WT=W0∏t=1T(1+rt),ln⁡WTW0=∑t=1Tℓt.W_T=W_0\prod_{t=1}^{T}(1+r_t),\qquad \ln\frac{W_T}{W_0}=\sum_{t=1}^{T}\ell_t.

在 100 → 110 → 99 的例子中,1.10×0.90=0.991.10\times0.90=0.99。算术平均收益率是 0%,几何平均每期收益率却是 0.99−1≈−0.5013%\sqrt{0.99}-1\approx-0.5013\%,对数收益之和约为 −0.010050。算术平均用于描述单期收益的平均水平;几何平均描述这条路径的复利增长。两期不必是两年,只有明确周期后才能把结果称为年化收益。

对数收益可以跨时间相加,组合的简单收益可以跨资产加权。组合对数收益一般不等于各资产对数收益的加权平均,不能把这两种便利混在一起。

总收益、分配收入与购买力​

股票收益既可能来自价格上涨,也可能来自股息;SEC 的投资者教育页面还指出,名义金额增长可能跟不上通胀。比较投资表现时,需要把分配收入和购买力一起考虑。

设每单位资产的分配收入 DtD_t 在期末收到,且本期没有其他现金流,则总收益率为:

rttotal=Pt−Pt−1+DtPt−1.r_t^{\mathrm{total}}=\frac{P_t-P_{t-1}+D_t}{P_{t-1}}.

以 100 买入,期末价格为 98,同时收到 5 的股息,价格收益率是 −2%,总收益率却是 (98−100+5)/100=3%(98-100+5)/100=3\%。如果分配发生在期中并立即再投资,就要按实际时点和再投资价格计算财富路径。使用已包含分配再投资的总收益序列时,不应再把股息加一次。

设同一期通胀率为 πt>−1\pi_t>-1,即价格指数保持为正,实际收益率按购买力计算:

1+rtreal=1+rttotal1+πt.1+r_t^{\mathrm{real}}=\frac{1+r_t^{\mathrm{total}}}{1+\pi_t}.

若通胀为 2%,上例的实际收益率是 1.03/1.02−1≈0.9804%1.03/1.02-1\approx0.9804\%。直接用 3% 减 2% 得到的 1% 是小幅变化时的近似。多期比较也应使用同一货币、同一时间区间的总收益和价格指数变化。

权重会漂移,再平衡需要交易​

权重 wiw_i 是期初投入资产 ii 的金额占组合总值的比例。全额投资、只做多的组合满足 ∑iwi=1\sum_iw_i=1 且 wi≥0w_i\ge0。本期不在资产之间调仓、没有外部现金流,并将分配收入留在对应资产账户内再投资时,用一致口径的资产总收益率计算组合简单收益率:

rp=∑iwiri.r_p=\sum_iw_ir_i.

若分配收入留作现金,计算下一期权重时应把现金单列为一个头寸。

假设初始财富为 10000,资产 A 占 60%,B 占 40%。一年中 A 收益 10%,B 收益 −5%:

项目AB合计
期初金额6000400010000
期末金额6600380010400
期末权重63.4615%36.5385%100%
恢复 60/40 的目标金额,扣费前6240416010400

组合收益为 0.60×10%+0.40×(−5%)=4%0.60\times10\%+0.40\times(-5\%)=4\%。如果不交易,下一年的 A 权重就变成 6600/10400≈63.4615%6600/10400\approx63.4615\%,不能继续用 60% 计算下一期收益。

SEC 对再平衡的说明把它定义为恢复资产配置的调整。这个例子需要卖出 A 的 360,再买入 B 的 360。按固定日期或权重偏离阈值调整,是两种不同的交易规则;应先确定规则,再比较它们的净收益和风险。恢复权重本身并不保证下一期收益更高。

协方差决定分散效果​

Markowitz 的《Portfolio Selection》(1952)把组合选择建立在预期收益与收益方差的取舍上;原文的可读 PDF说明,分散效果取决于协方差,而不只是持有多少种证券。相关统计定义见统计与概率。

令随机收益向量为 rr,均值为 μ\mu,协方差矩阵为 Σ\Sigma。对预先确定的单期权重 ww:

E[rp]=wTμ,Var⁡(rp)=wTΣw.\mathbb E[r_p]=w^\mathsf T\mu,\qquad \operatorname{Var}(r_p)=w^\mathsf T\Sigma w.

波动率是收益标准差 σp=Var⁡(rp)\sigma_p=\sqrt{\operatorname{Var}(r_p)}。当两种资产的标准差都为正时,协方差为 Cov⁡(rA,rB)=ρσAσB\operatorname{Cov}(r_A,r_B)=\rho\sigma_A\sigma_B,其中 ρ∈[−1,1]\rho\in[-1,1] 是相关系数。于是:

σp2=wA2σA2+wB2σB2+2wAwBρσAσB.\sigma_p^2=w_A^2\sigma_A^2+w_B^2\sigma_B^2 +2w_Aw_B\rho\sigma_A\sigma_B.

继续使用 60/40 的权重,但换成预测模型的假设输入,全部对应一年:

参数AB
预期简单总收益率8%4%
收益标准差20%10%

这不是上一节已实现收益的估计。另设 ρ=0.25\rho=0.25,协方差为 0.25×0.20×0.10=0.0050.25\times0.20\times0.10=0.005,则:

Σ=(0.040.0050.0050.01),E[rp]=0.60×0.08+0.40×0.04=0.064.\Sigma=\begin{pmatrix}0.04&0.005\\0.005&0.01\end{pmatrix},\qquad \mathbb E[r_p]=0.60\times0.08+0.40\times0.04=0.064. σp2=0.602×0.202+0.402×0.102+2×0.60×0.40×0.005=0.0184,σp≈13.5647%.\sigma_p^2=0.60^2\times0.20^2+0.40^2\times0.10^2 +2\times0.60\times0.40\times0.005=0.0184, \qquad \sigma_p\approx13.5647\%.

预期收益是 6.4%,波动率约为 13.5647%。把两项波动率直接加权会得到 16%,只有这里的完全正相关情形才等于正确结果。固定权重和各资产波动率,只改相关系数:

ρ\rho组合方差组合波动率
10.025616.0000%
0.250.018413.5647%
00.016012.6491%
−10.00648.0000%

分散后波动低于直接加权的 16%,但仍可能高于单独持有 B 的 10%。完全负相关时,这组权重也没有把风险降到零,因为 A 和 B 的加权波动幅度没有抵消。

估计波动时,要保留采样周期。如果各期对数收益方差相同、任意两期的协方差为零,mm 期对数收益和的标准差就等于单期标准差乘 m\sqrt m。这些是充分条件,并非必要条件;不同期之间的协方差也可能相互抵消。这个缩放规则不直接给出复利简单收益的精确年波动率。

波动、回撤与下行损失​

波动率同时计入向上和向下的偏离。它没有说明最大亏损、损失出现的顺序,通常也不能单凭均值和方差确定亏损概率。

回撤衡量当前财富离此前最高值有多远。对初始财富 W0>0W_0>0、没有外部现金流的总收益财富路径,令 Ht=max⁡0≤s≤tWsH_t=\max_{0\le s\le t}W_s,用非负数表示回撤幅度:

DDt=1−WtHt,MDD=max⁡tDDt.\mathrm{DD}_t=1-\frac{W_t}{H_t},\qquad \mathrm{MDD}=\max_t\mathrm{DD}_t.
时点财富 WtW_t历史最高值 HtH_t回撤
01001000%
11101100%
28811020%
39911010%
41121120%

最终比起点增长 12%,途中最大回撤却是 20%。从 88 回到旧高点 110,需要涨 25%,而不是 20%。入金会机械抬高账户余额;有外部现金流时,应使用剔除入金影响的收益指数来算回撤。

下行分析还可以直接计算压力情景。如果同一年 A 跌 30%、B 跌 10%,60/40 组合的收益为 −22%,初始 10000 损失 2200。这个结果没有赋予情景任何概率;13.5647% 的模型波动率也没有给亏损设上限。若关注亏损概率或超过某个门槛的平均损失,就需要进一步说明尾部的分布假设或情景概率。

均值—方差优化与估计敏感性​

CVX 的组合优化课程给出单期均值—方差目标:用预期收益减去方差惩罚。只做多的版本为:

max⁡w  μTw−γwTΣw,1Tw=1,wi≥0,γ>0.\max_w\;\mu^\mathsf T w-\gamma w^\mathsf T\Sigma w, \qquad \mathbf1^\mathsf T w=1,\quad w_i\ge0,\quad\gamma>0.

γ\gamma 决定模型如何权衡收益和方差。均值与协方差必须使用同一周期,收益统一写成小数;从小数改成百分数会改变两项的相对尺度,因此不能原样沿用 γ\gamma。协方差矩阵半正定时,目标为凹函数,以上约束构成凸可行集,可用凸优化求全局最优解。均值—方差有效前沿由这些可行组合中不被其他组合在收益和方差上支配的点组成;它随输入和约束改变。

在前面的协方差矩阵下,设 wA=xw_A=x、wB=1−xw_B=1-x,可把方差展开为:

σp2(x)=0.04x2−0.01x+0.01.\sigma_p^2(x)=0.04x^2-0.01x+0.01.

如果只求最小方差,令导数 0.08x−0.01=00.08x-0.01=0,得到 x=0.125x=0.125:A 占 12.5%,B 占 87.5%。这个解没有使用预期收益。

如果最大化上面的收益减方差目标,取 γ=1\gamma=1,对 xx 求导,再检查 0≤x≤10\le x\le1:

x∗=min⁡(1,max⁡(0,μA−μB+0.01γ0.08γ)).x^*=\min\left(1,\max\left(0, \frac{\mu_A-\mu_B+0.01\gamma}{0.08\gamma}\right)\right).
年预期收益输入最优 A 权重最优 B 权重
A 为 8%,B 为 4%62.5%37.5%
A 为 6%,B 为 4%37.5%62.5%

只把 A 的预期收益调低 2 个百分点,配置就改变了 25 个百分点。求解准确不代表输入准确。样本均值、协方差和相关系数会随样本区间改变;共同冲击下的关系也可能与普通时期不同。可以对收益估计作上下扰动,改变协方差估计区间,并加入持仓上限,观察配置是否仍然稳定。最小方差方案避开了均值估计,却仍依赖协方差估计。

成本、流动性与模型边界​

课程还列出按权重变化收取的交易成本惩罚。取线性成本时:

C(w)=∑iκi∣wi−wiprev∣,κi≥0.C(w)=\sum_i\kappa_i\left|w_i-w_i^{\mathrm{prev}}\right|, \qquad \kappa_i\ge0.

wprevw^{\mathrm{prev}} 应取交易前已经漂移的权重,κi\kappa_i 是买入或卖出每单位金额的成本率。这里把两组权重都按交易前财富归一化,所以 C(w)C(w) 表示成本占该财富的比例,目标金额尚未扣费。把 C(w)C(w) 从收益目标扣除,或限制总交易量,可能改变原来的最优权重;若目标权重按扣费后的财富定义,还需把费用纳入资金平衡约束。

前面的再平衡买卖各 360。若两边都收 0.1% 的费用,估算成本为 (360+360)×0.001=0.72(360+360)\times0.001=0.72。这里按买卖金额之和收费;若先把买卖总金额除以二,再乘相同费率,就只算了一半的费用。表里的 6240 和 4160 是扣费前目标,实际从组合扣费时,还要按扣费后的财富重新算目标和交易金额。

固定的线性费率没有描述买卖价差随行情变化、订单冲击价格或无法及时成交的情况。SEC 对流动性的说明强调了成交速度与价格冲击;其订单说明也指出,最近成交价不一定是市价单的执行价。流动性差时,账面价格可能无法用于整笔交易;若必须短期卖出,模型就需要限制头寸和可交易金额。税费、融资成本和多期现金需求也会改变可行方案。

均值—方差模型保留的是一个周期的前两个矩。资产尾部损失、回撤路径、参数变化和执行约束需要另外建模。评估一个组合时,可以把总收益路径、相关性假设、压力损失和成本后的交易计划放在一起比较;回到量化金融概览,再选择期权或宏观情景的后续问题。

用 Python 重现计算​

把下面代码保存为 portfolio_example.py,用 Python 3.8 或更新版本执行 python3 portfolio_example.py。标准库文档说明,math.prod 从 Python 3.8 起提供。优化部分使用上面固定协方差矩阵的两资产解析解,其他部分重现复利、实际收益、再平衡、分散、回撤和压力损失。

returns 必须是非空的等长周期收益序列,各值有限且大于 −1,以便计算有限的对数收益;不满足时抛出 ValueError。交易金额为正表示买入,为负表示卖出,费用按绝对交易金额估算。

from math import isfinite, log1p, prod, sqrt

returns = [0.10, -0.10]
if not returns or any(not isfinite(r) or r <= -1 for r in returns):
raise ValueError("returns must be nonempty and finite, with each return > -1")
growth = prod(1 + r for r in returns)
print(f"compound={growth - 1:.4%}; log_sum={sum(log1p(r) for r in returns):.6f}")
print(f"arithmetic={sum(returns) / len(returns):.4%}; geometric={growth**(1 / len(returns)) - 1:.4%}")
total_return = (98 + 5) / 100 - 1
print(f"total={total_return:.4%}; real={(1 + total_return) / 1.02 - 1:.4%}")

holdings = [6000 * 1.10, 4000 * 0.95]
wealth = sum(holdings)
trade_a = 0.60 * wealth - holdings[0]
trade_b = -trade_a
print(f"wealth={wealth:.2f}; return={wealth / 10000 - 1:.4%}; weight_A={holdings[0] / wealth:.4%}")
print(f"trade_A={trade_a:.2f}; trade_B={trade_b:.2f}; estimated_fee={(abs(trade_a) + abs(trade_b)) * 0.001:.2f}")

sigma_a, sigma_b = 0.20, 0.10
w = 0.60
for rho in [1.0, 0.25, 0.0, -1.0]:
variance = (w * sigma_a)**2 + ((1 - w) * sigma_b)**2
variance += 2 * w * (1 - w) * rho * sigma_a * sigma_b
print(f"rho={rho:.2f}; variance={variance:.6f}; volatility={sqrt(variance):.4%}")

cov = 0.25 * sigma_a * sigma_b
den = sigma_a**2 + sigma_b**2 - 2 * cov
x_min = (sigma_b**2 - cov) / den
print(f"min_variance_weight_A={x_min:.4%}")
for mu_a in [0.08, 0.06]:
mu_b, gamma = 0.04, 1.0
x = ((mu_a - mu_b) / (2 * gamma) + sigma_b**2 - cov) / den
x = min(1.0, max(0.0, x))
print(f"mu_A={mu_a:.2%}; optimal_weight_A={x:.4%}")

path = [100, 110, 88, 99, 112]
peak, max_drawdown = path[0], 0.0
for value in path:
peak = max(peak, value)
max_drawdown = max(max_drawdown, 1 - value / peak)
print(f"max_drawdown={max_drawdown:.4%}; recovery={110 / 88 - 1:.4%}")
stress = 0.60 * (-0.30) + 0.40 * (-0.10)
print(f"stress_return={stress:.4%}; stress_loss={-10000 * stress:.2f}")
compound=-1.0000%; log_sum=-0.010050
arithmetic=0.0000%; geometric=-0.5013%
total=3.0000%; real=0.9804%
wealth=10400.00; return=4.0000%; weight_A=63.4615%
trade_A=-360.00; trade_B=360.00; estimated_fee=0.72
rho=1.00; variance=0.025600; volatility=16.0000%
rho=0.25; variance=0.018400; volatility=13.5647%
rho=0.00; variance=0.016000; volatility=12.6491%
rho=-1.00; variance=0.006400; volatility=8.0000%
min_variance_weight_A=12.5000%
mu_A=8.00%; optimal_weight_A=62.5000%
mu_A=6.00%; optimal_weight_A=37.5000%
max_drawdown=20.0000%; recovery=25.0000%
stress_return=-22.0000%; stress_loss=2200.00
探索关联打开关联网络