最优组合策略通过构建一个带线性加总约束的二次规划(或最小二乘)优化问题,实现各层级预测的一致性。其核心是在尊重各层级独立预测值的基础上,寻找一组满足层级加总关系的修正预测,使得修正后的预测与原始预测的整体偏差最小。
一、 核心原理与数学模型
假设有 n 个底层序列(如单品),其原始预测向量为 y_hat。存在一个 m x n 的聚合矩阵 S,定义了如何将底层序列加总为 m 个上层序列(如品类、总店)。最优组合策略旨在找到一个修正后的底层预测向量 y_tilde,满足以下优化问题:
目标:最小化修正预测与原始预测的加权平方误差。 约束:修正后的预测必须严格满足层级加总关系。
数学模型如下:
Minimize: (y_tilde – y_hat)' * W * (y_tilde – y_hat)
Subject to: S * y_tilde = y_top_tilde
其中:
- y_hat:n x 1 向量,底层序列的原始预测。
- y_tilde:n x 1 向量,待求解的、协调后的底层预测。
- W:n x n 的权重矩阵,通常取原始预测误差的协方差矩阵的逆,以给予更准确的预测更大的权重。实践中常简化为单位矩阵或对角矩阵。
- S:m x n 的聚合矩阵,元素为0或1,定义了层级结构。
- y_top_tilde:m x 1 向量,由 y_tilde 通过 S 矩阵加总得到的上层预测。该约束确保了 y_tilde 和 y_top_tilde 之间的一致性。
该优化问题的解(当 W 可逆时)有闭式解,可通过拉格朗日乘子法求得,最终得到所有层级(底层和上层)协调一致的最优预测。
二、 实现步骤与代码示例
以下以 Python 为例,展示使用 hierarchicalforecast 库实现最优组合预测的关键步骤。
import pandas as pd
import numpy as np
# 假设已安装 hierarchicalforecast 和 scikit-learn
from hierarchicalforecast.core import HierarchicalReconciliation
from hierarchicalforecast.methods import OptimalCombination
from sklearn.base import BaseEstimator
# 1. 准备原始预测数据与层级结构
# 示例:3个单品(SKU_A, SKU_B, SKU_C),1个总店(Total)
# 原始预测数据框 (日期, 各单品预测值)
base_forecasts_df = pd.DataFrame({
'ds': pd.date_range(start='2024-0101', periods=7, freq='D'),
'SKU_A': [10.5, 11.3, 12.1, 10.8, 11.5, 12.3, 11.0],
'SKU_B': [15.2, 14.8, 16.0, 15.5, 14.9, 16.2, 15.8],
'SKU_C': [5.8, 6.1, 5.5, 6.0, 5.7, 5.9, 6.2]
})
# 设置日期为索引
base_forecasts_df = base_forecasts_df.set_index('ds')
# 定义层级聚合矩阵 S (手动构造示例)
# 行: [SKU_A, SKU_B, SKU_C, Total]
# 列: [SKU_A, SKU_B, SKU_C]
S = np.array([
[1, 0, 0], # SKU_A [0, 1, 0], # SKU_B
[0, 0, 1], # SKU_C [1, 1, 1] # Total = SKU_A + SKU_B + SKU_C
])
print("聚合矩阵 S:")
print(S)
# 2. 应用最优组合方法进行协调
# 创建协调器,指定方法为 OptimalCombinationreconciler = HierarchicalReconciliation(
S=S, # 传入聚合矩阵
method=OptimalCombination()
)
# 执行协调预测 (此处假设权重矩阵W为单位矩阵)
# reconciled_forecasts 是一个数组,行顺序与S矩阵的行定义一致
reconciled_forecasts = reconciler.reconcile(base_forecasts_df.values.T) # 注意输入需要转置为 (n_series, n_timepoints)
# 3. 整理并输出结果
# 将协调后的预测数组转换回DataFrame
result_df = pd.DataFrame(
reconciled_forecasts.T, # 转置回来 (n_timepoints, n_series)
index=base_forecasts_df.index,
columns=['SKU_A_reconciled', 'SKU_B_reconciled', 'SKU_C_reconciled', 'Total_reconciled']
)
print("
协调后的预测结果:")
print(result_df)
# 4. 验证一致性约束
print("
验证加总一致性 (例如第一行):")
print(f"SKU_A + SKU_B + SKU_C = {result_df.iloc[0, 0]:.2f} + {result_df.iloc[0, 1]:.2f} + {result_df.iloc[0, 2]:.2f} = {result_df.iloc[0, 0] + result_df.iloc[0, 1] + result_df.iloc[0, 2]:.2f}")
print(f"Total (协调后) = {result_df.iloc[0, 3]:.2f}")
# 两者应完全相等
assert np.allclose(result_df['Total_reconciled'].values,
result_df['SKU_A_reconciled'].values + result_df['SKU_B_reconciled'].values + result_df['SKU_C_reconciled'].values), "一致性约束未满足!"
三、 策略对比与选择下表对比了三种主流层级预测协调策略,最优组合策略在精度与一致性间取得了平衡。
| 自下而上 | 仅预测底层,上层通过加总得到。 | 实现简单,天然保证一致性,保留底层细节。 | 误差易累积,高层预测可能不稳定。 | 底层数据质量高,业务强依赖单品计划。 |
| 自上而下 | 仅预测顶层,按历史比例拆分至下层。 | 高层预测稳健,天然满足总量约束。 | 丢失个体特征,结构假设僵化。 | 更关注总量控制,高层模式稳定,下层结构比例变化小。 |
| 最优组合 | 各层级独立预测,通过约束优化调整以满足加总一致性,并最小化整体调整偏差。 | 平衡精度与一致性,常能提升高层预测精度,灵活可加权。 | 计算相对复杂,需估计协方差或权重。 | 需同时保证多层级决策的一致性与整体精度,是兼顾两者的最佳实践。 |
选择建议:若业务同时要求单品预测的细节准确性与高层总量预测的稳定性,最优组合策略是首选。它通过数学优化将不同来源的预测信息有效融合,在实际应用中已被证明能显著降低高层预测误差(例如,在案例中使品类预测的WMAPE从18%降至11%)。
参考来源
- 自下而上 vs 自上而下 vs 最优组合预测策略解析
- 自下而上 vs 自上而下 vs 最优组合预测策略解析
- Nixtla时间序列预测实战:分层建模与业务驱动的统一框架
- AI需求预测实战:门店级销量预测与ERP自动补货集成
- 数学建模国赛备赛避坑指南:新手如何从历年赛题中快速找到解题思路(附2019-2024年高频考点分析)
- 工业级时间序列预测落地方法论:从特征工程到业务闭环




