# 迁移知行B1选股策略 ## Goal 在新项目中迁移旧项目的 `xg_composite` 选股逻辑,并将新策略名称统一为 `zhixing_b1`,让系统能够基于 PostgreSQL 中的历史市场数据执行可复现的知行 B1 选股。 首期采用“公式级垂直切片”:从通达信公式、指标计算、7 个子信号、信号结果、 市场数据读取到历史验证用例打通一条完整链路;不在本任务内铺开其他策略或完整 前端产品能力。 ## Background and confirmed facts - 旧项目的 `xg_composite` 对应通达信选股公式,包含 7 个子信号;实现位于 `zgnb-project/src/zgnb/domain/strategy/xg_composite.py`,公式原文位于 `zgnb-project/docs/references/formulas/tongdaxin_xuangu_formula.txt`。 - 旧项目的共享指标实现位于 `zgnb-project/src/zgnb/shared/xg_indicators.py`, 其中包含知行线、BBI、KDJ、RSI、振幅、趋势、回踩和 7 个子信号条件。 - 旧项目目前只返回第一个命中的 XG 子信号;本任务以公式/业务意图为准,允许 同一股票同一交易日产生多条不同分类的信号。 - 新项目已确定 PostgreSQL 为市场数据事实源、价格使用 qfq 日线、股票池为当前 沪深非 ST A 股,并保留 6 年数据窗口。 - 新项目当前已有 `market_daily_bar`、`market_daily_basic` 和市场数据领域端口, 但还没有策略读取端口、选股信号模型或策略 API。 ## Requirements ### R1. 迁移策略身份 - 新策略的业务标识为 `zhixing_b1`。 - 领域逻辑不得继续依赖旧项目的 `xg_composite` 命名作为对外策略身份。 - 7 个子信号保留独立分类,并可在同一股票同一交易日同时出现。 ### R2. 公式语义 - 以通达信公式和已确认的 v1203 业务调整为主要依据,旧 Python 实现作为迁移 参考和差异线索。 - 不复制旧流程中将最新市值写入全部历史 K 线、按当前日期查询历史 B1 信号等 不能支持历史重放的行为。 - 对公式中涉及的代码板块、涨跌幅放宽系数、振幅区间、缩量、大绿棒、趋势、 回踩和 7 个子信号条件建立可测试的实现。 ### R3. 市场数据读取 - 策略使用市场数据领域端口读取目标交易日之前的足够 warm-up 日线数据。 - OHLCV 指标使用 `market_daily_bar` 的 qfq 价格与成交量;换手率等估值/交易 条件使用同一交易日的 `market_daily_basic` 快照。 - 策略计算不得直接依赖 PostgreSQL、Pandas SQL 查询或具体 HTTP 层实现。 - 历史选股必须显式使用 `target_trade_date`,不得隐式退化为“当前最后一行”。 ### R4. 信号结果 - 信号至少包含股票、交易日、策略标识、子信号分类、收盘价和可解释的关键指标 详情。 - 信号提供由“股票、交易日、策略标识、子信号分类”组成的稳定身份;不同子信号 分类不得被合并丢失,为后续持久化提供幂等依据。 ### R5. 验证 - 为共享指标和每个子信号建立边界条件测试,覆盖缺数据、暖机期、除零和板块 参数差异。 - 提供固定历史样本的策略级验证,能够判断新实现是否符合公式语义,并明确记录 与旧实现的有意差异。 - 验证不得访问真实 Tushare、生产数据库或依赖实时网络。 ## Out of scope - `bowl_rebound`、`b1`、`b1b2`、`brick_chart` 的迁移。 - 完整选股批次编排、自动调度、前端页面和图表生成。 - 选股信号 PostgreSQL 表、信号持久化实现和 HTTP API。 - 实盘交易、回测收益评价和策略参数优化。 - 为解决本任务而改变既有市场数据同步的股票池、qfq 或六年保留契约。 ## Acceptance Criteria - [ ] 新项目存在名为 `zhixing_b1` 的领域策略,并能在显式目标交易日上运行。 - [ ] 7 个子信号均有独立分类;同一股票同日多信号不会互相覆盖,并具有稳定身份。 - [ ] 策略只通过市场数据端口获得 qfq 日线和同日交易指标,不直接耦合存储实现。 - [ ] 公式关键分支、暖机边界、缺失值和除零场景均有自动化测试。 - [ ] 固定历史样本验证可重复运行,并以固定 golden 结果对比新旧实现或公式差异。 - [ ] 关键公式分支同时有人工确认案例和单元测试,golden 对比范围保持为少量固定样本。 - [ ] 未实现其他策略、前端页面或实时数据能力,且不改变现有市场数据同步契约。 ## Notes - Keep `prd.md` focused on requirements, constraints, and acceptance criteria. - Lightweight tasks can remain PRD-only. - For complex tasks, add `design.md` for technical design and `implement.md` for execution planning before `task.py start`.