在本系列二(多因子 Alpha 策略回测)中,我们已经对美股市场的 4 个量化因子完成了回测分析。接下来,将借助 DolphinDB database 内置的quadprog函数,对各因子权重进行均值方差优化,从而确定更优的因子配置权重。
当本系列二中的脚本运行结束后,数据表factorPnl中会保存每个因子在每日维度上的收益数据。下面的脚本即基于数据表factorPnl进行计算。
retMatrix=matrix(select C0, C1, C2, C3 from factorPnl)
H = cross(covar, retMatrix, retMatrix)
f=-0.25*each(a vg, retMatrix)
A=-(1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 $4:4)
b=-0.1*1 1 1 1
Aeq=matrix([1],[1],[1],[1])
beq=[1]
result=quadprog(H, f, A, b, Aeq, beq)
result[1] 这段代码求解的是如下优化问题:

这里的目标函数被设定为最大化(1/4 × 期望收益 - 1/2 × 方差),同时满足以下约束条件:四个因子的权重之和等于 1,且每个因子的最低权重为 10%。其中,H表示四个因子收益率的方差-协方差矩阵。需要特别说明的是,H、A 和 Aeq 必须是列数一致的矩阵;f、b 和 beq 则必须为向量。A采用负单位矩阵,并与b共同约束,以确保每个因子的权重不低于 10%。如需了解quadprog函数的更多细节,可查阅 DolphinDB 用户开发文档中关于quadprog的说明。
result[1]返回的是在上述优化约束下得到的最优因子权重。结果如下:
[0.3612, 0.1, 0.438804, 0.1] 在本系列二提供的脚本中,
signalNames = `signal_mom`signal_vol`signal_beta`signal_size 因此,对应的最优权重分别为:动量因子 36.1%,波动率因子 10%,beta 因子 43.9%,市值因子 10%。
上述计算使用的是全部历史区间的数据。若希望基于最近 10 年的数据进行均值方差优化,只需将以上脚本第一行修改为:
retMatrix=matrix(select C0, C1, C2, C3 from factorPnl where date>=2007.01.01) 结果如下:
[0.19277, 0.1, 0.1, 0.60723] 由此可得,新的最优因子权重为:动量因子 19.3%,波动率因子 10%,beta 因子 10%,市值因子 60.7%。
这也说明,在进行均值方差优化和多因子权重配置时,所选历史样本区间会对最终结果产生显著影响。
