股票筛选后怎么排序:先设硬条件,再排研究优先级
选股结果排序应发生在硬条件执行之后。准入回答“这只股票能否进入研究队列”,排序回答“时间有限时先研究谁”。把两件事混进同一个综合分,会让很强的偏好指标补偿原本不能违反的条件。即使算术正确,最后的清单也可能不符合用户要求。
本文用五只虚构股票分配两个研究名额,实际计算偏好得分,改变权重,并验证被淘汰股票不会重新混入。所有数字都是合成研究输入,不代表因子有预测能力,也不提供持仓建议。CoTrading对应模块仍属规划或待核实,以下是独立方法及可运行的标准库样例。
先定义准入,再定义偏好
先冻结股票池与数据日期,再列出每只候选都必须满足的条件。本例要求某个已约定窗口的平均每日成交金额至少为同一币种的两百万,简写字段turnover以百万为单位,所以存储阈值为2。实际使用时须确认数据商给的是成交金额还是成交股数;不能把货币门槛直接套到股数上,也不能把不同币种金额放在同一门槛下比较。
偏好则限定在合格集合内部:估值排名越小越优,增长排名越小越优。这里输入的是已按可比观测计算的名次,不是原始市盈率和增速。真实任务需保留每项排名的比较总体与方向,因为三家公司里的第一名与数百家公司里的第一名,覆盖含义不同。换股票池后继续沿用旧名次,也可能产生错误解释。
缺失偏好不应悄悄成为未声明的硬条件。如果缺增长就是不能研究,应写进准入规则。本例中偏好字段缺失的股票仍可能通过成交金额门槛,但进入待评分队列。这样能分清卡住任务的是市场资格,还是排序输入没有准备完整。
准备能还原总分的输入表
样例故意让偏好发生冲突。AAA偏估值,BBB偏增长,DDD两项均衡;CCC偏好很好但成交金额不合格;EEE成交金额合格却缺估值名次。
| 股票 | 成交金额,百万 | 估值名次 | 增长名次 | 初始处理 |
|---|---|---|---|---|
| AAA | 3 | 1 | 3 | 合格并评分 |
| BBB | 4 | 3 | 1 | 合格并评分 |
| CCC | 1 | 1 | 1 | 硬条件淘汰 |
| DDD | 3 | 2 | 2 | 合格并评分 |
| EEE | 3 | 缺失 | 1 | 合格,待评分 |
本例采用总分 = w × 估值名次 + (1 − w) × 增长名次,分数越低越靠前。估值权重为0.75时,AAA为1.50、DDD为2.00、BBB为2.50。AAA的两项贡献分别为0.75和0.75,合计1.50。交付时保存分项贡献,审阅者才不必猜总分从哪里来。
把原始市盈率、增长率和成交金额直接相加并不等价。单位大的字段可能凭量纲主导结果。名次是一种归一化选择,但会丢掉观测之间的距离:第一名领先第二名一点或很多,名次差都一样。因此应记录采用名次的理由,并检查它是否适合当前研究任务,不能把这套示例权重当作普遍最优配置。
只在合格集合中运行评分
核心执行顺序是先过滤,再检查评分输入,最后计算。CCC从未进入评分环节,不依赖某个“足够大的流动性扣分”维持淘汰结果。
eligible = [r for r in rows if r["turnover"] >= 2]
scored, pending = [], []
for row in eligible:
if row["value_rank"] is None or row["growth_rank"] is None:
pending.append(row["symbol"])
continue
score = weight * D(row["value_rank"]) + (1-weight) * D(row["growth_rank"])
scored.append((score, row["symbol"]))
ordered = sorted(scored)
完整样例在作者仓库docs/growth/research/round-5/examples/R518.py,使用Python直接运行。实际输出中,权重0.75的顺序为AAA、DDD、BBB,对应1.50、2.00、2.50;EEE待评分。前两个研究名额给AAA和DDD。Python官方排序指南说明排序键和稳定性;本例显式用股票标识作为次序键,使结果不受数据商返回行序影响。
下载完整示例。使用Python 3.12+,仅需标准库,全部为合成数据;下载后运行python R518.py。
权重从字符串构造为十进制数,表示方法见Decimal官方文档。中间分数保留精度,到显示时才舍入。若先四舍五入再排序,原本不同的两个结果可能被错误当成并列;显示相同也不能反过来证明计算值相同。
改权重时验证硬条件没有变化
第二次执行把估值权重改为0.25,增长权重为0.75。此时BBB为1.50、DDD为2.00、AAA为2.50,两个名额变成BBB和DDD。CCC仍被淘汰,EEE仍待评分。这项测试验证偏好只改变已评分合格股票的顺序,不能改变同一硬规则的淘汰集合。
不同机制反例是给CCC的优秀名次足够多奖励,再对低成交金额扣一点分。这样的综合分可能让CCC进入前列,虽然每一步加减乘除都没有错。问题来自准入政策被放进可补偿的分数,而不是算术精度。样例专门断言改权重后CCC仍不在结果中,避免只看最高分而漏掉政策失效。
再把权重设为0.50,AAA、BBB、DDD都得到2.00。脚本按标识排为AAA、BBB、DDD;这是复现规则,不表示AAA经济上更优。如果两个研究名额刚好切开并列组,应公开并列和处理办法。也可以预先规定把整组都研究,或暂取更少股票,但不能看到公司名称后才临时选择有利的规则。
保存完整顺序与截取理由
交付物包括带理由的淘汰表、合格待评分表、完整评分表和截取后的研究名单。保存股票池版本、硬规则版本、偏好定义、权重、分数方向和并列政策。仅保留两个名字无法说明第三名是“不合格”,还是只是研究容量不够;这会影响后续补查安排。
新数据到来时先重跑准入,再重跑排序。已经不合格的股票不能因为上次排得靠前而留下。比较权重方案时应固定数据快照,让次序变化能归因于偏好。补齐EEE之后,如果名次总体随之改变,就重算受影响名次,不能把新股票直接插进过期顺序。
字段不可比时按市场或同行组分别研究。这套流程用于分配研究精力,不直接决定组合权重,也没有验证交易策略收益。验收要求更具体:每只入选股满足硬条件,每个总分可以还原,缺值仍然可见,同样输入重复执行得到同样研究顺序。做到这些,有限的研究时间才有一张能解释、能维护的分配表。
把截断当作研究容量决定来核对
截取前两个名字以前,先展示完整合格评分顺序和待评分数量,确认“两只”是研究容量,而不是隐藏的分数门槛。容量改为三只时,BBB可以加入偏估值研究清单,但它的准入资格没有变化;容量仍为两只而并列政策改变,则单独记录政策版本,不与权重修订混在一起。这样读者知道名单缩短是时间限制,而不是第三名突然不合格。
为每行保留贡献台账,包含两项名次、各自权重和未舍入总分。让审阅者从台账直接还原一个偏估值得分和一个偏增长得分,再检查CCC确实位于淘汰表、EEE确实位于待评分表,没有在报告中消失。原始五只股票分别落入三只评分、一只淘汰、一只待补的明确去向,数量必须相加回原股票池。
权重比较应把相同股票并排展示。如果一边调权重一边更换比较总体,就无法干净解释顺序为何移动。还要保存评分使用的名次版本;名次被重新计算后,即使权重没变,分项贡献也可能改变。发现变化时先区分排名输入更新与偏好更新,再写研究优先级解释。
并列截断的决定应在看见公司身份前确定。标识排序可以让样例稳定复现,却不能为经济优先性提供证据。若研究者希望额外使用风险或资料可得性打破并列,就明确新增次级偏好及其数据,不要把主观选择隐藏成默认排序。每加一层规则,都要继续满足硬条件与偏好分开的约定。
研究队列实际开始后,也应保留截取当时的完整顺序。有人临时先读第三名,不需要回写评分来证明安排合理;另记人工调整原因即可。任务完成数量与入选数量分开统计,避免未读完股票被当成评分失败。下次按新数据重排时,使用新的运行编号,并保持上次名单能够回看。这样排序输出既可以驱动工作安排,也不会为了迎合实际阅读顺序而改写历史。
若以后增加更多偏好指标,先确认每项方向与权重总和,再用一个强偏好但硬条件失败的样例重测。指标越多,越容易让一个看似合理的总分掩盖资格约束;原来的CCC反例应始终保留。
常见问题
缺偏好值都给最差名次可以吗?
可以作为经过确认的政策,但不能默认如此。本例保留待评分状态,不把缺失当成已观察到的弱项。
排名第一是否就应该买入?
不是。它只在选定偏好下分配研究注意力,不等于盈利预测或投资组合配置。