策略研究闭环:原理、操作与运维手册
更新时间:2026-08-28
适用版本:当前 stock-screener-web 研究闭环版本
适用角色:策略研究员、交易员、系统管理员
1. 文档结论
当前系统已经把原有选股方法和策略研究流程分开:
- 原有选股模式不变:
收盘技术筛选 -> 概念共振 -> 次日集合竞价确认; - 研究闭环不直接改写选股逻辑,只研究允许调整的数值参数;
- 一只股票被选中,只代表产生了一个信号,不代表它是正样本;
- 市场未来真实且可成交的结果,才负责生成正、负、中性或不可交易标签;
- 候选参数必须先通过带隔离期的 Walk-forward 样本外验证,再通过未来独立影子运行,最后才能由管理员人工启用;
- 回测失败、样本不足或影子表现不如当前正式版本时,正确动作是拒绝晋级并继续积累证据,而不是反复降低门槛直到通过。
完整主流程如下:
当前正式参数(champion)
|
v
交易日收盘后正式扫描
|
+--> 原有业务结果:严格股池 / 候选观察 / 概念信息
|
+--> 研究快照:保存当时全部成功评估股票的特征和条件结果
|
v
未来行情成熟并生成客观标签
|
v
冻结研究数据集
|
v
受约束训练候选参数
|
v
Purged Walk-forward 样本外验证
|
通过 / 不通过
|
通过后自动进入独立影子运行
|
收盘候选+概念 -> 次日竞价 -> 未来结果
|
与同期 champion 成对比较
|
v
双门禁通过 -> 管理员启用 challenger
|
v
新 champion -> 持续监控 -> 回滚或下一轮研究
这套闭环的目标是提高策略在新数据上稳定有效的概率,不保证胜率必然上升,也不构成任何收益承诺。
2. 不会被研究闭环改变的选股模式
研究闭环建立在当前选股流程之上,不改变以下业务顺序:
- 收盘阶段先检查技术条件:下杀后横盘、倍量试盘、均线三点金叉、DMI、KDJ 和 MACD;
- A 股再检查概念板块涨停共振;
- 通过收盘条件的股票进入正式收盘股池;
- 与严格版相似、但未全部通过的股票进入候选观察,仅供人工复核;
- 次日 9:25 后,A 股正式股池和候选观察分别检查集合竞价金额条件;
- 港股不适用当前 A 股集合竞价规则,按适用性跳过该阶段。
严格逻辑中的关键关系被锁定,优化器不能取消,例如:
- 严格版试盘 K 线必须都有上影线;
- 三个均线上穿点必须落在规定窗口;
- 信号日必须是 MA10 上穿 MA20;
- 严格版信号日必须满足
MA5 > MA10 > MA20; - 条件开关、市场范围、概念阶段和竞价阶段不能被自动训练改变。
研究闭环只允许在人工批准范围内调整部分数值阈值。即使某个候选参数训练内表现很好,也不能跳过样本外回测和影子运行。
3. 必须先区分的对象
| 对象 | 实际含义 | 是否为正样本 | 是否能直接启用 |
|---|---|---|---|
| 严格收盘股池 | 当日收盘条件全部通过的业务选股结果 | 否 | 不适用 |
| 候选观察 | 与严格版接近但仍有条件未通过的股票 | 否 | 不适用 |
| 研究特征快照 | 信号日当时可见的条件、指标、参数和数据质量 | 否 | 否 |
pending 标签 |
未来持有期还没有结束 | 否 | 否 |
positive 标签 |
按统一成交规则,净收益达到正样本门槛 | 是 | 否 |
negative 标签 |
净收益达到负样本门槛或止损 | 否 | 否 |
neutral 标签 |
已成熟,但结果处于正负门槛之间 | 否 | 否 |
untradable 标签 |
停牌、一字板或无成交量等导致无法按规则成交 | 否 | 否 |
| 冻结数据集 | 某个标签政策下不可修改的一组成熟样本 | 包含所有类别 | 否 |
| 候选实验 | 在一个冻结数据集上训练得到的一次不可变研究记录 | 不适用 | 否 |
| challenger | 等待 Walk-forward 或正在影子运行的候选参数版本 | 不适用 | 否 |
| champion | 当前正式启用、作为比较基准的研究参数版本 | 不适用 | 已启用 |
最容易产生误解的是“候选观察”“候选参数”和“正样本”:三者是完全不同的对象。
4. 页面入口、权限和旧功能边界
4.1 页面入口
主入口:登录系统后,打开左侧的“策略学习”,页面标题为“策略研究闭环”。
“个股复盘”是人工研究支线,可以产生参数假设,但不能绕过主入口的研究门禁。
4.2 账号权限
生产环境按角色控制服务端权限:
| 角色 | 主要权限 |
|---|---|
viewer |
查看研究快照、数据集、实验、候选状态和发布审计 |
analyst |
包含查看权限;可运行正式选股、参数回测和补齐结果标签 |
admin |
包含以上权限;可历史回填、冻结数据集、训练、运行 Walk-forward、修改影子门槛、启用和回滚 |
本地开发模式显式关闭认证时,系统使用开发管理员身份。生产部署不能以此模式运行。
4.3 三个容易混淆的功能
| 功能 | 定位 | 是否为正式发布门禁 |
|---|---|---|
| “参数回测”页面 | 比较当前、严格版、观察版或旧候选的辅助技术回放;参数按折冻结,不逐折训练 | 否 |
| “策略学习”中的 Walk-forward | 每折仅用过去数据重新训练,再评价未来测试段 | 是,第一道强制门禁 |
| “历史兼容学习记录” | 旧 learning_loop.json 的只读展示和迁移审计 |
否 |
正式候选是否可以启用,只看新研究闭环中的 Walk-forward 和独立影子运行,不看旧版观察池或辅助参数回测页面的“通过”提示。
5. 研究数据对象与不可变原则
研究库将每个重要对象版本化:
| 对象 | 保存内容 | 版本规则 |
|---|---|---|
| 策略定义 | 条件关系、阶段顺序和不可破坏边界 | 固定定义,不由训练修改 |
| 参数版本 | 完整参数和值 | 按内容生成唯一 ID |
| 标签政策 | 正负阈值、持有期、费用、滑点和退出规则 | 修改任一字段即生成新版本 |
| 收盘快照 | 交易日、行情源、市场范围、参数、数据质量和全部特征行 | 重复扫描保留修订;同一范围只有最新修订标记为当前 |
| 冻结数据集 | 特征 ID、标签 ID、日期和市场范围 | 创建后成员不覆盖 |
| 训练实验 | 基准参数、候选参数、训练指标、参数变化和来源 | 创建后不覆盖 |
| Walk-forward | 配置、每折参数、测试样本、指标、门禁结论 | 相同实验和配置复用已有结果 |
| 影子信号 | challenger/champion 的收盘、概念、竞价和未来结果 | 按候选版本和特征唯一保存 |
| 发布记录 | 启用或回滚、操作者、原版本、目标版本和原因 | 追加式审计 |
同一交易日、同一股票可能来自正式扫描和历史回填。冻结数据集时会去重,并优先使用 formal_close 正式快照,而不是较低可信度的 historical_backfill。
6. 步骤 0:确定本轮研究基准
在开始一轮研究前,先明确本轮 baseline/champion:
- 如果已经有正式启用的研究版本,参数目录会出现“当前研究版”;当前浏览器在启用成功时会立即应用它;
- 如果还没有研究版,就使用本轮正式收盘股池实际保存的参数作为训练基准;
- 如果连正式收盘股池也不存在,后端才会退回系统默认参数;
- 正式扫描仍以页面实际提交的参数为准,服务端不会强制把所有扫描改成当前研究版;每次正式建池前必须核对所选方案;
- 浏览器中已保存的自定义参数可能覆盖初始方案。发现页面显示“自定义”时,应先核对再运行正式建池;
- 不要在一次研究中途随意改变选股范围、标签政策或费用口径;需要改变时,应重新冻结数据集并创建新实验。
建议在实验记录中备注当时使用的市场范围、数据源和参数方案。系统会保存这些字段,但人工研究目的仍需要统一。
7. 步骤 1:建立研究快照
研究快照有两种来源:日常正式收盘扫描和首次使用时的历史冷启动回填。
7.1 日常正式收盘扫描
页面操作:
- 打开“选股工作台”;
- 选择当前正式参数、行情来源和市场范围;
- A 股应在 15:00 后运行,包含港股时建议在 16:00 后运行;
- 点击“运行收盘建池”;
- 等待状态变为完成,不要把盘中预览当成正式收盘结果。
系统会同时完成四件事:
- 保存原有正式股池;
- 保存包含严格结果和候选观察的扫描报告;
- 将本轮所有成功完成技术评估的股票写入不可变研究快照,不只保存页面展示的股票;
- 对处于
shadow_running、shadow_passed或active状态的版本,分别用 challenger 和它冻结的 baseline/champion 计算独立影子收盘信号。
只有满足以下条件的扫描才会写正式研究快照:
- 模式是收盘模式;
- 已通过完整交易日校验;
- 正式股池和扫描报告已成功保存;
- 不是盘中预览。
快照保存的是“当时知道什么”,包括:
- 股票代码、名称、市场和信号日;
- 数据源和数据质量;
- 本轮完整参数及参数版本;
- 六项技术条件结果;
- 概念阶段是否可用、是否评估;
- 严格匹配、相似度、核心分和趋势分;
- 横盘、试盘、均线、DMI、KDJ、MACD 等原始指标;
- 行业和概念上下文(当时可获得时)。
行情缺失或无法完成技术计算的股票不会伪造特征。研究快照中的 feature_count 应与本轮实际可保存特征数一致,不一定等于证券目录总数。
7.2 历史冷启动回填
用途:新系统没有足够正式快照时,用历史日 K 重建较低可信度的技术研究样本,以便先运行训练和 Walk-forward。
页面操作:
- 打开“策略学习”;
- 在“步骤 1 · 冷启动工具”选择行情源;
- 选择 A 股、港股或两者;
- 默认“最多信号日”为 180,“每日保存目标上限”为 600;
- 日期留空时,系统选取最近能够成熟的交易日;
- 如只研究指定股票,可输入代码并用逗号、空格或分号分隔;
- 点击“开始历史回填”;
- 任务较长时可点击“停止回填”,系统会安全结束并保留已经完成的日期。
历史回填按每个历史日期切断 K 线,计算当时可见的技术特征,不使用未来收益选择样本。每个日期保存的研究队列由以下部分构成:
- 当时严格技术规则命中的股票;
- 按严格版相似度排序的高相似候选;
- 用交易日和股票代码确定性抽取的对照样本。
在剩余容量内,高相似候选约占 85%,其余为确定性对照。未来结果只在队列确定后用于生成标签。
“每日保存目标上限”用于限制高相似候选和对照样本;严格技术命中会优先完整保留,因此极少数严格命中数本身超过上限的日期,实际保存数可以高于该值。
历史回填有四个必须保留的限制:
| 限制 | 影响 |
|---|---|
| 使用当前证券目录 | 缺少已退市股票,存在生存者偏差 |
| 没有历史时点概念目录 | 不能完整复原条件 4 |
| 没有历史集合竞价金额 | 不能完整复原条件 5 |
| 每日按队列上限保存 | 不是无损的历史全市场快照 |
因此历史回填只能用于冷启动训练和技术阶段 Walk-forward,不能替代未来影子运行。
历史回填和正式选股共用行情任务资源,两者互斥:
- 正式选股运行时不能启动历史回填;
- 历史回填运行时不能启动正式选股;
- 需要收盘建池时,应先取消回填并等待状态进入“已取消”。
8. 步骤 2:补齐未来结果标签
页面操作:
- 打开“策略学习 -> 补齐未来结果标签”;
- 首次使用建议保持默认标签政策;
- 设置单批补齐数量,默认 1000;
- 点击“评估待成熟样本”;
- 如果仍有大量
pending,可稍后重复执行。
系统也会在服务启动和正式收盘扫描完成后,后台尝试分批补齐标签。手工按钮用于立即检查或补齐积压任务。
8.1 默认标签政策
| 字段 | 默认值 | 含义 |
|---|---|---|
| 正样本净收益 | >= 3% |
扣除费用和滑点后的最终净收益达到 3% |
| 负样本净收益 | <= 0% |
最终净收益不高于 0%,或按退出规则止损后落入该区间 |
| 中性样本 | 0% < 收益 < 3% |
已成熟但方向不够明确 |
| 最大持有期 | 20 个交易日 | 未提前退出时的最长持有时间 |
| 费用 | 20 bps | 模型按买卖两侧分摊 |
| 滑点 | 5 bps | 每次成交按不利方向计入 |
| 入场模型 | 次一交易日开盘 | 必须满足真实可成交性 |
标签不是看未来最高价,而是完整模拟可成交入场、止损、止盈、时间退出、费用和滑点后的结果。
8.2 标签状态
| 状态 | 产生条件 | 后续处理 |
|---|---|---|
pending |
未来数据不足,或尚未完成退出 | 等待更多交易日后重试 |
positive |
净收益达到正样本门槛 | 进入成熟数据集 |
negative |
净收益不高于负样本门槛 | 进入成熟数据集,是重要困难负样本 |
neutral |
介于正负阈值之间 | 进入成熟数据集,防止二元标签失真 |
untradable |
次日停牌、无量或一字涨停等无法买入 | 进入成熟数据集,用于约束不可交易率 |
每个快照使用它记录的数据源补齐行情。某个行情源暂时离线时,该源的标签会保留待处理,其他来源已有标签不会被破坏。
8.3 修改标签政策时会发生什么
修改正负阈值、持有期、费用、滑点或退出参数会生成新的标签政策 ID,不会覆盖旧标签。之后必须:
- 重新补齐该政策下的标签;
- 用新政策重新冻结数据集;
- 创建新实验;
- 重新执行 Walk-forward 和影子运行。
不能用旧政策训练的数据集,配合新政策的回测结果进行比较。
当前页面直接开放正负阈值、最大持有期、费用和滑点;其他止盈止损字段来自共享交易规则,需要通过系统配置或管理接口修改,并同样会形成新的标签政策。
9. 标签使用的止盈止损模型
标签和 Walk-forward 共用同一个交易模拟器,避免训练、回测和影子评价使用不同收益口径。
9.1 止损规则
默认风险止损为次日入场价的 -3%。如果信号日是阳线,还会计算结构止损:
- 信号日阳线实体涨幅不大于 5%:结构止损为信号日开盘价;
- 信号日阳线实体涨幅大于 5%:结构止损为阳线实体中点;
- 信号日不是阳线:不使用结构止损。
实际止损价取风险止损与结构止损中更高、也就是更严格的价格。
执行顺序:
- 当日开盘已经低于止损价,若可成交则按当日开盘立即退出;
- 盘中触及但收盘没有确认跌破,不视为确认止损;
- 收盘低于止损价,标记确认跌破,在下一可交易日开盘退出;
- 一字跌停或停牌无法卖出时,顺延到下一可交易日。
9.2 建仓量能和量能止盈
默认在信号日前 33 个交易日中寻找离信号日最近的建仓量能事件:
- 单日倍量:当日成交量至少为前一日 2 倍,视为单日建仓,基线就是该日成交量;
- 逐级上推堆量:至少连续 3 日,每日量能相对前 5 日均量达到 1.5 倍且逐日增加;基线取该堆量末日前一日成交量;
- 如果逐级堆量最后一天突然达到单日倍量标准,该日按单日建仓处理,基线改为最后一天。
系统识别进入拉升阶段后,如果出现连续两天成交量超过基线,且至少一天达到前 5 日均量的 1.2 倍:
- 普通量能突破默认减仓 50%;
- 当日量能同时超过拉升以来所有前序量柱,默认减仓 70%。
止盈信号在下一可交易日开盘执行。
9.3 最大量真阴止盈
拉升阶段出现以下组合时触发:
- 前一日为阳线,当日为阴线;
- 阴线实体切入前一日阳线实体,或形成更强的向下缺口破位;
- 当日成交量超过拉升以来所有前序量柱;
- 当日成交量至少为前 5 日均量的 1.2 倍。
默认退出比例:
- 标准切入:50%;
- 切入深度达到前阳实体 50%:70%;
- 完全吞没或强破位:100%。
9.4 时间退出和当前限制
- 到最大持有期仍有仓位时,按最后交易日收盘退出;
- 当日无法成交时,顺延到下一可交易日;
- 当前行情源没有可按日回放的历史筹码分布,所以“筹码峰松动止盈”会标记为不可用,不计入回测和标签。
完整规则原始说明见 STOP_PROFIT_STOP_LOSS_RULES.md。
10. 步骤 3:冻结研究数据集
页面操作:
- 在“冻结研究数据集”选择开始和结束交易日;
- 日期留空表示使用该标签政策下当前全部成熟样本;
- 选择 A 股、港股或两者;
- 点击“冻结当前数据集”;
- 创建后在下方确认成员数和正、负、中性、不可交易分布。
冻结过程遵循以下规则:
- 只纳入当前标签政策下已经成熟的标签;
pending不进入数据集;- 同一信号日、同一股票只保留一条;
- 同时存在正式和历史回填记录时优先正式记录;
- 数据集创建后成员不修改;后续新样本需要创建新的数据集版本;
- 数据集保留所有成熟类别,不只保留正样本。
建议研究时记录:
- 数据集 ID;
- 日期范围;
- A 股和港股是否混合;
- 标签政策 ID;
- 正负中性和不可交易数量;
- 正式快照与历史回填的占比。
不要为得到更好结果,在看过回测以后再删除失败样本或改变数据集成员。
11. 步骤 4:训练受约束候选参数
页面操作:
- 在“训练数据集”选择刚冻结的数据集;
- “最低入选样本”默认 8;
- 点击“训练候选版本”;
- 在“候选实验与发布门禁”查看训练内指标和参数变化。
训练至少需要:
- 2 个
positive; - 2 个
negative、neutral或untradable组成的非正样本; - 候选规则至少选中设定的最低样本数,否则目标函数给予大幅惩罚。
11.1 自动允许学习的参数
| 参数 | 自动搜索范围 |
|---|---|
| 横盘振幅上限 | 5% - 60% |
| 横盘斜率绝对值上限 | 1% - 30% |
| 横盘结束容差 | 0 - 10 个交易日 |
| 前段最小跌幅 | 5% - 70% |
| 试盘最低量倍数 | 1.2 - 8 倍 |
| 最后一根试盘上影上限 | 0.2% - 12% |
| 均线三点金叉窗口 | 1 - 30 个交易日 |
| DMI 金叉窗口 | 1 - 30 个交易日 |
| KDJ 最低值 | 0 - 100 |
| MACD 轴线下限 | -10 - 10 |
优化器采用受约束坐标网格搜索。每个参数会从基准值和样本分布的 10%、25%、50%、75%、90% 分位候选中选择,默认最多执行两轮。
训练目标主要由以下部分构成:
- 胜率的 Wilson 95% 下置信界;
- 对全体正样本的召回率;
- 截断后的平均净收益;
- 最低入选样本数量约束。
这意味着系统不是单纯追求训练集最高胜率,而是同时约束统计可信度和漏选正样本。
11.2 自动不能修改的参数
锁定参数包括:
- 严格版/观察版逻辑类型;
- 试盘必须有上影线;
- 信号日必须 MA10 上穿 MA20;
- 各条件是否启用;
- 概念与竞价条件开关;
- 市场范围和股票代码范围。
仅允许人工调整、不会被训练自动修改的参数包括:
- 横盘天数和下杀回看窗口;
- 试盘窗口、均量天数、试盘根数和强倍量门槛;
- 概念涨停天数、数量门槛;
- 集合竞价金额倍数;
- DMI 和 KDJ 计算周期等。
训练完成后,候选状态为 awaiting_walk_forward。训练内胜率和平均收益只是拟合结果,不是启用证据。
12. 步骤 5:运行 Purged Walk-forward
页面操作:
- 在“Walk-forward 样本外验证”设置窗口和门槛;
- 在下方对应实验卡点击“运行 Walk-forward”;
- 任务进入后台,等待状态从“正在验证”变为通过、证据不足或失败;
- 查看每折结果、总体门禁原因、技术入选数量以及概念和竞价覆盖率。
12.1 每一折如何运行
|--------- 训练窗口 ---------|---- 隔离期 ----|---- 测试窗口 ----|
只用当时已经知道结果的样本 不训练、不评分 只评价,不反向训练
|
+--> 本折重新拟合参数 --> 冻结 --> 测试
每一折都会执行:
- 只提取测试开始前的训练窗口;
- 进一步删除在训练截止日仍不知道退出结果的样本;
- 在剩余训练样本上重新拟合本折候选参数;
- 隔离期不参与训练和评分;
- 用本折冻结参数评价后续测试窗口;
- challenger 和 baseline 使用相同日期、相同股票集合、相同标签和交易规则;
- 保存本折拟合参数、入选特征 ID、指标和失败原因。
隔离期会自动提升到不短于标签政策的最大持有期。页面即使输入 5 日,而最大持有期是 20 日,实际隔离期仍会使用 20 日。
人工样本产生的假设还会增加预注册截止日:假设使用过的最后信息日期及以前开始的测试折会被自动排除,防止用产生假设的历史再次证明该假设。
12.2 默认配置
| 参数 | 默认值 |
|---|---|
| 训练窗口 | 60 个信号日 |
| 隔离期 | 20 个信号日,且不短于最大持有期 |
| 测试窗口 | 20 个信号日 |
| 滚动步长 | 20 个信号日 |
| 最少完整折 | 3 折 |
| 每折训练最低入选 | 8 条 |
| 每折测试最低入选 | 2 条 |
| 样本外最低总入选 | 8 条 |
| 最低折通过率 | 60% |
| 最低样本外胜率 | 50% |
| Wilson 95% 下置信界 | 35% |
| 相对 baseline 允许落后 | 0 个百分点 |
在默认 20 日持有期下,至少需要:
60 个训练日 + 20 个隔离日 + 20 个测试日 x 3 折 = 140 个不同成熟快照日期
实际可能需要更多日期,因为:
- 某些日期没有足够可计算股票;
- 标签到训练截止日时仍未成熟,会被清除;
- 人工假设的预注册截止日会排除较早测试折;
- 候选规则实际入选样本可能少于门槛。
12.3 每折门禁
每个有效测试折同时要求:
- 入选成熟样本达到最低数量;
- 胜率达到门槛;
- 平均净收益大于 0;
- 净收益中位数大于 0;
- 胜率不劣于同折 baseline;
- 平均净收益不劣于同折 baseline。
12.4 总体门禁
总体还要求:
- 完整折数达到门槛;
- 所有测试折的入选总数达到门槛;
- 折通过率达到门槛;
- 总体胜率和 Wilson 下置信界达到门槛;
- 总体平均和中位净收益为正;
- 总体胜率和平均收益不劣于 baseline。
结果状态:
| 状态 | 含义 | 后续动作 |
|---|---|---|
passed |
所有总体门禁通过 | 自动进入影子运行 |
insufficient_evidence |
折数或入选样本不足 | 增加历史日期或继续积累正式快照 |
failed |
证据充足但质量门槛未通过 | 保留失败实验,重新研究假设 |
queued/running |
后台任务尚未完成 | 等待并刷新页面 |
12.5 概念和竞价在历史回测中的处理
当前 Walk-forward 的强制统计门禁作用于收盘技术阶段。系统会报告概念和竞价的历史覆盖率,但:
- 缺少历史概念数据时不会假定条件 4 通过;
- 缺少历史竞价数据时不会假定条件 5 通过;
- 完整三阶段策略的验证由后续真实前瞻影子运行承担。
因此,Walk-forward 通过表示“技术参数在历史样本外有资格进入前瞻验证”,不表示完整策略已经可以启用。
13. 步骤 6:独立影子运行
Walk-forward 通过后,候选自动进入 shadow_running,不需要人工加入观察股池。
13.1 每个交易日发生什么
收盘正式扫描时:
- 系统从本轮完整正式研究快照出发;
- challenger 用自己的冻结参数独立评价所有特征;
- baseline/champion 用实验创建时冻结的基准参数独立评价相同特征;
- 两者分别检查技术条件和当时可获得的概念条件;
- 影子候选不依赖正式股池、候选观察或 champion 先选中的股票。
次日集合竞价时:
- 系统读取所有等待竞价的 A 股影子代码;
- challenger 和 baseline 分别按自己的竞价参数判断;
- 港股或明确不适用竞价的信号直接进入结果等待;
- 竞价数据不可用时保持未确认,不会假定通过。
未来结果成熟时:
- 使用候选创建时绑定的标签政策生成结果;
- challenger 和 baseline 在同一交易日并列比较;
- 刷新影子门禁、风险指标、集中度和数据漂移。
13.2 默认影子门槛
| 指标 | 默认门槛 |
|---|---|
| challenger 成熟样本 | 至少 30 笔 |
| 独立市场日 | 至少 20 日 |
| 胜率 | 至少 50% |
| Wilson 95% 下置信界 | 至少 35% |
| 平均净收益 | 大于 0% |
| 中位净收益 | 大于 0% |
| 不可交易率 | 不高于 20% |
| 相对 champion 胜率允许落后 | 0 个百分点 |
| 相对 champion 平均收益允许落后 | 0 个百分点 |
样本数量和市场日不足时,门禁状态是 running,不是失败。达到最低证据后,如果质量指标未通过,页面仍显示影子运行并列出失败原因;新样本到来后会继续重新评估。
13.3 页面会额外展示的风险信息
- 影子成熟样本数和市场日数;
- 胜率、Wilson 下界、平均和中位净收益;
- 相对 champion 的胜率差和平均收益差;
- 盈亏比;
- 平均和最差最大回撤;
- 止损率和不可交易率;
- 单一股票、市场和行业最大集中度;
- 行业信息覆盖率;
- 训练样本与影子样本的特征漂移。
数据漂移按多项技术指标的标准化均值偏移计算。最大偏移达到 2.5 个训练标准差时显示警告,但当前漂移属于风险提示,不单独替代双门禁。
13.4 修改影子门槛
候选尚未正式启用或归档时,管理员可以展开候选卡中的“影子门槛”,修改并保存。保存后系统立即按新门槛重新评估。
研究纪律建议:
- 在开始影子运行前确定门槛;
- 不要因为看见不通过结果而不断下调门槛;
- 如确需改变,应将其视为新研究决策,并在实验记录中说明原因;
- 正式启用后门槛冻结。
14. 步骤 7:人工启用正式版本
只有候选同时满足以下条件,页面才显示“启用正式版本”:
- 绑定的 Walk-forward 记录状态为
passed; - Walk-forward 服务端门禁字段为通过;
- 候选状态为
shadow_passed; - 影子门禁字段为通过。
页面操作:
- 检查候选的样本外指标、影子指标、回撤、集中度和漂移;
- 点击“启用正式版本”;
- 在确认框中再次确认;
- 服务端重新检查双门禁;
- 启用成功后,该版本成为
active,原正式版本变为archived; - 页面自动把新参数应用为“当前研究版”。
启用的效果是:
- 新参数成为系统提供的“当前研究版”参数;
- 当前浏览器立即应用该版本;以后打开页面时仍需确认本地保存的自定义方案是否覆盖了初始选择;
- 下一次正式收盘扫描使用页面确认后的当前研究参数;
- 原始严格版和观察版仍然保留,不会被删除;
- 发布审计记录操作者、时间、来源版本和目标版本。
启用不会修改程序中的选股条件顺序,也不会自动改变概念、竞价、市场范围或手工参数。它也不会在服务端强制禁止用户选择严格版、观察版或自定义参数,因此正式运行纪律仍然重要。
15. 步骤 8:监控、回滚和进入下一轮
15.1 启用后监控
已启用版本继续参与每日影子记录,系统持续更新真实表现。建议重点观察:
- 最近 20、40、60 个市场日的胜率和净收益;
- 与上一 champion 的同日差异;
- 最大回撤、止损率和不可交易率;
- 行业或单股集中是否快速升高;
- 数据源质量是否变化;
- 特征漂移是否持续警告;
- 是否只在少数月份或板块贡献收益。
当前页面展示候选以来的累计指标。需要进行滚动窗口运营评价时,应冻结新数据集并创建下一轮实验,不要覆盖旧证据。
15.2 回滚
只有曾经正式启用过、当前处于 archived 的版本才能回滚,不能把从未通过门禁的候选伪装成回滚版本。
页面操作:
- 在历史正式版本卡点击“回滚到此版本”;
- 输入明确的回滚原因;
- 确认后目标版本恢复为
active; - 当前版本归档;
- 发布审计新增一条
rollback记录。
建议回滚触发条件在上线前约定,例如连续若干日相对 champion 退化、最大回撤突破限制、行情数据质量异常或策略适用市场发生变化。
15.3 下一轮研究
闭环不是训练一次后结束,而是:
新正式快照和失败样本积累
-> 用相同或新标签政策补齐结果
-> 冻结包含新增日期的新数据集
-> 训练新 challenger
-> 新一轮 Walk-forward
-> 新一轮未来影子运行
-> 保留或替换 champion
每一轮都生成新的数据集、实验、参数版本和门禁记录,不覆盖上一轮。
16. 人工“个股复盘”如何进入闭环
人工复盘是提出研究假设的入口,不是直接制造训练正样本的入口。
16.1 保存样本时选择发现时点
| 发现时点 | 含义 | 是否可参与参数假设提炼 |
|---|---|---|
实时发现 realtime |
尚未看到未来走势时记录 | 可以,在满足完整度和独立轮次后 |
事后复盘 post_review |
股票上涨后回看 | 只能进入假设库,不能进入无偏训练 |
人工保存时可标记:正样本、对照样本、置信度、起爆类型、标签和备注。人工标签只表达研究员判断,不会直接替代市场未来结果标签。
16.2 生成参数假设的门槛
默认至少需要:
- 8 个实时发现、数据完整度不低于 80% 的独立正样本轮次;
- 8 个实时发现、数据完整度不低于 80% 的独立对照轮次;
- 页面同时展示单股集中度,建议单股最大权重不超过 10%。
达到门槛后,在“个股复盘 -> 参数提炼”点击“生成候选参数”。生成的是 draft 参数假设,不具备启用权限。
16.3 提交统一实验
- 在“策略学习”先冻结一个全市场研究数据集;
- 回到人工参数假设卡;
- 选择该冻结数据集;
- 点击“提交统一实验”;
- 系统将人工假设中允许学习的数值作为优化初始值;
- 严格逻辑、开关、概念和竞价人工修改会被忽略;
- 人工样本直接训练权重为 0%;
- 优化器使用冻结数据集中的全部正、负、中性和不可交易样本重新训练;
- 系统冻结人工信息截止日,Walk-forward 排除截止日及以前开始的测试折;
- 相同参数候选会关联已有实验,避免重复增加证据权重。
提交后,人工候选与自动候选走完全相同的步骤 5、6 和 7。
17. 推荐操作节奏
17.1 每个交易日
| 时间 | 操作 | 目的 |
|---|---|---|
| A 股 15:00 后、港股 16:00 后 | 运行一次正式“收盘建池” | 保存业务股池、全市场特征快照和影子收盘信号 |
| 次日 9:25 后 | 运行“集合竞价检查” | 补齐 A 股正式、候选和影子竞价结果 |
| 收盘后或系统空闲时 | 点击“评估待成熟样本” | 补齐标签并刷新影子门禁 |
| 发现有代表性的实时案例时 | 立即在“个股复盘”记录 | 保留无后见偏差的专家信号 |
同一市场日不建议反复用不同参数执行多次“正式”扫描来挑选最好结果。如果确需重跑,系统会保留修订,但研究员必须知道最新修订会成为该范围的当前快照。
17.2 每周
- 检查待成熟标签和数据源错误;
- 检查正式快照是否连续;
- 检查影子候选是否正常产生收盘和竞价信号;
- 检查集中度、回撤和数据漂移;
- 记录市场环境和异常交易日,不急于重新训练。
17.3 每月或达到预定新增样本量时
- 冻结包含新增日期的新数据集;
- 创建新候选实验;
- 使用预先确定的 Walk-forward 门槛;
- 只有有明确新证据时才启动新 challenger;
- 对未通过版本保留失败记录,不删除。
18. 第一次使用的完整操作清单
- 用管理员账号登录并完成首次密码修改;
- 在首页确认目标行情源在线、缓存可用,A 股和港股范围正确;
- 选择准备作为基准的严格版、观察版或当前研究版;
- 收盘后运行一次正式“收盘建池”,确认“研究快照”数量增加;
- 如果成熟日期不足,运行历史冷启动回填,建议先用默认 180 个信号日;
- 回填完成后点击“评估待成熟样本”;
- 确认正、负、中性和不可交易四类都有数据;
- 冻结研究数据集;
- 训练候选版本;
- 使用默认 60/20/20、至少 3 折运行 Walk-forward;
- 如果证据不足,增加成熟日期,不要立即降低胜率门槛;
- Walk-forward 通过后,每日继续运行正式收盘扫描和次日竞价;
- 定期补齐结果标签,等待至少 30 笔、20 个市场日的影子证据;
- 双门禁通过后,检查风险指标并由管理员启用;
- 启用后继续监控,必要时回滚;
- 新样本达到预定数量后冻结新数据集,开始下一轮。
19. 状态说明
19.1 历史回填任务
| 状态 | 含义 |
|---|---|
queued |
已排队,尚未开始 |
running |
正在下载行情或重建快照 |
completed |
已完成 |
failed |
失败,页面显示错误原因 |
canceled |
用户安全取消 |
interrupted |
服务重启导致任务中断,已完成数据保留 |
19.2 候选参数版本
| 状态 | 含义 |
|---|---|
awaiting_walk_forward |
已训练,等待样本外验证 |
walk_forward_insufficient |
Walk-forward 证据不足 |
walk_forward_failed |
Walk-forward 指标未通过 |
shadow_running |
Walk-forward 通过,正在积累未来影子证据 |
shadow_passed |
双门禁中的影子门禁已通过,可人工启用 |
active |
当前正式研究版本 |
archived |
曾经正式启用,现已被替换,可作为合法回滚目标 |
19.3 影子信号
| 状态 | 含义 |
|---|---|
awaiting_auction |
A 股收盘条件通过,等待次日竞价 |
pending_outcome |
已完成竞价或无需竞价,等待未来交易结果 |
matured |
已绑定成熟结果标签,可进入影子统计 |
20. 常见问题和排查
20.1 为什么“运行 Walk-forward”后显示证据不足?
优先检查:
- 是否有至少 140 个不同成熟日期;
- 每个训练折是否有至少 2 个正样本和 2 个非正样本;
- 候选规则在每折是否至少选中 2 条、总体至少 8 条;
- 标签退出日期是否晚于训练截止日,导致样本被清除;
- 人工假设是否设置了较晚的信息截止日,排除了早期折;
- 日期范围是否只选了少数月份。
证据不足不是程序错误。先增加成熟日期,再考虑改变研究设计。
20.2 为什么冻结数据集是空的?
常见原因:
- 还没有正式快照或历史回填;
- 标签仍为
pending; - 当前页面标签政策与已有标签政策不同;
- 日期范围没有成熟样本;
- 只勾选了一个没有数据的市场。
先点击“评估待成熟样本”,再检查标签数量和日期范围。
20.3 为什么标签长期不成熟?
检查:
- 信号日后是否已经经过最大持有期;
- 原快照使用的数据源是否在线;
- 行情源是否返回信号日和足够未来 K 线;
- 股票是否停牌或无法退出;
- 单批补齐上限是否小于积压数量。
标签补齐按原快照数据源分组。不能因为某源暂时失败就静默改用另一来源,否则会改变研究证据口径。
20.4 为什么历史回填的概念和竞价覆盖率为 0?
这是当前数据限制,不是系统默认放行。历史回填只有点时技术 K 线,没有可靠的历史概念成分和竞价金额。完整条件 4、5 必须由未来影子运行验证。
20.5 为什么 Walk-forward 通过后,影子样本仍然是 0?
依次确认:
- 候选状态是否已经是
shadow_running; - 之后是否至少运行过一次新的正式收盘扫描;
- challenger 是否实际产生收盘信号;
- A 股信号是否在次日 9:25 后运行过竞价检查;
- 是否已过最大持有期或触发提前退出;
- 是否点击过标签评估。
历史回填不会直接生成未来影子证据。
20.6 为什么候选不能启用?
服务端会强制检查两道门禁。只要存在以下任一情况就会拒绝:
- Walk-forward 未通过或记录不存在;
- 影子样本或市场日不足;
- 影子胜率、Wilson 下界、均值或中位数未达标;
- 不可交易率超限;
- 影子表现劣于同期 champion;
- 候选状态还不是
shadow_passed。
页面没有显示“启用正式版本”按钮时,先阅读候选卡上的门禁原因。
20.7 为什么历史回填和收盘选股不能同时运行?
两者都会大量读取行情并写研究库。系统使用互斥准入锁避免下载竞争、限速失控和正式收盘快照被冷启动任务影响。收盘任务优先时应停止历史回填。
20.8 为什么训练结果与人工样本建议不同?
人工参数只作为可学习数值的初始假设,直接训练权重为 0。最终候选由冻结的全市场正、负、中性和不可交易样本重新拟合,所以结果可以回到基准值或选择其他分位值。
20.9 为什么出现“相同配置复用已有结果”?
实验、参数和 Walk-forward 配置按内容生成稳定 ID。重复提交相同参数或相同实验配置时,系统复用已有证据,避免把重复运行误当成更多独立样本。
20.10 启用后如何确认正式选股使用新参数?
启用成功后:
- 当前浏览器应显示并应用“当前研究版”;若显示“自定义”,先比较参数后再扫描;
/api/defaults中出现learned方案;- 下一次正式收盘股池保存的参数版本应与已启用候选一致;
- 发布审计中应有本次
activate记录。
21. 数据保存、备份和恢复
核心研究库默认是:
data/strategy_research.sqlite
其中保存:
- 策略和参数版本;
- 标签政策;
- 正式与历史回填快照;
- 特征与结果标签;
- 冻结数据集;
- 训练实验和每折 Walk-forward 证据;
- 独立影子信号及其未来结果;
- 历史回填任务状态;
- 启用和回滚审计;
- 旧学习记录的追加式审计副本。
完整备份建议同时包含:
strategy_research.sqlite及可能存在的-wal、-shm;backtests.sqlite;sample_lab.sqlite;auth.sqlite;close_pool.json;close_scan_report.json;learning_loop.json;level2_cache.sqlite;- 本地投研库。
备份时应停止服务,或使用 SQLite 一致性备份方式,不能只复制主数据库而遗漏正在使用的 WAL 文件。
Windows/TAT 部署把共享运行数据放在:
C:\stock-screener\data
发布 ZIP 不包含真实 .env、账号数据库、股池、研究库或缓存,升级时不应覆盖共享数据目录。
Linux 部署必须把以下环境变量指向发布目录之外的持久卷:
SCREENER_STRATEGY_RESEARCH_PATH
SCREENER_BACKTEST_PATH
SCREENER_SAMPLE_LAB_PATH
SCREENER_AUTH_PATH
SCREENER_POOL_PATH
SCREENER_SCAN_REPORT_PATH
LEVEL2_CACHE_PATH
22. 管理接口速查
页面已经封装以下接口,通常不需要手工调用。排查自动化或权限问题时可参考:
| 方法与路径 | 用途 | 最低角色 |
|---|---|---|
GET /api/strategy-research |
研究总状态 | viewer |
GET /api/strategy-research/snapshots |
快照列表 | viewer |
POST /api/strategy-research/backfills |
启动历史回填 | admin |
DELETE /api/strategy-research/backfills/{id} |
取消历史回填 | admin |
POST /api/strategy-research/labels/evaluate |
补齐标签 | analyst |
POST /api/strategy-research/datasets |
冻结数据集 | admin |
POST /api/strategy-research/train |
训练候选 | admin |
POST /api/strategy-research/experiments/{id}/walk-forward |
运行样本外验证 | admin |
PUT /api/strategy-research/candidates/{id}/shadow-config |
修改影子门槛 | admin |
POST /api/strategy-research/candidates/{id}/activate |
启用正式版本 | admin |
POST /api/strategy-research/candidates/{id}/rollback |
回滚正式版本 | admin |
GET /api/strategy-research/deployments |
查看发布审计 | viewer |
生产环境所有写请求还要求有效登录会话和 CSRF 校验。
23. 当前系统明确保留的研究限制
当前闭环已经解决候选即正样本、只用正样本训练、时间穿越、测试集反复参与拟合、影子候选依赖正式池和绕过门禁启用等核心问题,但仍有以下限制:
- 历史回填使用当前证券目录,不能消除退市股票导致的生存者偏差;
- 历史概念成分、板块涨停和集合竞价点时数据尚未完整接入;
- 历史筹码峰松动止盈没有可靠逐日筹码数据,当前不参与交易模拟;
- 参数优化器是透明的受约束网格搜索,不是复杂机器学习模型;
- 当前门禁评价单个信号质量,没有完整模拟组合资金占用、仓位冲突和市场容量;
- 数据漂移目前是风险提示,不是独立阻断门禁;
- 页面累计影子指标不是滚动窗口实盘风控的全部替代品;
- 当前服务端不会强制每次正式扫描都使用
active参数,运行前需要人工确认; - 任何历史回测都不能替代未来真实影子运行。
这些限制意味着:历史回填和 Walk-forward 用来淘汰明显不稳定的候选,未来影子运行为完整策略提供关键前瞻证据,最终启用仍需要研究员检查市场环境、风险和数据质量。
24. 一轮合格研究应留下的证据
正式启用一个新版本前,至少应能回答并保存以下问题:
- 它以哪个正式参数版本为 baseline/champion?
- 使用了哪个标签政策,费用、滑点和止盈止损是什么?
- 使用了哪个冻结数据集,日期范围和类别分布是什么?
- 数据中正式快照和历史回填各占多少?
- 哪些参数可学习,最终改变了哪些参数?
- 每个 Walk-forward 折用了哪些训练和测试日期?
- 是否存在标签未成熟导致的清除样本?
- 样本外折数、入选数、胜率、Wilson 下界、均值和中位数是多少?
- 相比 baseline 是提升、持平还是退化?
- 概念和竞价历史覆盖率是多少?
- 影子运行经历了多少笔信号和多少独立市场日?
- 影子胜率、收益、回撤、不可交易率和集中度是多少?
- 是否出现明显数据漂移?
- 谁在什么时间启用,为什么认为证据充分?
- 出现什么情况必须回滚到哪个版本?
如果其中关键问题无法回答,就不应把该候选视为已经完成策略研究闭环。