使用 xquad 的区间整数域构建投资组合再平衡(Portfolio Rebalance)模型
【免费下载链接】xquadA rust implementation of the Quip Networks quantum virtual machine.项目地址https://gitcode.com/gh_mirrors/xq/xquad点击查看免费下载本文以 xquad 仓库中的 Portfolio Rebalance 示例 为主线讲解如何用 XQCP 约束编程 DSL 为一类**允许空头负权重**的投资组合再平衡问题建立二次无约束二元优化QUBO模型为每只资产选择一个[-5, 5]区间内的整数权重在权重之和等于预算的约束下用预期收益与风险矩阵权衡取舍。读完本文你将掌握Domain.INTEGERlo/hi区间整数域的建模方法、手写预算平方约束的展开技巧、三程序流水线encoder / verifier / decoder的调用方式以及该示例当前能证明什么、不能证明什么。问题定义为什么必须用带符号的整数权重投资组合再平衡的目标是给每只资产分配一个带符号的整数权重在预期收益与风险之间取得平衡同时要求所有权重之和恰好等于一个预算值。关键点在于负权重代表空头short position——正是这一点决定了该问题不能退化成选或不选的二元模型二元模型只能表达x_i ∈ {0, 1}即持不持有而再平衡需要x_i ∈ [-5, 5]这样的区间整数域才能表达做多、空仓、做空三种状态。因此该示例成为 xquad 中首个、也是核心的一个非二元示例它完整展示了在Domain.INTEGER上建模、编译、验证与解码的完整链路。QUBO 形式化输入、模型、目标与约束根据 示例 README 与 runner.py 的实现问题的形式化如下要素定义输入资产数量N、每只资产的预期收益r_i、按行优先展平的对称N × N风险矩阵C模型N个整数变量x_i ∈ [-5, 5]用lo-5, hi5声明模型内部存储y_i x_i - lo ∈ {0, ..., 10}系数写在x上sample.value()在输出端把y平移回x目标-sum(r_i * x_i) sum_{i j} C_ij * x_i * x_j最小化约束sum(x_i) B以惩罚项P * (sum_i x_i - B)^2表达能量被平移了两次因此数值上与其他任何示例不可比详见下文在 runner.py 中这些参数是编译期常量_LO -5 _HI 5 _K _HI - _LO 1 # 域宽 11模型实际持有 y ∈ {0, ..., 10} _BUDGET 1 # 权重之和必须等于的预算 _PENALTY 50 # 预算约束的惩罚强度能量的两次平移argmin 精确数值不可比README 明确指出该示例的能量被平移了两次因此最终数字不是目标函数的真实值也不与其他示例可比区间域平移代入x y lo后二次项展开会产生一个常数w*lo^2因为 XQMX 模型没有偏移offset字段这个常数被丢弃。参见 problem.py 中 define_model 的文档The uniform energy shift the ranged form drops is unrepresentable, since XQMX carries no offset term; argmin is unaffected.预算平方平移P * (sum_i x_i - B)^2展开后包含常数P*B^2与EQUALITY展开丢弃自己的P*b²常数项一致见 spec/xqvm/HLF.md 中 EQUALITY 展开的说明。两次平移对所有可行赋值都施加相同的偏移所以虽然返回的能量数字不是目标函数的真实值argmin 却是精确的——排序结果不受影响。编码策略手写预算平方而非 apply_equality这是本示例最有技术含量的一节预算约束sum(x_i) B是手写展开的而不是交给apply_equality()。为什么不能交给 EQUALITY在 xqcp/compiler.py 中所有高层约束onehot_row、onehot_col、exclude、implies、equality、atleast、atleastw、reduce等都被标记为_BINARY_ONLY_KINDS。原因在 spec/xqvm/HLF.md 中写得很清楚所有高层函数展开都建立在x² x之上而该等式只对二元变量成立。ONEHOTR、EQUALITY、ATLEAST等展开在推导时都利用了二元变量的幂等性一旦应用到整数域模型上生成的惩罚项就不再表达用户写下的约束。因此 xqcp 会拒绝在非二元模型上使用任何高层约束——这也是 spec/xqcp/SPEC.md 中记录的开放问题per-domain expansions每个域是否都存在正确的展开尚无定论。手写展开的系数P * (sum_i x_i - B)^2展开后为每个对角项P每个非对角对2P每个线性系数-2PB这与EQUALITY展开linear[idx_k] P*a_k*(a_k - 2b)、quad[idx_k, idx_m] 2P*a_k*a_m在a_k 1、b B时是同一套数学。README 说得很直白Writing that square is the same work the HLF would have done——手写这份展开正是 HLF 本来要做的工作。在 runner.py 中这份展开与目标项一起写入# 收益目标 预算平方的线性项-r_i * x_i - 2*P*B * x_i problem.model.linear[i].add(-ri - 2 * _PENALTY * _BUDGET) # 风险目标上三角 预算平方的对角项C_ii P problem.model.quadratic[i, i].add(cov_in.get(xq_grid(i, i, num_assets)) _PENALTY) # 非对角项C_ij 2P problem.model.quadratic[i, j].add(cij 2 * _PENALTY)注意xq_grid(i, j, n)把二维风险矩阵按行优先映射成一维协方差输入向量——这正是 README 中风险矩阵按行优先展平的实际落地。区间域在底层的二次重写区间域在 DSL 之下还有一层自动重写。看 xqcp/symbols.py 中 CoefficientRef.add 的实现当模型带lo_expr时每次二次项写入除了记录w本身还会把w*lo追加到两个命名索引的线性系数上因为代入x y lo后w * x_i * x_j w*y_i*y_j w*lo*y_i w*lo*y_j w*lo²非对角写入两条修正分别落在i和j的线性系数上对角写入i j两条修正落在同一个索引上正好给出平方展开所要求的2*w*lo。这些重写对模型构建代码完全不可见——你写的依然是model.quadratic[i, j].add(...)平移由记录层自动完成。这种设计带来的一个直接限制是区间整数模型上不支持linear[i] w和quadratic[i, j] w的赋值式写法setitem因为设置会替换掉系数而lo修正只能累加两者会互相矛盾LinearProxy.__setitem__和QuadraticProxy.__setitem__会直接抛出ValueError提示改用.add(w)。lo 和 hi 必须是字面量README 特别强调lo与hi是字面量。运行时的lo会占用 decoder 唯一的 calldata 标量——而那个标量已经被输出循环的上界N用掉了。从源码看problem.py 的 define_model 中字面量lo不需要寄存器会被内联替换到所有需要平移的位置而运行时lo则必须分配寄存器。xqcp 的策略是宁可直接报错也不在两个需求中二选一。DSL 方法速查区间整数域用到的三个 API本示例只使用了非二元模型支持的全部操作# 1. 声明区间整数模型sizeN 个变量域 [-5, 5] problem.define_model(sizenum_assets, domainDomain.INTEGER, lo_LO, hi_HI) # 2. 写入系数非二元模型唯一支持的两种操作 problem.model.linear[i].add(w) problem.model.quadratic[i, j].add(w) # 3. 读取样本值返回声明域内的权重 x而不是存储值 y problem.sample.value(i)背后机制Domain.INTEGER在 xqcp/problem.py 中定义映射到 VM 层的XQMXDomain.INTEGERdefine_model会做参数合法性检查lo/hi必须成对、hi lo 1、不允许k与lo/hi同时出现见 problem.py 的 _check_domain_args。sample.value(i)在 xqcp/symbols.py 中实现getline(index) lo_expr——只有当define_model给了lo/hi时才做平移否则与getline完全一致。整数模型的k由hi - lo 1计算得出域宽在编译期嵌入 XQMX 分配allocator 弹出k后再弹size宽度最后入栈见 compiler.py 的 _emit_model_allocation。六步流水线CP → 汇编 → 编码 → 采样跳过→ 验证 → 解码与 xquad 其他示例一致本示例遵循三程序架构encoder / verifier / decoder参见 docs/book/src/concepts/three-programs.md步骤动作说明1. CPxqcp生成收益与对称风险矩阵声明N个区间整数权重写入目标与预算平方系数2. Assemblexquad.asm把.xqasm文本汇编成字节码3. Encode运行 encoder在所选 XQVM 后端上产出 XQMX 模型4. Sample跳过没有求解器能采样整数模型runner 直接提供手工挑选的赋值5. Verify运行 verifier依据define_model重放的k检查每个权重落在{0, ..., 10}再计算能量6. Decode运行 decoder读取每个权重并加上lo还原带符号的权重在 runner.py 的 run() 中这段流水线有清晰的实现vm VM(backendbackend) vm.set_calldata([n, returns, cov]) vm.set_output_slots(1) vm.run(programs.encoder) model vm.outputs()[0] sample XQMX.integer_sample(n, _K) for index, weight in enumerate(weights): sample.linear[index] weight - _LO # 手工构造 y x - lo vm VM(backendbackend) vm.set_calldata([n, returns, cov, model, sample]) vm.set_output_slots(2) vm.run(programs.verifier) energy, valid vm.outputs()[0], vm.outputs()[1] vm VM(backendbackend) vm.set_calldata([sample, n]) # sample 唯一的标量 n vm.run(programs.decoder)三个细节值得注意手工采样XQMX.integer_sample(n, _K)创建{0, ..., k-1}域的样本见 xqvm_py/xqmx.py随后把手工挑选的权重减去lo存入sample.linear即y x - lo。手工挑选的赋值pick_assignmentrunner.py对n 2返回weights[0] BUDGET 1 2、weights[1] -1——故意携带一个空头让解码输出覆盖整个域而不只是非负半边并且总和恰好等于预算。decoder 的 calldata 布局[sample, n]其中n是唯一的标量被输出循环上界占用——这正是前文运行时lo没有标量可用的原因。decoder 的 calldata 契约见 compiler.py 的 compile_decoder。运行方式与命令行参数从仓库根目录运行两种典型用法uv run python examples/portfolio_rebalance/runner.py --seed 42 uv run python examples/portfolio_rebalance/runner.py --n 6 --interpreter rust参数默认值说明--n5资产数量--solverdwave-cpu接受但被忽略详见下文--interpreterpythonXQVM 后端python纯 Python 参考 VM或rust经xqffi调用 Rust 解释器--seed42随机种子决定收益与协方差矩阵的生成-ostdout把 JSON 结果写入文件--interpreter选择的是执行编译后程序的 VM而不是求解模型的后端——正确模型在两个解释器上总是产生相同的valid与energy。输出的 JSON 字段包括_seed、n、lo、hi、budget、returns、weights、sums_to_budget、energy、valid见 runner.py 的 main()。本示例证明什么、不证明什么证明valid 1说明域检查domain check、记录层平移record-layer shift与解码decode三者能够组合在一条手工挑选的赋值上正确工作——一个包含空头、落在域内且总和等于预算的赋值通过了验证器并解码回带符号的权重。不证明它不证明任何优化能力。README 明确写道It proves nothing about optimisation: no solver samples an integer model yet, so--solveris accepted, ignored, and the pipeline runs against a hand-picked weight vector that sits inside the domain and sums to the budget. Integer lowering is XQSA v0.5.0 work.即目前没有任何求解器能采样整数模型整数域在 spec/xqsa/DOMAINS.md 中的求解器支持状态为 Reserved_validate_model()会对 INTEGER 域抛出ValueError所以--solver仅为接口一致性而接受并忽略。runner 启动时会向 stderr 打印提示runner.py。整数下界integer lowering是 XQSA v0.5.0 的计划工作。规范输出与 CI 守护make example-smoke对应 scripts/example-smoke.py验证两个解释器在--seed 42 --solver dwave-cpu下都产生valid 1。该冒烟测试是基于不变式的只检查合法性valid 1不比较精确输出——因为能量数值经过两次平移不可比且手工赋值的意义在于链路正确性而非最优性。延伸阅读示例总览与通用运行方式每个示例目录的公共结构、--interpreter语义与改编方法三程序架构encoder / verifier / decoder 的职责与调用链XQCP 建模文档本 runner 所用的 DSL 完整说明整数域与样本编码{0, ..., k-1}域、integer_sample与域校验规则HLF 展开规范EQUALITY等展开为何只对二元域成立XQCP 规格约束仅限二元模型的开放问题记录赞分享【免费下载链接】xquadA rust implementation of the Quip Networks quantum virtual machine.项目地址https://gitcode.com/gh_mirrors/xq/xquad点击查看免费下载相关推荐Claude for Financial Services 财富管理插件实战用 /rebalance 命令与 portfolio-rebalance 技能完成税务感知的组合再平衡Claude for Financial Services 财富管理插件实战用 /rebalance 命令与 portfolio rebalance 技能完成人工智能AI 应用AI 技能/插件AI Agent金融科技XQuad Portfolio Rebalance 示例深度解析XQVM 整数域建模与带符号权重的端到端流水线XQuad Portfolio Rebalance 示例深度解析XQVM 整数域建模与带符号权重的端到端流水线 本篇技术指南围绕 xquad 仓库中的 PorFinRobot 财富管理技能详解用 Portfolio Rebalance 技能实现组合漂移分析与再平衡交易建议FinRobot 财富管理技能详解用 Portfolio Rebalance 技能实现组合漂移分析与再平衡交易建议 导读 本文以 FinRobot 桌面端人工智能AI Agent金融科技AI 应用大模型RAG上一篇Windows 11 PL2303驱动问题终极解决方案告别黄色感叹号的完整指南下一篇Windows系统驱动兼容性重构高效解决PL-2303停产芯片识别问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PS5新手到进阶:初始化、SSD扩容与散热维护全攻略

PS5新手到进阶:初始化、SSD扩容与散热维护全攻略

如果你手里正好有一台PS5,或者正打算入坑这台主机,那“AnyPS5”这个标题应该会让你有点好奇:什么叫Any?其实拆开理解很简单,Any就是“任何一台、任何一个场景、任何一类玩家”都适用的意思。不管你是刚拆封的新手、纠结…

2026/10/13 6:33:48 阅读更多 →
Muse Gadgets:让本地AI Agent真正操控物理硬件

Muse Gadgets:让本地AI Agent真正操控物理硬件

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

2026/10/13 6:33:48 阅读更多 →
从梯度下降到Adam:一文搞懂深度学习优化器演进与调参实战

从梯度下降到Adam:一文搞懂深度学习优化器演进与调参实战

1. 困境起点:下山这件事,为什么会让算法被“逼”出来做机器学习的朋友应该都有过这种体验:早上信心满满地把模型丢上去训练,下午回来看loss曲线,发现它像一条坏掉的心电图——要么不动,要么剧烈抖动&#x…

2026/10/13 6:33:48 阅读更多 →

最新新闻

Win7离线OCR工具:PaddleOCR-json免Python部署实战

Win7离线OCR工具:PaddleOCR-json免Python部署实战

简介:win7-x64-PaddleOCR-json.zip是面向Windows 7 64位系统的PaddleOCR部署压缩包,适用于需要在旧版平台快速搭建文字识别能力、并通过JSON格式获取结构化结果的开发者和运维人员。包内共64个文件,总体积约126.19MB。其中dll动态库用于支撑推…

2026/10/13 7:13:58 阅读更多 →
AI应用上下文管理实战:分层压缩方案详解

AI应用上下文管理实战:分层压缩方案详解

我做过一个内部的智能客服项目,上线三个月后收到最多的用户反馈不是"回答不准",而是"它怎么又把我说过的话忘了"。用户在第十分钟重新提起自己五分钟前强调过的产品型号时,模型一本正经地给出了另一款产品的介绍。查日志…

2026/10/13 7:13:58 阅读更多 →
LSTM+Attention时序预测实战:从原理到PyTorch落地

LSTM+Attention时序预测实战:从原理到PyTorch落地

1. 从"预测"这个词说起:为什么LSTM加Attention成了时序任务里的常驻组合做时序预测的人大概都有过这样的经历:拿到一批带时间戳的数据,第一反应是上ARIMA或者简单移动平均,跑出来的结果在平稳段看着还行,一到…

2026/10/13 7:13:58 阅读更多 →
扣子3.0零代码搭建AI智能体:工作流与多Agent协作实战

扣子3.0零代码搭建AI智能体:工作流与多Agent协作实战

扣子 3.0 这个版本,最核心的变化就是把“搭建 AI 智能体”这件事,从写代码变成了搭积木。你不需要懂 Python,不需要本地显卡,打开浏览器登录就能开始做。这篇文章会带你从零开始,走完一个完整的智能体搭建流程&#xf…

2026/10/13 7:13:58 阅读更多 →
HuggingFace英译中模型迁移ONNX:导出、推理与量化部署全攻略

HuggingFace英译中模型迁移ONNX:导出、推理与量化部署全攻略

最近把一个托管在 HuggingFace 上的英译中模型真正搬进了生产环境,折腾了一阵子之后,总算把完整的导出、推理、优化流程打通了。这篇内容就是从那个项目里整理出来的,全程聚焦一件事:如何把一个 HuggingFace 上的英译中模型迁移到…

2026/10/13 7:13:58 阅读更多 →
零基础AI漫剧量产:12模块工业化流水线实战

零基础AI漫剧量产:12模块工业化流水线实战

1. 这不是“AI绘画课”,而是一套可批量交付的漫剧工业化流水线“零基础 AI 漫剧智能量产创作营”——光看标题,很多人第一反应是:又一个教Stable Diffusion换脸、用Runway生成动图的速成班?我最初也这么想。直到去年参与某高校数字…

2026/10/13 7:12:57 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →