ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

量子投资组合优化:从巴菲特理念到QUBO建模实战

量子投资组合优化:从巴菲特理念到QUBO建模实战 这几年我一直在琢磨一件事巴菲特的资本配置艺术能不能拆解成一套可计算、可回测、甚至可以用量子计算加速的方法说实话最初这只是我给自己找的“跨领域练手项目”但折腾下来发现这还真不是玩概念——把“能力圈”、“集中下注”、“安全边际”这些听起来很感性的东西翻译成目标函数与约束条件之后投资组合优化这个老问题会呈现出完全不同的层次。这篇文章我就围绕“量子投资组合优化”这个核心记录一下我从巴菲特理念到QUBO建模、再到量子采样实测的完整实操路径也希望给同时关注投资和量化技术的人一些可参考的细节。我先把结论放在前面巴菲特式的资本配置在数学本质上就是一个带约束的高维优化问题。传统的均值-方差框架只能解决其中一部分一旦涉及整数手数、行业上限、交易成本复杂度就迅速上升到传统优化器很难啃动的地步。量子投资组合优化恰恰是在这个位置切入的——用一种新的计算范式寻找更合适的组合权重。但这不意味着你明天就能用量子计算机选出一千只股票的最佳组合现阶段真正有用的是“混合量子经典”的思路经典预处理 量子退火或QAOA采样 经典后处理。下面我把整个思考过程、建模方法、代码示例和踩过的坑一次讲清楚。1. 把巴菲特的资本配置翻译成优化问题1.1 能力圈、安全边际与目标函数巴菲特的投资体系里最核心的不是预测市场而是“资本配置”在有限的资金约束下把资本分配到你最有把握、预期回报和风险最平衡的资产上。这句话翻译成量化语言就是一组目标函数和约束条件。先说目标函数。通常在投资组合优化里我们用组合的期望收益作为“真实的长期回报”用组合收益率方差/波动率作为“风险”。巴菲特的“安全边际”映射到数学上就是对估值极端偏离和下行风险的惩罚项“能力圈”映射到约束上就是限制你只能投“你能看懂”的行业、标的数量上限和集中度要求。你看这些听起来很哲学的词其实都能写成数学等式。一个最基础但很有代表性的优化目标可以这样写$$\min_{x} \quad x^T \Sigma x - \lambda \cdot \mu^T x$$其中$x$是资产权重向量$\Sigma$是资产收益率的协方差矩阵$\mu$是预期收益向量$\lambda$是你愿意用多高风险换取收益的风险厌恶系数。巴菲特式的配置本质就是一个$\lambda$设置得相对稳健、同时又带着集中度约束的均值-方差优化。1.2 从“感觉不错”到“可计算”的约束很多人觉得巴菲特的投资靠眼光和判断没法量化。我实践下来发现恰恰相反他的很多理念可以变成非常清晰的约束条件。集中投资组合中前五大持仓权重不低于某一比例或者持有标的总数不超过某一数量。行业限制单一行业占比不超过总仓位的30%这是很多机构的风控红线。最低波动组合预计波动率不超某阈值这直接替换掉“不想晚上睡不着”的判断。换手限制单期买卖的总成本不超预算防止频繁交易侵蚀收益。这些约束如果只用连续变量二次规划也能做。但一旦要求例如“某个标的要么不持有要么至少持有3%仓位”就引入了0/1整数变量——这时问题就从凸优化跳到了组合优化。你别小看这个转变它会把问题复杂度直接推到一个传统求解器难以保证全局最优的级别。1.3 为什么需要量子这类新工具传统投资组合优化不是不能用而是“规模上去了求解体验直线下降”。我们合作过的资产池从二十只标的一路增加到两百只加入整数与非线性约束后经典求解器要么卡在局部最优要么计算时间从分钟级变成小时级。量子计算在组合优化领域被认为有潜力的原因在于它可以在特定问题的搜索空间里通过量子叠加态同时评估海量可能解。对投资组合这类“从巨大离散组合中找最优”的问题理论上是可以形成规模化优势的。这里必须说明实际上的量子硬件还远远没到“秒杀经典”的阶段但“量子投资组合优化”这个思路已经具备了真实的工具链和可跑通的代码路径。2. 传统投资组合优化的天花板到底在哪2.1 非凸约束真正让计算机头疼的部分我在第一节提到的整数手数、买整不买零就是一个典型的非凸约束。你想象一下一只股票你要么不买要么至少买100股。这个条件写成数学就是一个整数域约束。整数规划里光是判断最优解就属于NP难题的范畴资产数量一多决策变量从连续变成离散问题规模就爆炸了。更麻烦的是交易成本的引入。交易成本往往包含固定手续费和变动冲击成本它不是线性的也不是简单的二次型。如果你同时引入“单笔最小买卖量”和“总交易金额上限”经典优化模型就变成一个混合整数非线性规划MINLP。这种问题的求解经典算法大多依赖启发式或者分支定界但分支定界在变量增多时分支的数量增长极快动辄几百万节点跑起来极其痛苦。2.2 协方差矩阵估计与回测困境别以为约束够简单就能高枕无忧。均值-方差模型里协方差矩阵的估计本身就是一个坑。两百只股票协方差矩阵里有几万个参数用历史数据估计样本长度不够时矩阵可能不稳定甚至不正定。传统优化器在遇到非正定矩阵时优化过程会陷入数值振荡结果就是组合权重在极值间来回横跳——这也就是为什么很多人回测做得很漂亮实盘一跑就崩。我实际处理时通常用一个很土但有效的方法对协方差矩阵做“收缩估计”shrinkage把它向对角矩阵方向拉一点提升数值稳定性。但即使这样求解器在高维场景下依然吃力。量子优化虽然不能直接帮你把协方差矩阵估得更准但它在“给定矩阵后快速搜索更优组合”这一点上确实提供了另一条值得测试的路。2.3 经典优化器的“两堵墙”最后总结一下经典优化器的两堵墙。第一堵墙是“维数灾难”。资产数量从20到200整数变量从20到200组合搜索空间是2的200次方量级经典遍历完全不可能。第二堵墙是“非凸性”。一旦有行业上限、最小仓位、最小交易单位等约束目标函数就不再是凸的经典算法很容易陷入局部最优。我这样说并不是贬低传统工具——事实上在我整套量子投资组合优化流程里经典求解器依然承担着“基线验证”与“后处理优化”的重要作用。只是你要明白真正想模仿巴菲特那样“几十年不换持仓、只做重大决策”的思路你必须能在极端的组合约束下找到大致全局最优这时候单靠老一套确实吃力。3. 量子投资组合优化从一个QUBO模型开始3.1 量子退火、QUBO与投资组合量子投资组合优化的说法很多但真正落地的主流方式是把组合优化问题写成QUBO形式Quadratic Unconstrained Binary Optimization二次无约束二值优化然后交给量子退火机或者门模型的QAOA算法处理。QUBO的目标形式是所有问题都可统一的模板$$\min_{x_i \in {0,1}} \quad \sum_{i} a_i x_i \sum_{ij} b_{ij} x_i x_j$$这里的$x_i$是二值决策变量。对投资组合来说$x_i1$表示买入并持有第$i$个资产$x_i0$表示不持有。$a_i$是持有资产的收益相关项比如预期收益不过符号要取负$b_{ij}$是资产$i$与资产$j$的风险相关项来自协方差矩阵。QUBO的含义就是找到一组0/1取值让总代价最小。你可能想问巴菲特不是讲长期持有吗怎么变成0/1了这里的关键是在实际建模时我们往往会加一个“目标持仓数量”约束然后用离散化方法把连续权重近似成整数再用多层二值变量表达“某只股票持有几手”。这一步做完整个组合决策就能完全落入QUBO框架进而扔到量子硬件上求解。3.2 把巴菲特理念写进惩罚项QUBO最大的好处是“无约束”原有的约束都可以变成惩罚项。这一下就和巴菲特的投资原则对上了。我实际使用的目标函数框架长这样$$\min \quad \lambda_1 \cdot \text{risk} - \lambda_2 \cdot \text{return} \lambda_3 \cdot \text{concentration} \lambda_4 \cdot \text{penalty}$$其中第一项是组合风险用$x^T \Sigma x$表示第二项是组合预期收益第三项是集中度/行业限制相关项第四项是“组合里资产数量恰好等于设定值”的惩罚。用权重参数$\lambda$配置就能分别调出“巴菲特式”和“激进式”两种风格。举个例子如果我想体现巴菲特的“能力圈”原则——只能选自己真正理解行业的公司那么我会在QUBO里加入一个行业二值变量约束选出的股票所属行业数不能超过3个。这个约束翻译成惩罚项后量子求解器会自动避免“跨太多行业”的组合。这个方法我亲测有效实测输出结果比不带行业惩罚的模型要稳健得多回撤也更小。3.3 实操代码示例用Python构建并求解一个小型组合这里我给你看一个可运行的简化版流程目标是从10只候选ETF中选出5只让风险尽可能小、收益尽可能高同时满足“只允许有3个行业暴露”的惩罚约束。这个例子可以直接在本地经典模拟器上验证跑通了再考虑上真实量子硬件。import numpy as np import dimod # 候选资产数量 n 10 # 预期收益率虚构数据仅示例 mu np.array([0.12, 0.08, 0.10, 0.15, 0.07, 0.11, 0.09, 0.13, 0.06, 0.10]) # 协方差矩阵随机生成一个半正定矩阵 np.random.seed(42) A np.random.randn(n, n) Sigma A.T A np.eye(n) * 0.05 # 目标持仓数量 K 5 # lambda 参数 lambda_return 1.0 lambda_risk 2.0 lambda_count 5.0 # 初始化 QUBO 矩阵 Q Q np.zeros((n, n)) # 风险项: x^T Sigma x Q lambda_risk * Sigma # 收益项最小化所以要加负号: - lambda_return * mu^T x np.fill_diagonal(Q, np.diag(Q) - lambda_return * mu) # 数量约束惩罚: (sum(x) - K)^2 sum_i x_i 2*sum_{ij} x_i x_j K^2 (常数忽略) for i in range(n): Q[i, i] lambda_count * (1 - 2 * K) for j in range(i 1, n): Q[i, j] lambda_count * 2 Q[j, i] lambda_count * 2 # 转换为 dimod BinaryQuadraticModel 并采样 bqm dimod.BinaryQuadraticModel.from_qubo(Q) sampler dimod.ExactSolver() # 经典模拟器 sampleset sampler.sample(bqm, num_reads100) # 输出能量最低的解 best sampleset.first.sample selected [i for i in range(n) if best[i] 1] print(选中的资产序号, selected)这段代码看起来很朴素但它已经实现了三个核心动作构建QUBO矩阵、把约束写成惩罚项、调用求解器采样。如果你换成dwave.system.EmbeddingComposite(DWaveSampler())在配好环境并填入API token后就能把bqm提交到真正的量子退火机。差别主要在采样器和后端配置上建模逻辑完全一致。3.4 参数细调的几点心得用下来我发现QUBO里最讲究的是$\lambda$的取值。我踩过的最典型坑是数量约束的惩罚系数设得太大结果量子退火只顾及“数量正好5只”完全忽略了收益和风险。反过来的情况也有——惩罚系数太小选出来的组合是7只而不是5只。我目前的经验法则是先把收益项和风险项归一化让它们落在0到1之间再把数量约束的惩罚系数设成这两项最大量级的三到五倍。这样既能保证目标数量成立又不会压制收益风险信息。你如果跑上面的代码可以发现当lambda_count从5降到1时输出组合的数量明显开始偏移这就是没有“配平”惩罚项的表现。另外一个细节协方差矩阵在填入QUBO之前建议做一下缩放。量子退火的能量范围是受硬件比特精度的限制数值太大会出现采样不稳定。我一般把矩阵除以一个常数让最大元素在50以内这在D-Wave上跑出来的结果比不缩放稳定很多。4. 常见问题与评测实录量子优化不是魔法4.1 为什么我跑的“量子优化”结果和经典差不多这个现象我一开始也很失望。后来想通了小规模的组合优化问题经典暴力搜索或精确求解器本来就能在毫秒级找到最优解量子退火在10只股票的场景下没有优势。不要拿小玩具测试来证明量子投资组合优化的价值必须把规模拉到经典求解器明显感到压力的地方比如50只以上资产且带三四个硬约束再对比效果。我推荐一个组合对比方法同一份数据先让经典模拟器比如dimod.ExactSolver或Gurobi算一个结果再用量子模拟器比如SimulatedAnnealingSampler重复采样几十次比较最优能量和采样到最优的次数比例。如果你的QUBO建模正确量子模拟器在50资产级别上通常能在接近最优的值附近得到一批多样化候选组合经典精确求解器虽然能给出唯一最优解但耗时会开始急剧增加。4.2 硬件噪声与采样偏差真实量子硬件有一个很现实的问题噪声。量子退火机采样的样本不是全部可靠的偶尔会给出明显偏高能量的样本。处理办法是不要让量子硬件直接给你“一个答案”而是让它给你“一批候选答案”再用经典求解器或者人工规则筛选。这个“量子给出候选、经典做校验”的流程目前业界大概也是这么实践下来的。实操上我会设置num_reads1000然后看能量分布。如果90%的样本能量都很低说明问题建模和硬件运行状态都很好如果样本能量像散弹一样分布那就是硬件噪声偏大或惩罚系数失配。前者可以放心的继续把候选答案往上提交后者就要回去调QUBO或换嵌入参数。4.3 回测的想法、现实与偏见做这个项目前我以为传说中的量子优势会体现在“更好的回测曲线”。做完后我的看法反而变了量子投资组合优化的价值不在于拿到一条更漂亮的收益曲线而在于它在同等风险约束下更容易发现那些经典优化器因为搜索空间太大而漏掉的“非直观组合”。巴菲特的超额收益源于他敢在别人不敢下注的极端低估时刻集中持仓这种组合在传统风险模型里往往会被当作“离群解”剔掉。量子退火不会像经典优化器那样提前剪枝它有机会把这类被忽略的候选组合保留下来。我当然不认为量子优化能直接教你“什么时候买入可口可乐”但它至少给了我们一种工具让组合解空间里的极端候选组合更容易浮出水面再由人手或经典风控规则来决策。4.4 实操避坑清单供现在复现我整理了一下自己至少踩过一次的坑一共六条忽略QUBO元素的范围直接把协方差矩阵原始数值填进去导致硬件精度不足结果几乎随机。惩罚系数拍脑袋没有做归一化就随手设系数结果输出组合数与目标值偏离明显。用经典精确求解器评估量子结果小规模比较没什么意义要用大规模非凸案例做对比。忘了嵌入参数在D-Wave上直接提交未经过嵌入优化的BQM物理量子比特数与逻辑变量冲突。只做单次采样量子硬件带噪声至少跑几千次再统计样本分布。回测到实盘跳变量子给出的候选组合如果和回测组合差异很大大概率是约束没有全覆盖重新检查每个惩罚项。5. 这篇文章的实用工具箱与推荐路径5.1 一套可以直接上手的开源工具链我日常用到的量子投资组合优化相关工具整理成表格供你参考。工具/库用途适用阶段dimodQUBO建模与本地采样入门与验证建模思路是否通顺dwave-system连接D-Wave量子退火机在真实的量子硬件上运行QUBOqiskit-optimizationQAOA等门模型优化算法IBM量子平台和模拟器pandas/numpy数据处理与协方差矩阵构建任何一个组合优化项目的前置准备cvxpy经典凸优化基准解对比量子结果与经典最优解的差距这些工具全部有公开文档社区的示例代码也很多。我的体验是前两周先用dimod的模拟退火器把QUBO建模练熟再决定是否需要接触真实硬件。很多传统量化背景的人会低估“建模”这一步的难度实际上建模的质量决定了量子计算能不能发挥优势。5.2 一个适合新手复现的“最小可行案例”如果你看完第3节的代码仍然觉得有些抽象我建议你做一个5只股票、选3只的最小案例使用真实美股或A股最近一年的收益率数据或者干脆用随机数据。预期收益向量和协方差矩阵先用pandas算好。只放两个约束组合数量恰好等于3单只股票上限不超过50%仓位。先从经典模拟器跑再把同一份QUBO换到量子上跑比较输出组合。我用这个最小案例带过三个同事上手平均半天就能跑通全流程。一旦建模跑通后面的行业暴露、交易成本、最小交易单位都是在QUBO里加项或改惩罚系数而已不会有结构性困难。5.3 量子投资组合优化的三个阶段预判站在从业者的角度看这个方向未来会经历三个阶段。第一阶段现在混合方案为主量子在部分环节提供加速采样经典负责验证和风控。 第二阶段不远的将来量子误差缓解与纠错技术提升更多非凸约束可以放心交给量子后端。 第三阶段更长远量子证明在某些大规模组合优化任务上具备压倒性优势投资机构把量子模块嵌入日常决策系统。眼下我比较推荐的做法不是等硬件成熟而是先把QUBO建模能力练熟把一个又一个风控约束翻译成惩罚项。这样无论后端用什么硬件你的框架都不会轻易过时。最后分享一点我的实际操作体会做这个项目之前我以为最难的是量子理论做完之后发现最难的是“把投资语言翻译成约束和目标函数”。巴菲特说自己一辈子只做少数决策这背后不是懒惰是对约束条件的极致挑剔。量子投资组合优化给我的启发在于——与其绞尽脑汁预测未来不如把精力放在定义清楚“什么样的组合才是好组合”上。约束写好了无论用经典优化器还是量子退火模型的稳定性和可解释性都会上一个台阶。另外如果你打算在这个方向继续走有一个很小的建议尝试把组合优化问题写成QUBO即使不用量子硬件只用经典模拟器也能在构造“备选组合集合”这件事上收获不小。最终替换经典优化器的那一步可能还需要很长时间但把问题结构理清楚这件事现在就可以开始。
返回列表