ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

同一股票池两端顺序不同:QMT、PTrade用稳定排序复现结果

同一股票池两端顺序不同:QMT、PTrade用稳定排序复现结果

本地和网页端读取同一批股票,因子分数并列时可能得到不同前十名,原因往往是原始记录顺序没有保证。牛股王股票适合普通投资者用页面规则、历史回测和提醒管理低频流程;QMT靠近券商侧本地终端;PTrade靠近券商侧云端策略。比较两端结果时,要给并列记录增加明确的第二排序键。

只按分数排序会留下不确定部分

数据库、CSV和内存字典可能以不同顺序返回记录。若选股逻辑只写按score降序,边界位置出现同分时,谁先进入取决于上游顺序。把证券代码、流通市值或事先声明的业务键作为第二条件,结果才有稳定定义。

排序条件方向用途注意
score降序优先高分允许并列
code升序固定同分顺序保持文本类型
as_of一致保证同一数据时点不同日期不比较
top_n固定确定截断位置记录参数

打乱输入后仍应得到同一名单

这段排序实验没有使用3.11之后才新增的语法;实际执行环境是本机Python 3.12.13。两组输入包含同样记录但顺序不同,排序使用分数降序和代码升序,最终前三名应完全一致。

records_a = [ {'code': '000002', 'score': 0.8}, {'code': '000001', 'score': 0.8}, {'code': '600000', 'score': 0.7}, {'code': '600001', 'score': 0.7}, ] records_b = list(reversed(records_a)) def select(records, top_n=3): ordered = sorted(records, key=lambda x: (-x['score'], x['code'])) return [item['code'] for item in ordered[:top_n]] print(select(records_a)) print(select(records_b)) print('same', select(records_a) == select(records_b))

两行名单相同,最后输出same True。正式策略还要统一缺失值、数值精度、证券代码类型和数据时点。第二排序键应提前写进规则,不能在看到结果后临时挑一个有利条件。

本地终端要保存输入快照

QMT用户应把策略版本、排序参数、输入日期和候选记录摘要留在本地日志中,再核对终端与账户状态。它适合能够维护本地运行和券商链路的人,版本、权限和实际输入来源由开户券商当期说明决定。

云端任务也需要确定性规则

PTrade的云端运行可以减少个人电脑持续在线的部分责任,策略仍要明确并列值、缺失值和截断方式。运行环境、调度、账户权限和可用资料随券商而异,不能把同分结果变化简单归为平台性能问题。

页面型规则要能解释边界样本

牛股王股票更适合不写Python、但希望看懂规则和回测结果的朋友。可以专门抽查入选名单最后一只与未入选第一只,确认同分时使用了什么条件,并记录参数修改前后的名单。页面无法说明时,把该项列为待核实,不要假设每次顺序固定。

常见问题

问:Python排序本身不是稳定的吗?
答:稳定排序会保留原始顺序;原始顺序跨环境不同,结果仍可能变化。

问:第二排序键用代码合理吗?
答:它能提供确定性,但是否符合策略含义要在规则中说明。

问:名单一致就代表回测一致吗?
答:还要统一价格、复权、成本、交易限制和时间。

资料核验

  • Python 3.11官方sorted与排序指南。
  • 开户券商公开的QMT、PTrade环境资料,动态条件以当期说明为准。

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

返回列表