新闻详情

新闻详情

首页 / 资讯中心 / 详情

量子投资组合优化实战:从巴菲特式集中持仓到QUBO模型

发布时间:2026/10/1 3:11:50来源:尧图网络
量子投资组合优化实战:从巴菲特式集中持仓到QUBO模型
把巴菲特和量子投资组合优化放进同一个句子里乍看像是一个跨服聊天现场。但如果你把巴菲特过去几十年的资本配置决策摊开看会发现那本质上是一长串组合优化问题的高质量解在几十只候选标的中选哪些、每只配多少、最多押几只、留多少现金缓冲。这些问题一旦写成数学约束就变成带整数变量的二次优化。而这类问题恰恰是量子退火最常被研究的应用场景。这篇文章想聊的不是量子马上要取代主观投资这种浮夸叙事而是巴菲特式配置原则如何转译成可计算的组合优化模型QUBO矩阵怎么搭、惩罚项怎么调、现阶段量子硬件的限制在哪儿以及跑出来的权重又如何回到长期主义的校验框架里。适合对量化投资感兴趣的基金经理助理、量化研究员以及想给传统组合管理流程引入新工具的工程师参考。1. 巴菲特式配置的内在数学集中持仓如何变成约束1.1 从少而精到基数约束巴菲特式集中的数学实质巴菲特有句流传很广的话大意是分散化是保护无知的手段。这句话放到现代组合理论的坐标系里几乎是在和马克维茨唱反调。马克维茨的均值-方差框架默认把所有风险资产都装进一个篮子里再用协方差矩阵把相关性摊平巴菲特则把注意力压到极少数标的上用深度的企业基本面理解来抵消集中持仓带来的波动。但这两种思路并非水火不容。关键分歧只在于马克维茨模型没有约束持仓数量所以它天然鼓励分散而巴菲特的实践在数学上等价于给优化问题加了一条最多持有k只股票的约束。这条约束在学术上有一个非常明确的名字基数约束cardinality constraint。把均值-方差模型改写一下就清楚了。假设你有一个候选股票池共n只标的权重向量为w预期收益向量为μ协方差矩阵为Σ那么经典配置问题写作min wᵀΣw - λμᵀw s.t. Σᵢwᵢ 1, 0 ≤ wᵢ ≤ 1如果加入最多选k只股票的限制优化问题会变成min wᵀΣw - λμᵀw s.t. Σᵢwᵢ 1, ‖w‖₀ ≤ k, 0 ≤ wᵢ ≤ 1其中‖w‖₀表示权重向量中非零元素的数量。‖w‖₀ ≤ k看起来只比原来多了一个小小条件但它把问题从连续的二次规划QP变成了混合整数二次规划MIQP。n只有几十只时经典分支定界法还能扛得住当n扩展到几百只、还叠加行业暴露限制、单票上限、换手惩罚时求解规模会迅速膨胀。这就是量子投资组合优化出现的直接理由退火设备天然处理二进制离散变量而买或不买恰恰就是0/1决策。把整数变量映射成量子比特的取值是对偶问题天然吸引人的地方。1.2 能力圈与安全边际进优化器之前发生了什么很多人讨论巴菲特时只盯着集中持仓这个结果忽略了他做配置前先做的一次重要操作把不符合能力圈的标的直接剔除出股票池。这一步过滤器本质上是在给优化器划定可行域。能力圈在数学上的体现不是权重而是资产池的准入条件。你的模型可以在几百个变量上寻找最优加权但如果池子里混入了你完全不了解的公司优化器并不会替你识别风险它只会找出数学意义上的最优解。这一点常被量化新手忽略——他们花大量时间折腾优化器参数却对输入端的资产质量不做任何审查。安全边际则需要翻译成期望收益的取值方式。巴菲特的习惯是不依赖精确预测来买股票而是要求价格比内在价值有明显折让。在组合优化模型里这对应的操作是对每只股票的预期收益率μᵢ打一个审慎的折扣而不是把卖方一致预期直接填进去。你可以把它理解成参数对冲——让μ值偏保守模型给出的权重才不容易因为预测偏差而崩坏。所以到这里可以总结一个判断巴菲特式配置的数学本质是带约束的二次优化。这个约束包括基数上限、单票上限、能力圈过滤后的股票池、以及打折后的预期收益。剩下的问题是怎么把这些约束和偏好装进一个量子计算能处理的模型里去。2. 量子投资组合优化的QUBO建模把偏好写成矩阵2.1 为什么量子退火恰好适合离散配置问题量子投资组合优化这个词最近在金融科技圈变得很热但真正把它落到模型层面核心就一句话把组合优化问题转化成QUBOQuadratic Unconstrained Binary Optimization形式然后交给退火设备或者模拟器去搜索低能量状态。QUBO的标准形式长这样H(x) Σᵢ qᵢxᵢ Σᵢⱼ Qᵢⱼxᵢxⱼ其中xᵢ是二进制变量取值0或1。二次项的系数构成矩阵Q线性项可以放在Q的对角线上。整个问题的目标是找到一组二进制取值使得能量函数H最小。为什么连续梯度下降那一套经典优化方法在这里不太行因为权重配置里的选哪几只是离散跳变的。你在连续空间里求导、做梯度下降得到的是一个接近满仓分散的解而不是只押3只的稀疏解。退火设备不一样它用二进制变量直接做搜索天然适合处理这种组合爆炸问题。实际建模时想把组合优化翻译成QUBO最常用的路线是把权重离散化每只股票的权重不是任意的连续实数而是一个可选档位集合。档位可以是0、5%、10%、20%甚至更高。每一档对应一个二进制变量优化器要做的是在这些档位里选出一组组合满足满仓约束和持仓数量约束。2.2 QUBO矩阵的构造与惩罚项调参逻辑我们把前面的均值-方差框架改写成QUBO。假设wᵢ是一段连续的权重但每个股票只能从若干离散档位里取一个值。于是组合优化的能量函数可以写成H(w) (1/2)wᵀΣw - λμᵀw ρ(Σᵢwᵢ - 1)² κ(‖z‖₀ - k)²逐个解释这些项第一项是风险项它让模型回避高方差和高相关的组合。第二项是收益项λ是风险厌恶系数λ越高模型越激进。第三项是满仓惩罚项逼着所有权重之和逼近1。第四项是基数惩罚项z是每只股票的持仓标志向量这一顶强逼优化器把非零持仓的数量压到k附近。具体到QUBO矩阵上每个位置上的系数是这么来的如果股票i和股票i′的权重都是二进制变量的线性表达那么协方差Σᵢᵢ′乘以这两个权重表达后会展开成一组二进制变量的二次项这些二次项的系数就填进Q矩阵的对应位置。同理收益项展开后产生线性项系数。满仓惩罚和基数惩罚展开后各自贡献一批二次项和线性项。这里面最容易被低估的是惩罚参数的选择。ρ和κ的目标是让约束被满足但它们不能无限大。第一量子硬件或者模拟器上的数值精度有限惩罚项太大时约束项的数值会淹没真正的风险收益信息导致模型只记得遵守约束、完全忘了组合质量。第二从物理学角度看过大的惩罚会拉高能量标度退火过程容易出现能量势垒过陡、隧穿失效的问题。我自己的做法是参考解校准法先用经典求解器跑一个简化模型拿到一个可行的连续解看看这个解在目标函数各项上的数量级然后设置ρ和κ使惩罚项数值是目标项数值的10到100倍最后再做一次扫描检测不同惩罚系数下合法解的比例。2.3 权重编码与离散精度权重从连续值变成离散档位具体怎么做最直接的是one-hot编码给每只股票定义m个档位设v₁,v₂,...,vₘ是允许的权重值再把选第j档映射为二进制变量xᵢⱼ1。于是股票i的权重可以写成wᵢ Σⱼ vⱼxᵢⱼ强制每只股票必须恰好选一个档位需要加入one-hot约束Σⱼxᵢⱼ 1。这个约束在QUBO里也是用惩罚项实现的系数可以合并进建设好的矩阵里。如果该股票可以完全不持仓那么档位集合里要包含0这一档。档位粒度的选择值得多说一句。粒度越细变量越多QUBO规模越大粒度太粗又可能找不到合规的满仓组合。比如你只允许5%、10%、15%和20%四档但股票池只有6只股票20%×6最多120%可以满仓问题不大但如果要求最多持仓3只每只最高只有20%满仓就根本做不到优化器只能返回一个非法解。所以在设计档位的时候一定要先确认最极端的约束场景是否可达。这是一个我在早期实验中踩过的坑花了半天调参数最后发现是档位上限设计得太保守根本不存在可行解。3. 量子退火实战从QUBO到可执行持仓的完整流程3.1 最小可复现案例设计理论讲完之后最重要的是能跑通一个端到端的流程。我以一个示意性的小案例为例股票池8只标的历史日收益率数据目标是选最多3只标的权重档位设置为0、10%、30%、60%四档满仓约束严格等于1。为什么选8只、4档这么小的规模因为QUBO变量数大约等于8×432个二进制变量在本地模拟器上可以快速调试又能完整走一遍从建模、采样到解码的流程。做量化研究有个原则先在最小规模上验证全部约束和代码逻辑再放大量级。直接拿几百只股票的池子上量子硬件出了问题你根本分不清是建模错误还是硬件噪声。案例中使用的历史收益向量和协方差矩阵都是随机生成的示意数据但这不影响流程演示。关键点是真实的预期收益估计和协方差估计应该来自可靠的统计模型比如用Ledoit-Wolf收缩估计来做协方差去噪。3.2 构建QUBO矩阵的Python核心代码我用Python和dimod库来实现。核心逻辑是遍历所有股票对、所有档位对把协方差项、收益项、满仓惩罚和基数惩罚展开成QUBO系数。对刚接触QUBO的人我建议先不要用自动转化工具自己手写一遍系数展开能帮你建立起对Q矩阵结构的直觉。from collections import defaultdict def build_qubo(mu, cov, lam0.8, rho600.0, kappa900.0, k3, values(0, 0.1, 0.3, 0.6)): n len(mu) # 股票数量 m len(values) # 档位数量 Q defaultdict(float) def flat(i, j): return i * m j # 把二维变量映射成一维索引 # 1) 风险项和收益项 for i in range(n): for j in range(m): # 收益项线性系数 Q[(flat(i, j), flat(i, j))] -lam * mu[i] * values[j] for ip in range(n): for jp in range(m): coeff cov[i][ip] * values[j] * values[jp] Q[(flat(i, j), flat(ip, jp))] coeff # 2) 满仓惩罚项 rho * (sum(w) - 1)^2 # 展开: rho * (sum(w)^2 - 2*sum(w) 1), 常数项在优化时省略 for i in range(n): for j in range(m): for ip in range(n): for jp in range(m): Q[(flat(i, j), flat(ip, jp))] rho * values[j] * values[jp] Q[(flat(i, j), flat(i, j))] -2.0 * rho * values[j] # 3) 基数惩罚项 kappa * (count_nonzero - k)^2 # 每只股票持仓标志: z_i sum_j x_ij (values[j] 0) # 但更稳的做法是显式展开系数简化展示省略详细展开 for i in range(n): for j in range(m): if values[j] 0: Q[(flat(i, j), flat(i, j))] -2.0 * kappa * k for ip in range(n): for jp in range(m): if values[jp] 0: Q[(flat(i, j), flat(ip, jp))] kappa return dict(Q) # 然后转成dimod三模型并采样 import dimod mu [0.0012, 0.0008, 0.0015, 0.0010, 0.0009, 0.0014, 0.0011, 0.0013] cov [[0.0004 if i j else 0.0001 for j in range(8)] for i in range(8)] Q build_qubo(mu, cov) bqm dimod.BinaryQuadraticModel.from_qubo(Q) sampler dimod.SimulatedAnnealingSampler() sampleset sampler.sample(bqm, num_reads2000)这段代码里的成分并不复杂但有几个细节值得注意风险项展开时对角线元素产生了二次变量和自身的交互实际QUBO中x_{i,j}²等于x_{i,j}所以程序运行时会自动落入线性项满仓惩罚里的常数项1在优化过程中不影响变量取值可以直接忽略。初次运行可能会发现解不满足每只股票只选一档的one-hot约束因为我在代码里没有显式加入one-hot惩罚。这在实际建模中是必须的。通常做法是再加一项γΣᵢ(Σⱼxᵢⱼ-1)²γ设置为比风险和收益项高一个数量级。我在示例里有意省略是想让读者意识到约束项不齐全会出现什么结果——你会得到一个权重表达混乱的非法组合。3.3 采样、解码与结果有效性检查拿到采样结果后第一步不是看收益而是检查可行性。我通常按这个顺序做事先取能量最低的前100个样本逐个检查满仓误差、持仓数量、one-hot合法性和单票权重上限是否合规统计可行样本占比。如果占比低于90%说明惩罚参数太弱需要调高ρ、κ或γ如果占比很高但目标函数值比经典解差太多说明惩罚参数过强把目标项压扁了。解码权重时把每个变量按档位取值还原。例如某只股票在最低能量样本中non-zero档位是第2档取值30%那这只股票的权重就是0.3。全部解码之后再求和检查满仓。有一种常见误解是能量最低的样本就是最好答案。实际中因为惩罚项和目标项的量级不同最低能量样本往往来自惩罚项未被满足的局部极小值。所以我的习惯是把最低能量的50个样本都解码看它们的解是否稳定收敛到同一个组合。如果排名前几的样本频繁出现完全不同的持仓组合说明问题本身的惩罚不够强模型正处于目标函数不平坦的状态。这时候再去调风险厌恶系数λ出来的权重往往会大相径庭。这个环节也是一台真正的信心考验机。很多人跑通流程后会直接相信模型的输出而我更建议先人工复核一下模型选出的组合是否让你自己觉得安心若某个重仓标的你连业务模式都讲不清楚那不是模型错了而是资产池筛选环节出了问题。回到巴菲特的能力圈原则优化器永远无法替你补上认知短板。4. 经典求解器的降维打击量子硬件的真实边界4.1 诚实的现状几十个变量之外的噪声困境在把量子投资组合优化推向真实市场之前有必要先把聚光灯转向硬件限制。量子退火设备目前能处理的QUBO规模并不大原因有三个。第一是量子比特数量与连接度的限制。以超导量子退火设备为例比特之间的连接不是全连接的而是受物理拓扑约束的。一个结构稀疏的Q矩阵往往会因为嵌入问题被迫复制变量、消耗大量额外比特实际可嵌入的问题规模远低于标称比特数。第二是精度问题。QUBO系数在硬件上需要被转换成模拟信号的耦合强度而硬件自身有噪声和校准误差。惩罚系数一旦超过某个量级硬件给出的结果甚至会与模拟器产生显著偏差。我的经验是当你看到某些论文里为了强行满足约束把惩罚项设成1e6量级时就要对结果的可靠性打一个大问号。第三是采样质量。退火设备的一次运行只能得到一次近似采样你需要大量重复采样再统计分布。对金融场景来说这个问题还叠加了矩阵本身的病态性协方差矩阵估计误差一旦偏大QUBO结果会比经典求解器更敏感因为能量面的局部极小值非常不稳定。4.2 为什么经典优化器在数千变量上依然碾压这里说句可能不少人不太爱听的话对绝大多数现实中的组合优化问题经典求解器仍然是当前的最优选择。Gurobi、MOSEK这类成熟的MIQP求解器处理两三千个变量、几十条约束的配置问题往往能在秒级到分钟级给出相当好的可行解。相比之下纯量子退火硬件在处理同样规模时单是嵌入步骤就可能失败。为什么会这样经典分支定界法在过去几十年积累了大量启发式剪枝技术对稀疏的金融问题非常有效。而金融场景中的投资组合优化矩阵通常并不具备量子优势所需的特殊结构。许多科技新闻里宣传的量子加速往往只在极端合成数据下成立且忽略了端到端流程中问题传输、嵌入和采样后处理的巨大开销。一个明确的判断是现阶段纯量子硬件适合研究和小规模验证真正进入生产环境时混合架构比纯量子架构务实的多。4.3 混合解算器当前真正可落地的路线混合解算器的思路很简单让经典计算机处理大规模、结构良好的那部分问题把最棘手的离散子问题交给量子处理器。这种模式在D-Wave的Leap平台上已经运行多年用户体验就是提交一个QUBO或CQMConstrained Quadratic Model云端自动调度经典和量子资源。对于个人研究者和中小型团队这是最推荐的路线。你不需要关心比特拓扑、嵌入细节只要把QUBO写清楚设置好超时时间就能拿到一组不错的候选解。我在自己的实验里用200只股票、每只8个权重档位变量数大约1600个纯QPU在嵌入阶段就卡住了同样的模型提交给混合求解器几十秒内返回了质量尚可的解。但混合求解器也非万能。它仍然要求你把问题完整地表达成QUBO或CQM惩罚参数的选择依然会影响结果质量。这意味着即使你使用了混合求解器前面章节里的调参经验、可行性检查流程一个都不能省。工具变了工程纪律不能变。5. 结果解读与动态化向长期主义的回归5.1 单期模型的局限跨期稳定比单次最优更重要量子投资组合优化跑出来的结果天然是一次单期快照。它告诉你在当前给定参数下最优的持仓结构长什么样。但巴菲特式配置强调的恰恰是跨期持有的耐心而不是在每个时点都追求静态最优。单期模型的常见问题是换一个月的收益率样本最优组合可能剧烈变化。今天模型说该重仓A和B下个月可能就换成C和D。如果直接照做交易成本会吃掉大部分超额收益而且组合缺乏延续性。这种波动本身不是量子优化器的缺陷而是均值-方差框架对参数估计过于敏感的老问题。应对办法是在QUBO里直接加入换手惩罚。记上一期权重为w₀当期权重为w在目标函数里增加一项γ‖w - w₀‖²惩罚偏离上一期持仓的组合。这一项同样是二次的可以无缝并入Q矩阵。引入换手惩罚后模型输出的权重会天然向上一期组合靠拢只有在新数据提供的预期收益和风险改善足够大时才愿意改变仓位。这其实和长期持有、只在逻辑变化时调整的投资纪律非常吻合。5.2 把持有期与稳定性放进同一套管道如果你想把这套流程做成一个真正的决策支持系统建议做三件事。第一把资产池筛选前置成一个独立模块。用基本面指标做粗筛比如连续多年ROIC高于阈值、资产负债率低于某个门槛、管理层持股比例不低于某个比例。筛完之后再把通过的标的送进量子组合优化器。这个能力圈编码步骤比任何优化参数都重要。第二对λ和k做walk-forward敏感性分析。不要拍脑袋定风险厌恶系数和持仓数量上界而是把历史数据切成滚动窗口回测不同参数组合下的组合表现看哪些参数在跨周期时依然稳定。第三把模型的输出当作决策支持和对抗性核查工具而不是直接下单的自动交易信号。我个人的工作习惯是拿到优化器的权重后要求自己对每一个重仓标的写出一句话解释。解释不清楚就删掉手动替换成下一个有把握的标的。这个看似违背优化器的操作恰恰是能力圈在最终决策环节的落定。5.3 权重是结果资产池质量才是起点用数学语言讲QUBO优化器解决的是给定候选集时的最优分配问题它不解决候选集本身是否值得买的问题。巴菲特的资本配置艺术最大的权重在输入端他花大量时间阅读、调研、筛选最后把一个上百只股票的投资宇宙压成他真正理解的十来个标的。优化器只是在那个已经极度压缩的可行域里做最后的权重分配。对于想把量子投资组合优化用起来的读者我最想传达的一点是不要把模型当成预测机器把它当成约束求解器。它擅长的是在你做清楚所有偏好约束之后找到一组符合约束的、统计意义上较优的权重但如果你的候选池里塞满了看不懂的高波动标的再好的退火设备也救不了你。我自己在实际操作中的体会是量子优化项目在金融场景中最有价值的产出不是那些权重数字本身而是它逼你把投资哲学写成了数学约束。当你不得不回答我能持有多少只股票哪些东西我坚决不碰我给预期收益打几折这些问题时你的投资框架已经被迫变得异常清晰了。单就这一点这套工作流就值得认真试一次。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Python深度学习股票量化系统:从数据到回测的完整实战 2026/10/1 4:24:19

Python深度学习股票量化系统:从数据到回测的完整实战

简介:这是一套面向高校学生与量化爱好者的股票量化系统完整项目源码,基于Python与深度学习技术实现,涵盖数据获取、特征工程、模型训练、策略回测及可视化展示等环节,适合用作课程设计、期末大作业或自学量化交易的实战参考。压缩…

阅读更多 →
从RLM到Harness as a Language:Agent代码化与工程化实践 2026/10/1 4:24:19

从RLM到Harness as a Language:Agent代码化与工程化实践

1. 为什么要把 Agent 塞进代码文件里第一次看到"把 Agent 搬进代码里"这个说法,我脑子里冒出来的画面是:以前我们写 Agent,是在某个可视化编排平台里拖拖拽拽,连线、配参数、点保存,然后祈祷它别在运行时崩掉…

阅读更多 →
用好测试文章:时间戳命名与内容发布验证实战指南 2026/10/1 4:24:19

用好测试文章:时间戳命名与内容发布验证实战指南

标题虽然是“测试文章 - 1769241348464”,但往深了说,这类文件名在内容创作和信息管理里几乎是每天都在出现的。我自己也常年和各种“测试文章”“草稿”“副本final”打交道,时间戳版本更是一抓一大把。很多时候大家随手建一个测试文章&…

阅读更多 →
PCA+BP神经网络实战:高维数据分类降维的完整方案 2026/10/1 4:24:19

PCA+BP神经网络实战:高维数据分类降维的完整方案

咱们直接进入正题。我最近在做一批表格类数据的建模任务,发现一个特别值得聊的组合:PCA(主成分分析)加BP神经网络。先说背景。这批数据有三十多个特征,但样本量只有五六百条,典型的“维度高、样本少”的处境…

阅读更多 →
第一次作业不用慌:一套从拆解到交付的完整执行框架 2026/10/1 4:24:18

第一次作业不用慌:一套从拆解到交付的完整执行框架

“第一次作业”这四个字,恐怕是学生时代到职场生涯里,出现频率最高、也最容易让人心里发慌的场景了。我到现在还记得自己交第一份课程论文时的状态:材料下载了十几个,文档打开了一上午,光标在空白页上闪了一整天&#…

阅读更多 →
OpenCV C++图片浏览器源码解析:从CMake配置到图像处理实战 2026/10/1 4:24:12

OpenCV C++图片浏览器源码解析:从CMake配置到图像处理实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉