ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

量子计算与QUBO模型在金融风控组合优化中的应用实践

量子计算与QUBO模型在金融风控组合优化中的应用实践 1. 项目概述当量子计算遇上金融风控去年带队参加MathorCupA题“量子计算机在信用评分卡组合优化中的应用”一出来我们团队几个人的第一反应是既兴奋又有点懵。兴奋的是这个题目精准地踩在了两个前沿领域的交叉点上——金融科技里的经典难题“信用评分卡组合优化”和计算科学里正在从实验室走向应用的“量子计算”。懵的点在于当时市面上关于量子计算实际落地的案例尤其是结合具体业务场景的实在太少了更别说拿来直接做数学建模了。但恰恰是这种“前沿经典”的组合让这道题充满了魅力和挑战。它本质上是在问面对一个在传统计算机上已经被证明是NP-Hard的组合优化问题从海量评分卡里选出一组最优组合我们能否借助量子计算的新范式找到更优、更快的解决方案这不仅仅是套个模型、跑个代码那么简单它要求我们深入理解金融风控的业务逻辑将业务问题精准地“翻译”成量子计算机或量子启发式算法能理解的语言——也就是QUBO模型。整个过程就像是在给两个说不同语言的专业人士做同声传译既要懂金融的“行话”也要懂量子的“语法”。这道题非常适合有一定数学建模基础特别是对优化理论、机器学习有了解并且愿意探索前沿交叉领域的同学。它不要求你真正拥有一台量子计算机实际上比赛时用的也都是模拟器或经典优化器但要求你建立起一套完整的思维框架从业务抽象到模型构建再到算法选择与求解。接下来我就结合我们当时的解题思路和后续的一些思考把这个过程拆开揉碎了讲清楚。2. 问题拆解信用评分卡组合优化的核心与难点在直接讨论量子计算之前我们必须先把传统问题吃透。信用评分卡是银行、消费金融公司用来评估客户违约风险的核心工具。一张评分卡其实就是一套规则系统输入用户的年龄、收入、历史信贷记录等数十个甚至上百个特征变量通过一个逻辑回归或决策树等模型输出一个分数。分数越高客户信用越好违约风险越低。2.1 为什么需要“组合”优化一家金融机构通常不会只使用一张评分卡。原因有三风险维度多元化单一的评分卡可能只侧重某一类风险如欺诈风险、偿债能力风险组合多张卡可以更全面地评估客户。业务场景细化针对不同的产品房贷、车贷、信用卡、不同的客户群体首次借贷者、优质客户可能需要不同的评分策略。效果提升通过组合多张卡的预测结果有望获得比任何单一评分卡都更稳定、更准确的预测性能。那么“组合优化”要优化什么假设我们有一个包含N张候选评分卡的池子。我们的目标是从中选出K张卡KN形成一个“组合”。这个组合需要满足一些业务约束并最大化或最小化某个目标。典型的场景包括约束组合的总成本每张卡可能有采购或使用成本不能超过预算B组合的总体预测精度如AUC必须高于阈值T组合内评分卡之间的相关性不能太高以确保多样性。目标在满足约束的前提下最大化组合的预测性能如AUC或者最小化组合的风险如预期损失。这立刻就把我们带到了一个经典的组合优化问题框架内它本质上是一个带约束的0-1整数规划问题对于每一张评分卡i我们定义一个决策变量x_i∈ {0, 1}x_i1表示选中该卡0表示不选。我们的目标函数和约束都是这些x_i的函数。2.2 传统方法的瓶颈NP-Hard的诅咒这个问题为什么难当N很大时现实中几百上千张候选卡很常见可能的组合数量是C(N, K)这是一个随着N指数级增长的数字。穷举所有可能性在计算上是不可行的属于NP-Hard问题。传统上我们用什么方法贪心算法每次选择当前对目标提升最大、且满足约束的评分卡加入组合。这种方法快但很容易陷入局部最优选出来的组合往往不是全局最好的。遗传算法/模拟退火等元启发式算法这些是数学建模竞赛中的常客。它们通过模拟自然进化或物理退火过程在巨大的解空间中随机搜索有较大可能找到近似最优解。它们的优点是通用性强不需要目标函数有漂亮的数学性质如凸性。但缺点也很明显调参复杂种群大小、变异率、退火速率等收敛速度不确定且无法保证找到的解离真正的最优解有多远。整数规划求解器如Gurobi, CPLEX如果能把问题精确地建模成混合整数线性规划MILP那么对于中等规模的问题这些商业求解器非常强大。但对于大规模、非线性的问题它们同样会面临计算时间过长的问题。注意在构建目标函数时一个关键点是“性能叠加非简单线性”。组合的AUC并不是各评分卡AUC的加权平均。通常需要基于一个验证集用选中的评分卡组合起来对样本进行评分例如取各卡评分的中位数或加权和再计算这个“组合评分”的AUC。这使得目标函数的计算本身就很耗时且是黑箱的、非线性的。正是传统方法在求解质量、效率和确定性上的这些痛点给了新兴计算范式——特别是量子计算——切入的机会。量子计算的核心优势就在于其并行处理指数级数量状态的可能性为这类组合优化问题提供了新的希望。3. 量子计算与QUBO模型问题的“量子化”翻译量子计算不是魔法它不能直接理解我们的业务问题。我们需要一座桥梁将“选择哪些评分卡”这个业务问题转化为量子计算机或受量子启发的算法能够高效处理的形式。这座桥梁就是QUBO模型。3.1 QUBO模型是什么QUBO全称是“二次无约束二值优化”。它的标准形式非常简洁Minimize y x^T * Q * x其中x是一个由二值变量0或1组成的列向量对应我们的决策变量选或不选某张卡。Q是一个实对称矩阵或上三角矩阵它编码了我们的优化目标。这个形式“无约束”但我们的业务问题明明有约束如成本、精度啊秘诀在于我们可以通过惩罚函数法将约束条件整合到目标函数中。3.2 将评分卡组合问题构建为QUBO模型我们一步步来“翻译”第1步定义决策变量这很直接。对于N张候选评分卡我们定义N个二值变量x_1, x_2, ..., x_N∈ {0, 1}。第2步构建目标函数最大化性能假设我们衡量性能的指标是AUC。我们希望最大化组合的AUC。但QUBO标准形式是最小化。所以我们设目标为最小化负AUC即目标项: H_performance -α * AUC(x)这里AUC(x)是关于x的函数当x确定后我们就能知道选了哪些卡从而可以计算这些卡组合起来的AUC。α是一个正权重系数用于调节该项在总目标中的重要性。第3步整合约束条件以成本约束为例假设每张卡i的成本为c_i总预算为B。约束条件是Σ (c_i * x_i) ≤ B为了将其放入QUBO我们将其改写为等式Σ (c_i * x_i) s B其中s是一个非负的松弛变量可以表示为多个二值变量的组合具体方法略。然后我们将违反该约束的程度作为惩罚项加入目标函数惩罚项: H_budget β * [ Σ (c_i * x_i) s - B ]^2当总成本恰好等于B时括号内为0惩罚为0。当成本偏离B无论是超过还是不足取决于问题设定就会产生一个正的惩罚使得总目标函数值变大。β是惩罚权重通常需要设为一个很大的正数以确保在最优解中约束被严格遵守。第4步组合成完整的QUBO目标完整的QUBO哈密顿量目标函数为H_total H_performance H_budget -α * AUC(x) β * [ Σ (c_i * x_i) s - B ]^2我们的任务就是找到一组x以及s的取值使得H_total最小。第5步处理AUC黑箱函数这里有一个巨大挑战AUC(x)不是一个关于x的显式二次型。它需要通过一个模拟过程用选中的卡在验证集上评分并计算来获得是一个黑箱函数。直接将其放入QUBO是无法求解的。解决方案我们需要进行近似或替代。方法A代理模型。我们可以先用传统方法如随机采样、拉丁超立方采样选取一定数量的x组合计算其对应的AUC(x)然后用这些数据训练一个回归模型如二次多项式回归、神经网络来近似AUC(x)。如果这个代理模型是二次型就可以直接代入QUBO。方法B简化目标。在比赛中有时可以简化问题例如假设每张卡的性能是独立的组合性能是选中卡性能的平均。这样AUC(x)就变成了 * (Σ (auc_i * x_i)) / (Σ x_i)*虽然不是标准的二次型但经过一些数学变换如引入辅助变量处理分母可以近似转化为二次型。方法C基于排序的转化。另一种思路是不直接优化AUC而是优化一个与AUC强相关的、易于表达的二次目标。例如我们可以考虑最小化组合内评分卡预测结果的冲突或差异这可以用评分卡两两之间预测结果的差异平方和来表示这天然就是二次型。实操心得在有限时间的数学建模竞赛中方法B简化目标往往是更可行的切入点。它降低了问题复杂度让你能更专注于QUBO建模和量子算法求解的主流程。评委会更看重你建模思路的完整性和创新性而不是一个极度复杂、难以实现的完美模型。我们当时就采用了“组合性能近似为选中卡性能的加权和”的假设从而成功构建了一个标准的、可求解的QUBO模型。3.4 Q矩阵的构建最终无论通过哪种方式我们的目标函数H_total都需要被展开、化简整理成标准QUBO形式Σ Σ Q_ij * x_i * x_j线性项可以看作x_i * x_i因为x_i^2 x_i对于二值变量成立。这个Q矩阵就是我们要交给求解器的核心输入。构建Q矩阵的过程需要仔细的代数运算特别是当引入松弛变量s它本身可能是多个二值变量的线性组合时矩阵的维度会扩大。务必使用符号计算工具如Python的Sympy库辅助避免手工错误。4. 求解策略从量子退火到经典模拟模型建好了怎么解这里要破除一个误区我们不一定需要真实的量子计算机。目前我们可以利用量子启发式算法在经典计算机上模拟量子退火的过程来求解QUBO。4.1 量子退火原理简介量子退火是一种利用量子力学特性如量子隧穿来寻找全局最优解的技术。想象一下我们的目标函数H_total对应一个多山峰的“能量地形图”。经典算法像一个小球容易掉进局部最低点局部最优解出不来。量子退火则允许“穿山而过”——通过量子隧穿效应直接穿越能量壁垒从而有更高概率找到全局最低点全局最优解。物理上这通过引入一个随时间变化的“量子起伏”哈密顿量来实现系统初始处于一个简单的基态然后缓慢地关闭量子起伏让系统自然演化到我们问题哈密顿量H_total的基态这个基态对应的x的取值就是我们的最优解。4.2 使用模拟退火作为量子退火的经典替代在无法接触真实量子硬件如D-Wave的情况下模拟退火是一个强大且易于实现的替代方案。它是一种受物理退火过程启发的元启发式算法虽然不具备量子隧穿能力但通过引入“温度”参数和概率性跃迁也能有效避免局部最优。对于QUBO问题模拟退火的步骤非常规整初始化随机生成一个初始解x一组0/1设定初始高温T_high终止低温T_low降温速率cooling_rate以及每个温度下的迭代次数L。迭代在当前温度T下重复L次产生新解随机扰动当前解例如随机翻转一个x_i的值。计算能量差ΔE H_new - H_old。Metropolis准则如果 ΔE 0直接接受新解如果 ΔE ≥ 0则以概率exp(-ΔE / T)接受新解即使能量变差也有机会跳出去。降温T T * cooling_rate。终止当T T_low时算法停止输出当前找到的最好解。Python实现的核心代码框架如下import numpy as np import random import math def solve_qubo_with_sa(Q_matrix, init_temperature100.0, final_temperature1e-7, cooling_rate0.99, iterations_per_temp100): 使用模拟退火求解QUBO问题。 Q_matrix: 对称的Q矩阵形状为(n, n) 返回: 最优解向量x最小能量值 n Q_matrix.shape[0] # 1. 初始化 current_x np.random.randint(0, 2, n) # 随机初始解 current_energy current_x Q_matrix current_x # 计算能量 H x^T Q x best_x, best_energy current_x.copy(), current_energy temperature init_temperature while temperature final_temperature: for _ in range(iterations_per_temp): # 2. 产生邻域新解随机翻转一位 new_x current_x.copy() flip_idx random.randint(0, n-1) new_x[flip_idx] 1 - new_x[flip_idx] # 计算新能量 new_energy new_x Q_matrix new_x delta_e new_energy - current_energy # 3. Metropolis准则判断是否接受新解 if delta_e 0 or random.random() math.exp(-delta_e / temperature): current_x, current_energy new_x, new_energy # 更新历史最优 if current_energy best_energy: best_x, best_energy current_x.copy(), current_energy # 4. 降温 temperature * cooling_rate return best_x, best_energy # 示例假设我们已经构建了一个3x3的Q矩阵例如对应3张评分卡的一个简化问题 # Q np.array([[a, b, c], # [b, d, e], # [c, e, f]]) # 注意对称性 # best_solution, min_energy solve_qubo_with_sa(Q)4.3 调参经验与技巧模拟退火的性能极度依赖参数设置。我们的经验是初始温度T_high要足够高使得几乎所有恶化解都能被接受接受率 90%。可以做一个简短测试随机产生大量扰动计算ΔE的均值令T_high -ΔE_mean / ln(0.9)。终止温度T_low要足够低使得算法后期几乎只接受优化解。通常设为1e-7到1e-10量级。降温速率cooling_rate介于0.9到0.999之间。越接近1降温越慢搜索越细致但耗时越长。对于QUBO问题0.95到0.99是常用范围。每个温度的迭代次数L至少是变量个数n的几倍到几十倍确保在当前温度下充分搜索。重启策略不要只跑一次。将上述模拟退火过程独立运行多次例如50-100次从所有结果中选取能量最低的解。这能有效克服单次运行可能陷入局部最优的问题。注意事项模拟退火求解QUBO得到的是近似最优解。对于中小规模问题n 100你可以用精确求解器如暴力枚举、整数规划求解器来验证模拟退火解的质量。对于大规模问题则可以通过多次独立运行结果的稳定性最优能量值是否集中来间接评估解的质量。5. 全流程串联与结果分析让我们把整个流程串起来看看一个完整的求解周期是怎样的。5.1 数据准备与问题实例化假设我们有一个包含20张候选评分卡的数据集。对于每张卡i我们知道其单独在验证集上的AUC值auc_i假设0.7到0.85之间。其使用成本c_i假设1到10个单位。总预算B 30。我们想选出约5-10张卡不严格固定数量由成本约束和性能目标共同决定。我们采用简化目标假设组合的AUC是选中卡AUC的平均值。同时我们希望选中的卡之间有一定多样性因此引入一个惩罚项最小化选中卡之间两两相关系数的平方和假设我们也有每两张卡预测结果的相关系数矩阵corr_mat。那么我们的QUBO目标函数可以设计为H -α * (Σ (auc_i * x_i) / (Σ x_i)) β * (Σ c_i * x_i - B)^2 γ * Σ Σ (corr_ij * x_i * x_j)其中第三项是多样性惩罚项γ是其权重。分母Σ x_i的处理需要技巧一种常见方法是引入一个辅助变量来近似或者固定一个期望的卡片数量K将约束Σ x_i K也作为惩罚项加入这样分母就变成了常数K。我们采用后一种方法并设定期望卡片数K7。5.2 模型构建与求解变量定义20个决策变量x_0 ... x_19。约束转化为惩罚项成本约束惩罚H_cost β * (Σ c_i * x_i - 30)^2卡片数量约束惩罚H_count δ * (Σ x_i - 7)^2目标与惩罚整合H_total -α * (Σ auc_i * x_i) / 7 H_cost γ * Σ_{ij} corr_ij * x_i * x_j H_count注意第一项除以7后是一个关于x_i的线性函数。整个H_total展开后是一个标准的二次型因为x_i^2 x_i线性项可以并入二次项的对角线。权重系数α, β, γ, δ设定这是关键需要多次试验。原则是惩罚项权重必须足够大以确保约束在最优解中被满足。通常可以先忽略惩罚项优化性能目标看看约束被违反的程度然后设定一个比性能目标量级大几个数量级的惩罚权重例如100倍或1000倍。构建Q矩阵根据展开后的H_total计算出20x20的对称Q矩阵注意由于我们引入了x_i^2 x_i线性项系数会被加到Q_ii上。调用模拟退火求解器使用前面实现的solve_qubo_with_sa函数设置合适的参数如T_high100, T_low1e-8, cooling_rate0.995, L500独立运行100次。解的分析从100次运行中选出能量H_total最小的解。检查该解是否满足约束总成本≤30选中卡数量≈7。然后计算该解对应的性能目标值负的加权AUC和。5.3 与传统方法的对比分析为了体现量子启发方法的优势必须设置一个对比实验。我们同时使用贪心算法每次选择能最大提升组合AUC或单位成本提升最大且不超预算的卡。遗传算法设置种群大小、交叉变异概率优化同样的目标函数H_total注意这里遗传算法直接优化H_total与模拟退火求解QUBO是等价的但搜索机制不同。对比的维度应包括解的质量在相同约束下哪种方法得到的组合AUC最高稳定性每种方法随机运行多次例如50次其最优解的目标函数值波动范围有多大模拟退火/遗传算法是否总能找到相近的优解计算时间达到相同精度解所需的时间。对于小规模问题可能差异不大可以尝试增大问题规模如100张卡来观察趋势。在我们的模拟实验中通常会发现贪心算法最快但解的质量最差模拟退火和遗传算法在解的质量上优于贪心且模拟退火在稳定性上往往表现更好特别是当QUBO模型构建得当时模拟退火利用问题结构信息的能力更强。而遗传算法则更依赖于交叉、变异算子的设计。5.4 结果可视化与论文呈现在数学建模论文中清晰的可视化至关重要收敛曲线图绘制模拟退火过程中能量随迭代次数下降的曲线可以展示算法的收敛性。解空间对比图可以用散点图展示不同算法多次运行找到的解的分布横轴可以是成本纵轴是AUC一目了然地显示模拟退火找到的解更集中在帕累托前沿Pareto Front附近。权重敏感性分析展示惩罚权重β, γ, δ的变化如何影响最终解如选中卡数量、总成本、AUC。这能体现模型的鲁棒性和可解释性。最终评分卡组合列表给出由模拟退火选出的具体是哪几张卡并简要分析其特点例如选中的卡是否覆盖了不同的风险维度成本分布如何。6. 常见问题、挑战与进阶思考在实际操作和后续研究中我们遇到了不少坑也产生了一些更深的思考。6.1 QUBO建模中的典型陷阱权重系数 tuning 地狱惩罚权重β, γ, δ的选择是艺术也是科学。设得太小约束不被遵守设得太大数值问题目标函数值过大可能导致优化器失效或者惩罚项完全主导搜索忽略了性能目标。策略先单独优化性能目标无约束观察约束违反程度再单独优化惩罚项令性能目标权重为0确保能找到满足约束的解最后逐步增加性能目标权重在一个中间区域寻找平衡点。自动化调参工具如网格搜索、贝叶斯优化可以帮忙。“除零”错误与分母处理当目标函数中包含类似1 / (Σ x_i)的项时如果Σ x_i可能为0就会出错。解决方法在惩罚项中强烈鼓励选中一定数量的卡如我们之前做的或者在计算时加一个很小的平滑项ε如1 / (Σ x_i ε)。Q矩阵的规模与稀疏性当变量很多时比如1000张卡Q矩阵将有一百万个元素。如果问题结构导致Q矩阵是稠密的存储和计算都会成为瓶颈。检查分析你的目标函数。如果多样性惩罚项涉及所有卡对那么Q矩阵就是稠密的。可以考虑使用更高效的稀疏矩阵存储格式或者重新设计多样性惩罚例如只惩罚与已选卡最相似的前几张卡。6.2 模拟退火求解的实操问题算法不收敛或收敛到差解可能原因1初始温度太低或降温太快。对策提高初始温度降低降温速率如从0.99改为0.995增加每个温度的迭代次数。可能原因2邻域结构设计不佳。简单的单点翻转可能效率低。对策尝试更大的邻域动作如同时翻转多个位或者设计问题特定的邻域例如交换两张卡的选择状态。可能原因3QUBO模型本身有缺陷如权重设置不当。对策回头检查模型用小型实例验证。计算时间过长对于大规模问题模拟退火可能需要数百万次能量评估每次评估都需要计算x^T Q x这是O(n²)的复杂度。优化利用Q矩阵的稀疏性如果存在。在计算能量差ΔE时利用翻转单个位带来的增量变化是局部的这一特性实现O(n)甚至O(1)的更新而不是每次都重新计算整个二次型。# 高效计算翻转第k位后的能量差 def delta_energy_flip(x, Q, k): # x是当前解向量Q是矩阵k是要翻转的索引0-based delta (1 - 2*x[k]) * (Q[k, k] 2 * np.dot(Q[k, :], x) - 2 * Q[k, k] * x[k]) # 解释翻转x[k] (0-1或1-0)能量变化主要来自与x[k]相关的所有项 # 更精确的公式delta (1-2*x[k]) * (Q[k,k] 2 * Σ_{j≠k} Q[k,j] * x[j]) # 因为 x[k]^2 x[k]当x[k]变化时Q[k,k]项贡献 (1-2*x[k])*Q[k,k] # 交叉项贡献 2*(1-2*x[k]) * Σ_{j≠k} Q[k,j] * x[j] return delta6.3 从模拟走向真实量子计算虽然比赛多用模拟但了解真实量子计算如D-Wave的流程是有益的。嵌入问题D-Wave的量子比特以特定的图结构Chimera或Pegasus连接。我们的QUBO问题变量之间可能具有完全连接而硬件连接是有限的。这就需要“嵌入”过程一个逻辑变量可能由多个物理量子比特链来表示。这个过程通常由D-Wave的API自动完成但会影响问题规模。退火参数真实量子退火有更多参数如退火时间、退火路径等需要调整。读取与后处理由于量子噪声需要多次读取采样并从中选择最优解。D-Wave直接返回的是低能量样本的分布。6.4 模型扩展与创新点在标准解法之外可以考虑一些创新方向为论文增色多目标优化我们之前把多目标高AUC、低成本、高多样性通过加权和变成了单目标。更高级的做法是使用帕累托优化求出一组非支配解帕累托前沿然后让决策者选择。这可以结合多目标模拟退火或量子启发的多目标优化算法。动态场景考虑评分卡性能随时间漂移或成本动态变化。问题就变成了动态组合优化需要引入时间维度或者设计在线学习调整策略。与机器学习融合用更复杂的机器学习模型如图神经网络来学习评分卡组合与最终性能之间的映射关系替代我们简单的线性加权假设然后将这个学习到的模型嵌入到QUBO框架中。这道MathorCup A题是一个绝佳的练手项目它迫使你跨越金融、优化和量子计算三个领域进行思考。真正的收获不在于是否得到了一个完美的数字解而在于掌握了将复杂的现实世界问题抽象、转化为可计算模型并运用前沿算法工具进行探索的这一整套方法论。这种能力在任何一个需要处理复杂决策的领域都是无比珍贵的。
返回列表