Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

短样本下为何等权配置胜过优化

当样本较短、预期收益难以准确估计时,等权配置可能优于优化仓位。 seeded Python 模拟显示,这一交叉点出现后会随样本增长而消失。

当样本太短、无法准确确定预期收益时,等权配置往往优于优化仓位。短样本通常是常态,而不是例外。优化器的计算本身没有问题,但它依赖的输入——预期收益——几乎没人能准确估计。1/N组合采用等权配置,完全不需要估计预期收益。因此,即使估计结果很差,它仍能保持稳健。

等权重真的能战胜优化吗?

在一个特定条件下,确实可以。我们逐项来看。等权重记为 1/N,即将资金平均分配到 N 个持仓上,不需要任何预测。均值—方差优化旨在求出权重,使预期收益率与估计方差之比达到最高。凯利准则旨在求出使长期复合增长最大化的权重;对于彼此不相关的资产,其结果会简化为:权重与各资产的预期超额收益率除以方差所得的比值成正比。我们的凯利准则头寸规模指南详细介绍了这一公式。

两种优化方法需要相同的输入:每项资产的预期收益率。这正是样本最难准确估计的变量。波动率可以通过较短窗口以可用的精度估算。均值则无法做到,二者之间的差距在任何价格历史中都足够明显。下方图表选取六只广泛持有的股票,分别测算它们在 2015 年至 2024 年每个日历年的数据,并报告年度最高估计值与最低估计值之间的差距。每只股票都计算两次:一次针对年化日均收益率,另一次针对年化波动率。

查询十年年度估计:均值的变动远大于波动率
每个数字背后的完整 SQL
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND date >= '2015-01-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
yearly AS
(
    SELECT
        ticker,
        toYear(date)                     AS yr,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM rets
    WHERE isFinite(ret)
    GROUP BY ticker, yr
    HAVING count() >= 200
)
SELECT
    ticker,
    round(max(mean_pct) - min(mean_pct), 1) AS mean_estimate_range_pct,
    round(max(vol_pct) - min(vol_pct), 1)   AS vol_estimate_range_pct
FROM yearly
GROUP BY ticker
ORDER BY mean_estimate_range_pct DESC
Run this yourself

对于 NVDA,这十年间年度均值估计值的跨度为 184.7 个百分点;相比之下,同一股票在相同年份中的波动率估计值跨度为 28.6 个百分点。图表中最稳定的股票 KO,其年度均值估计值仍然变动了 23.9 个百分点。任何将上一年的平均收益率作为本年度预期收益率输入优化模型的方案,实际上都在使用一个波动幅度如此之大的数字。

估计预期收益需要多长的样本?

估计平均收益的标准误等于资产波动率除以样本年数的平方根。这里的单位是年,而不是观测值数量:将同样的十二个月按小时采样,而不是按日采样,并不会带来额外信息。将波动率为百分之二十的资产代入该公式,一年的历史数据对应的标准误为每年二十个百分点。四年数据可将其降至十个百分点。若要降至一个百分点,也就是在比较两个真实均值相差两个百分点的资产前所需的精度,则需要四个世纪的数据。

波动率则不同。其估计精度取决于观测值数量,而不是日历跨度,因此几个月的日度数据就能将误差控制在几个百分点以内。下方图表将某只指数基金二十年的日收益切分为固定长度且互不重叠的区间,在每个区间内分别计算两项估计值,并报告这些估计值在不同区间之间的离散程度。

查询不同样本长度下均值和波动率估计的离散程度
每个数字背后的完整 SQL
WITH prices AS
(
    SELECT
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= '2005-01-01'
      AND date <  '2025-01-01'
    GROUP BY date
),
rets AS
(
    SELECT
        date,
        c / lagInFrame(c, 1) OVER (ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
numbered AS
(
    SELECT
        ret,
        row_number() OVER (ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
),
sweep AS
(
    SELECT
        arrayJoin([21, 63, 126, 252, 504]) AS n,
        i,
        ret
    FROM numbered
),
blocks AS
(
    SELECT
        n,
        intDiv(i - 1, n)                 AS blk,
        avg(ret) * 252 * 100             AS mean_pct,
        stddevPop(ret) * sqrt(252) * 100 AS vol_pct
    FROM sweep
    GROUP BY n, blk
    HAVING count() = n
)
SELECT
    concat(toString(n), ' sessions') AS sample_length,
    round(stddevPop(mean_pct), 1)    AS mean_estimate_spread_pct,
    round(stddevPop(vol_pct), 1)     AS vol_estimate_spread_pct,
    count()                          AS window_count
FROM blocks
GROUP BY n
ORDER BY n ASC
Run this yourself

当区间长度为 21 sessions 时,平均收益估计值的离散范围为 53.7 个百分点;在相同区间内测得的波动率估计值,离散范围为 10.9 个百分点。将区间延长至 504 sessions 后,平均收益估计值的离散范围收窄至 10.6 个百分点。误差按平方根规律收窄:误差每减半,所需数据量就要增加四倍。

您可以自行运行的带种子模拟

这些内容并不能证明估计误差足以让 1/N 胜出。下面的模拟可以证明这一点。整个流程只需要安装 Python:无需数据文件、下载内容或第三方软件包。模拟会根据您选择的参数自行生成收益率,因此真实答案已知,两种配置都可以据此评估。

  1. 导入两个模块 import randomimport statistics,再导入 from math import log。在下一行使用 random.seed(20260816) 设置随机种子。
  2. 定义五项资产,其真实年化预期收益率分别为 5%、6%、7%、8% 和 9%;每项资产的真实年化波动率均为 20%,且彼此不相关。使用 mu_d = mu_a / 252sd_d = sd_a / (252 ** 0.5) 转换为日频步长。
  3. [60, 125, 250, 500, 1000, 2500, 5000] 的遍历范围中选择样本长度 T。
  4. 使用 random.gauss(mu_d, sd_d) 为每项资产生成 T 个日收益率。这组抽样结果就是管理人能够看到的全部历史数据。
  5. 使用 statistics.mean 估计每项资产的均值,并使用 statistics.stdev 估计其波动率。这两项估计值就是优化器掌握的全部信息。
  6. 构建等权组合,为五项资产各分配 0.2 的权重。该组合完全不使用上述估计值。
  7. 构建优化组合,将每项资产的原始权重设为 mu_hat / (sd_hat ** 2),再用每项权重除以所有原始权重绝对值之和,使两种组合具有相同的总敞口。
  8. 根据真实参数,为每项资产生成一条包含 2520 个日收益率的新样本外路径。两种配置此前都未见过这条路径。
  9. 使用该路径评估两种配置,评分指标为 log(1 + r) 的平均值,其中 r 是当天五项资产收益率的加权和。
  10. 在每个 T 下,将第 4 步至第 9 步重复 2000 次独立试验,并记录等权组合跑赢优化权重的试验占比。

从较短的 T 读到较长的 T。在较短样本下,等权组合在绝大多数试验中胜出。随着 T 增加,这一占比持续下降;在较长样本下,优化权重在多数试验中胜出。两者会在中间某处交叉。交叉点会随随机种子以及真实均值之间的差距而变化。但方向不会变:数据越多,越有利于优化器;数据越少,越有利于 1/N。若要复现结果,请修改 random.seed(20260816) 内的整数,然后重新运行整个遍历。

为什么优化器会放大糟糕的均值估计

看看这些估计值如何进入权重。估计均值位于分子,估计方差位于分母。将均值估计翻倍,权重就会翻倍。将方差估计下调四分之一,权重就会上升三分之一。在幸运样本中,这两个误差往往会朝同一方向发展:一段连续的良好收益会推高测得的均值,并且常常在同一观察窗口内压低测得的方差。优化器会将该资产视为资产组中表现最突出的成员,并据此配置仓位。样本外,该资产又只是资产组中的普通成员。等权重策略从未看到那段幸运样本。

模拟是这一问题较温和的版本。五项互不相关的资产会形成对角协方差矩阵,无需进行复杂求逆。真实投资组合彼此相关,而当样本数量仅略多于资产数量时,由样本构建的协方差矩阵会接近奇异。对其求逆会将微小的输入误差放大为极大的权重。这就是优化器如何在某一资产上建立数倍于资本的仓位,同时对其高度相似的替代资产建立相抵消的空头仓位。我们关于投资组合集中度风险的文章介绍了这类权重会如何影响回撤。

输入数据也不会保持不变。下图跟踪了某宽基指数基金和一家大型必需消费品公司的滚动一年日均回报率。数据按年化处理,并按月采样。

查询滚动一年平均回报率,优化器将使用的数值
每个数字背后的完整 SQL
WITH prices AS
(
    SELECT
        ticker,
        date,
        toFloat64(max(close)) AS c
    FROM global_markets.stocks_daily_aggs
    WHERE ticker IN ('SPY', 'KO')
      AND date >= '2015-10-01'
      AND date <  '2025-01-01'
    GROUP BY ticker, date
),
rets AS
(
    SELECT
        ticker,
        date,
        c / lagInFrame(c, 1) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) - 1 AS ret
    FROM prices
),
trailing AS
(
    SELECT
        ticker,
        date,
        avg(ret) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 251 PRECEDING AND CURRENT ROW) * 252 * 100 AS trailing_mean_pct,
        row_number() OVER (PARTITION BY ticker ORDER BY date ASC) AS i
    FROM rets
    WHERE isFinite(ret)
)
SELECT
    toString(toStartOfMonth(date))                     AS month,
    round(avgIf(trailing_mean_pct, ticker = 'SPY'), 1) AS spy_trailing_mean_pct,
    round(avgIf(trailing_mean_pct, ticker = 'KO'), 1)  AS ko_trailing_mean_pct
FROM trailing
WHERE i >= 252
  AND date >= '2017-01-01'
GROUP BY month
ORDER BY month ASC
Run this yourself

这两条线上的每一个点,都是某个优化器在相应日期可能接受的预期回报率。SPY的第一个月度读数为17.7%,最后一个读数为25.8%,中间还有96个读数。KO在同一窗口的起始读数为-0.4%。逐月使用这组序列的权重方案,也会继承其中每一次波动。

半 Kelly 与收缩能解决这个问题吗?

它们只能缓解问题。实践中常见四种修正方法。每种方法都牺牲部分理论最优结果,以降低对估计值的敏感度。

  • 半 Kelly 将每个权重减半。Kelly 增长曲线在峰值附近较为平坦,在峰值下方则陡峭。因此,持仓减半只会牺牲一小部分理论增长率,却能大幅降低高估优势所造成的损失。波动率目标对分母采用了相同思路:根据短样本能够提供的唯一输入来确定仓位。
  • 收缩会将每个估计均值拉向这些估计值的横截面平均值。样本越小,收缩幅度越大。达到极限时,所有资产的预期收益率都相同;如果波动率也相同,优化器自然会给出等权配置。等权组合就是完全收缩后的投资组合。
  • 约束包括禁止做空和设置单一持仓上限,用于限制某个偶然偏高的估计值将单一权重推得过高。它们的作用是控制损失,而不是改善估计值。
  • 完全放弃预期收益率后,可以采用最小方差和风险平价方法。这些方法只使用协方差,而协方差正是样本实际能够提供的输入。

这四种方法都不会创造样本中不存在的信息。它们改变的只是投资组合在多大程度上依赖您可能并不具备的信息。

优化何时能够发挥作用

这种交叉会在两个方向上出现。当 T 相对于真实均值之间的差距足够大时,优化配置会超过等权配置,并保持领先。差距越大,这种情况出现得越早。只要输入变量是数据能够提供的,优化通常也是更合适的工具:协方差和对冲比率的估计,通常远比预期收益可靠。

等权配置也有自身的代价。它忽略了您确实掌握的信息;在资产数量较少的投资范围内,其集中度也可能不亚于任何优化器。应将等权配置作为基准,要求任何候选权重都必须在权重未见过的数据上超越它。在同一组样本上拟合权重并评估权重,只是换了一种形式的回测中的前视偏差,而且每次都会让优化器显得更出色。若要围绕测得的优势给出合理区间,而不是单一的点估计,自助法置信区间是标准工具。

常见问题

等权重真的能跑赢均值—方差优化吗?

简而言之,在短样本中往往可以。优化器需要估计每项资产的预期收益率,而该估计的标准误差大致等于资产波动率除以样本年数的平方根。当这一误差仍大于资产之间真实的收益差异时,优化器实际上是在对噪声排序。等权重不需要进行这一估计,因此也不存在估错的问题。

估计预期收益率需要多少个观测值?

所需数量多得几乎超出所有人的想象。对于波动率为20%的资产,一年的日数据对应的标准误差接近每年20个百分点;若要将误差减半,日历跨度需要增加至四倍。在同一年内加入更多日内观测值并没有帮助。相比之下,利用几个月的数据就可以较为有效地估计波动率。

半凯利只是押注金额更小吗?

它是在更有利的条件下进行更小的押注。凯利增长曲线在峰值附近较为平坦,因此将仓位减半,只会放弃理论增长率中的一小部分,同时大致将路径波动率减半,并降低高估优势时的损失成本。

什么是1/N投资组合?

这是将资金等比例投入N个头寸,并按既定时间表进行再平衡的投资组合。它不需要收益率预测,也不需要协方差估计,因此成为所有需要这些输入的加权方案的标准基准。

图表面板的构建方式

三个面板均读取日收盘价,并计算简单的收盘价至收盘价收益率;同一股票代码在同一日期出现的重复行会合并为一个收盘价。年化收益率等于平均日收益率乘以252个交易日;年化波动率等于日标准差乘以252的平方根。年度面板仅保留至少包含200个交易日的日历年。分段面板使用不重叠区间,并舍弃每种区间长度下最后一个不完整区间;其窗口数量列显示每种长度生成了多少个区间。所有计算均未计入股息,因此这里展示的是价格收益率,对于派息资产,平均收益率水平会被低估。面板的重点是估计值的离散程度,而不是估计值的水平。


这里的每个面板都在图表下方附有完整且准确的SQL,模拟也附带随机种子。若您想对自己的股票代码列表执行相同的估计稳定性检验,请在Strasmore终端中用自然语言提出请求。

#quant#position sizing#portfolio construction#estimation error#kelly