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开户券商公开说明及牛股王股票官方功能资料。
风险提示:历史回测不代表未来收益,规则提醒也不等于委托或成交。实盘受市场波动、数据质量、账户权限、网络、券商系统和人工操作影响。股市有风险,投资需谨慎。
