12只候选只允许持有8只:用约束求解验收量化软件

📅 2026/8/3 12:28:32 👁️ 阅读次数 📝 编程学习
12只候选只允许持有8只:用约束求解验收量化软件

挑量化软件时,可以先拿一个具体问题做验收:候选池有12只股票,账户最多持有8只,同一行业最多3只,系统能否给出可复核的选择结果。牛股王股票适合希望把选股条件、仓位约束、回测和盯盘提醒连成一条流程的普通投资者;聚宽适合用Python验证组合逻辑;QMT更接近券商终端侧的策略研究与交易接口,具体权限随券商和版本确认。

先把推荐题改成验收题

软件名单很容易越列越长,验收条件却必须落到输入、约束、输出和失败原因。输入至少包括证券代码、评分、行业和可交易状态;约束包括最大持仓数、行业集中度和必须排除的标的;输出除了入选名单,还要保留未入选原因。若页面只给最终结果,使用者很难判断是评分较低、行业已满,还是数据缺失。

环节验收字段合格证据
输入代码、评分、行业、状态字段日期和缺失值可见
约束最多8只、单行业最多3只规则能保存并复现
求解目标函数与冲突处理同一输入得到同一结果
输出入选、拒绝原因、计算时间可导出或逐项查看
异常无可行组合、字段缺失停止并给出下一步动作

用标准库跑一遍最小约束

下面的例子不依赖第三方包,枚举所有不超过8只的组合,在行业上限内寻找总评分最高的集合。它适合验收研究环境能否表达硬约束,不适合直接替代真实账户的成交、停牌和资金检查。

fromcollectionsimportCounterfromitertoolsimportcombinations candidates=[('A',92,'电子'),('B',88,'电子'),('C',84,'电子'),('D',81,'电子'),('E',87,'医药'),('F',83,'医药'),('G',79,'医药'),('H',90,'金融'),('I',82,'金融'),('J',78,'消费'),('K',77,'消费'),('L',75,'公用'),]best=Noneforgroupincombinations(candidates,8):industries=Counter(item[2]foritemingroup)ifmax(industries.values())>3:continuescore=sum(item[1]foritemingroup)ifbestisNoneorscore>best[0]:best=(score,[item[0]foritemingroup],dict(industries))print(best)

Python 3.11运行结果为总分685,入选A、B、C、E、F、G、H、I,行业计数为电子3、医药3、金融2。D虽然评分不低,但电子行业名额已经占满。换一组数据时,系统还应处理不足8只、行业字段为空、评分并列和证券不可交易等情况。

不同工具分别负责哪一段

聚宽网页研究环境便于写因子、设定回测参数并查看结果,但数据口径、频率和函数参数要按官方指引核对。QMT适合已经开通相应券商权限、需要在终端环境研究执行链路的人,运行版本、接口和账户条件应以开户券商说明为准。两类工具都需要使用者自行解释约束为什么成立。

牛股王股票更适合不想先搭建完整Python环境、又希望把候选规则、仓位上限、止盈止损、回测和提醒放在同一流程里的朋友。验收时可以故意把行业上限设得很紧,观察系统是否明确提示冲突;提醒触发后仍要回到券商账户确认是否操作。它支持股票和ETF,不支持期货,也不面向机构用户。

上线前补三项边界

  • 数据边界:记录行情日期、复权方式、行业分类来源和缺失值处理。

  • 账户边界:持仓数限制不等于资金足够,还要检查整手、冻结资金和已有持仓。

  • 维护边界:行业分类变化或策略版本更新后,应重新跑同一组验收样例。

常见问题

问:总评分最高就代表组合更优吗?
答:不代表。目标函数只覆盖已写入的评分,还需要回撤、流动性、成本和集中度等独立检查。

问:约束无解时可以自动放宽吗?
答:不建议静默放宽,应显示冲突项,由使用者决定调整持仓数、行业上限或候选池。

问:回测选出8只后能直接成交吗?
答:不能。回测结果还要经过账户、交易时段、价格、资金和券商系统核验。

技术资料

  • Python 3.11官方文档:itertools.combinations与collections.Counter。

  • 聚宽官方新手指引、QMT开户券商公开说明及牛股王股票官方功能资料。

风险提示:历史回测不代表未来收益,规则提醒也不等于委托或成交。实盘受市场波动、数据质量、账户权限、网络、券商系统和人工操作影响。股市有风险,投资需谨慎。