自选股二次筛选:在已有名单里找出值得继续研究的股票
对已有自选股筛选,是封闭股票池任务:保留原名单每行,确认对应证券,取得所需观测,再把结果写回原行。全市场选股器添加名单外的优秀股票,回答的是另一道请求。最终研究清单可以按证券去重,但逐行表必须解释用户提交的每个条目发生了什么,不能只把通过股票留下。
本文用六行合成名单、固定身份映射和模拟数据表,实际复用重复请求并执行逐行筛选,不调用真实身份服务,也不证明CoTrading已有自定义名单页面。尤其不能把参考工具的预置股票池静默替换用户名单。产品承接仍为规划或待核实,示例只证明独立流程的操作。
解析证券前先保留原行身份
输入后立即给每行稳定编号,再做空格修整、符号标准化或重复识别。保留用户原字符串及备注;同一代码出现两次,可能对应不同研究笔记。取一次数据很有用,未经约定删除第二原行却会丢上下文。行编号与证券编号承担不同职责,不应该相互替代。
CSV输入使用真正解析器,证券标识按文本保留。Python CSV参考说明行与字典读取。解析器可以保存列结构,却不能判断短代码是否指向用户想研究的证券。不要先转整数丢前导零,也不要把文件里的代码排序后覆盖原顺序,导致无法逐行回填。
身份记录应包括确认证券、市场或交易所、必要时的股份类别,以及映射依据。OpenFIGI官方文档展示可带交易所上下文的标识映射及返回证券信息。本例不调用其接口,也不保证某个输入总能被该服务唯一解析。得到多个匹配时,仍需要补充上下文或人工确认。
明确封闭名单的解析政策
六行分别为AAA.US两次、BBB.HK、模糊代码XYZ、无效条目BAD.US和CCC.CN。后缀只是合成样例标记,不是所有供应商统一标准。固定映射确认前三个唯一有效身份;XYZ故意缺市场信息,BAD.US在样例里明确标为未找到。真实应用不能仅从字符串长得像代码就推断有效。
实际任务中,未找到与身份服务请求失败必须分开。一次请求超时不能证明证券不存在;多个匹配不能默认取第一条,更不能搜索相近公司填补原行。保留解析证据与时间,方便后续确认哪一项是歧义、来源覆盖不足还是输入真的写错。
同一请求身份的解析结果可以复用,再回填所有原行。不同字符串若最终指向同一证券,也可以按规范身份共享数据取得,但需要保留两条原文及映射依据。短样例只演示完全相同字符串重复,不假装已实现通用别名解析器或跨市场证券主数据服务。
只为已确认的唯一证券取得数据
模拟来源给AAA.US市盈率18,BBB.HK为22,CCC.CN没有可用市盈率。还故意包含名单外OUTSIDE.US,市盈率10,看起来更符合筛选条件。正确请求集合只有AAA.US、BBB.HK和CCC.CN,不能遍历供应商表把额外股票顺手选进来。
if symbol not in cache:
calls.append(symbol)
cache[symbol] = source.get(symbol)
value = cache[symbol]
state = "unknown" if value is None else "pass" if 0 < value < 20 else "fail"
output.append({"row_id": row_id, "requested": requested,
"pe": value, "state": state})
这段展示身份确认后的缓存与结果回填,完整文件先处理歧义和未找到分支。数值规则为正市盈率低于20,真实跨市场名单还要核对盈利期间和定义。不同市场都有一列PE,不代表已经可以直接比较;必要时分别声明适用条件与待补字段,不用另一指标替代通过。
取得状态与字段可用性也分开。CCC.CN身份已确认,却缺筛选字段,下一步是补数或查来源;XYZ必须先确认对象,才能提出有意义的行情或财务请求。把两者都写成失败,会让处理人员不知道先修代码还是先查数据。
检查实际逐行输出
下载完整示例。使用Python 3.12+与标准库,全部合成数据,运行python R524.py。作者源文件为docs/growth/research/round-5/examples/R524.py。
| 原行 | 输入 | 市盈率 | 状态 |
|---|---|---|---|
| 1 | AAA.US | 18 | 通过 |
| 2 | AAA.US | 18 | 通过 |
| 3 | BBB.HK | 22 | 不通过 |
| 4 | XYZ | 不可用 | 身份歧义 |
| 5 | BAD.US | 不可用 | 未找到 |
| 6 | CCC.CN | 不可用 | 字段未知 |
实际输出保持1到6行顺序。取得清单只有三个唯一确认证券,AAA只请求一次;去重研究名单只有AAA.US。断言核对六个状态、原行对应、确认身份各一次请求,以及任何输出行都没有OUTSIDE.US。重复条目仍有独立行号,便于用户回到原备注继续研究。
两行通过不代表两家独立公司。逐行表保留用户上下文,唯一证券表用于安排研究容量,两种输出同时存在,避免在丢备注与虚增公司数之间二选一。若用户明确希望删除重复原行,也应保存转换映射,使旧行号仍能找到新位置。
用更有吸引力的名单外股票反证
OUTSIDE.US的市盈率比部分原条目更低,但它不属于请求范围。错误实现若遍历来源表而不是确认请求集,就会把它放行。样例故意保留这个诱惑并断言输出无它,抓住的是封闭股票池边界,而不是数值比较错误。只测试原名单里几只股票,很容易漏掉这种范围扩张。
歧义代码又是另一机制,不能通过数值拒绝来修复,因为尚未评估一个确定证券。身份队列保留原行和缺失上下文;未找到条目保留解析证据;字段未知连接到已确认证券的数据缺口。每条后续动作应针对具体原因,不能都变成一条泛化的重新搜索。
名单很短或部分条目不可得时,也不能改用预置指数池。那会改变范围和分母。如果用户希望扩大研究,可以另建有明确标签的市场扫描,同时保留本次自选股结果。不要把外部更多候选看作修好原名单的证据;补完每个原条目的状态才是这项任务的验收。
交付不丢输入约定的结果包
保存原名单、身份映射、唯一取得台账、逐行结果与去重研究清单。六行输入对应六行输出;唯一确认证券数与实际请求数另行对账;取得字段可用数又是第三个统计。每个分母回答不同问题,报告中应明确命名,不能把原行数当公司覆盖数量宣传。
新数据快照到来时,按同一确认股票池重跑并生成新运行编号。身份更正时,撤销受影响映射及下游观测,再回填对应原行;用户新增股票则建立新名单版本,不静默改变保存范围。某条原备注改变不必重新取所有行情,但应保留备注与当前行的关系。
审阅者至少追查一条重复行、一个数值失败、一个歧义输入和一个缺指标。确认每个原条目都有解释与下一步,没有额外证券加入。输出不仅要能看,还应能按原行号重新连接用户文件;写回时避免重排序造成备注错位。真实文件写回需另做编码与列序检查,短样例打印结构不能代替磁盘交付验收。
当这些关系保持完整,自选股筛选才成为可重复研究操作。它不是戴着自选股名称的全市场扫描,也不把缺身份与缺数值混成投资判断。用户可以沿原名单继续处理每一行,同时用去重清单安排下一轮工作。
保持原行与公司的两个视角
回写用户文件使用原行表,分配研究任务使用唯一证券表。同一公司可以连接多条输入备注,但不产生多次取得调用,也不增加独立筛选机会。保存映射关系,后续审阅者不必靠重复名称猜哪些行应当共享数据。公司改名或代码别名变化后,原文也仍能追到当前确认身份。
回写前验证行编号唯一,原备注仍属于同一行。数值筛选可能完全正确,排序导出却把结果贴到另一家公司备注上;对应关系因此是验收条件,不是纯界面细节。若输出格式不保留隐藏编号,就应明确提供可见行号或另一份对照,不能依赖当前显示顺序永远不变。
来源多返回一只证券,记录范围外而不放入后备清单;少返回一只请求证券,仍保留原行及相应取得状态。两边对称检查才能同时防止扩池和缩池。源响应形状与用户请求不同,并不允许改变输入分母。最终逐行对账通过后,才能说原名单全部得到处理,而不是仅成功证券得到展示。
下次用户编辑名单时,也应区分备注修订与证券身份改变。前者可以复用仍有效的数值,后者需要重新确认对象及数据来源。把这两个动作混同,可能造成旧公司观测挂在新公司名称下,比一个明确缺值更难被发现。
常见问题
重复原行应该删除吗?
不要默认删除。共享取数,保留原行,在明确政策下只对研究清单去重。
代码未解析就表示筛选不通过吗?
不是,身份尚未建立,还没有有效数值判断。