辅助分析系统

prototype-design.md

/app/prototype-design.md

# 郑国成规则辅助型系统 V1 原型设计

## 1. 目标定位

- 目标形态:部署到腾讯云服务器,通过域名直接访问。
- 核心能力:只做筛股、买入提示、卖出提示,不做自动下单,不做持仓打分。
- 策略定位:基于现有规则表,构建“硬规则量化 + 软规则标签 + 例外条件人工复核”的半量化系统。

## 2. V1 范围

### 2.1 做什么

- 每日收盘后生成候选股列表。
- 根据买入提示规则生成可关注买点列表。
- 根据卖出提示规则生成风险提示列表。
- 在网页上展示规则、信号、日志和人工复核结果。
- 支持通过域名访问,支持基础账号登录。

### 2.2 不做什么

- 不做自动交易。
- 不做券商接口接入。
- 不做盘中高频信号。
- 不做多用户协作。
- 不做复杂回测系统。

## 3. 推荐技术路线

### 3.1 部署架构

- 服务器:腾讯云 CVM,Linux。
- 访问方式:域名 -> Nginx -> Python Web 服务。
- 部署形态:支持宿主机直接部署,也支持 Docker / Docker Compose 部署。
- Web 服务:FastAPI。
- 容器编排:V1 推荐 Docker Compose,单机部署更直接。
- 进程管理:如果不用 Docker,则使用 systemd。
- HTTPS:Nginx + Let's Encrypt。

### 3.3 Docker 部署建议

- 应用容器:运行 FastAPI 原型服务。
- 反向代理:优先复用现有 Caddy 或 Nginx,对接到应用容器暴露出的本地端口。
- 数据卷:挂载 SQLite 文件与后续导出的日志目录。
- 腾讯云上线时,可先放通 80/443,对外只暴露 Nginx 容器。

### 3.2 应用结构

- Web 层:展示页面、规则表、信号结果、人工复核入口。
- 规则引擎层:按筛股/买入/卖出三张规则表计算信号。
- 数据适配层:负责行情、行业标签、概念标签、基础财务字段读取。
- 任务调度层:每日定时跑筛股与信号计算。
- 存储层:V1 建议 SQLite,后续再迁移 MySQL/PostgreSQL。

## 4. V1 页面设计

### 4.1 首页仪表盘

- 今日候选股数量
- 今日买入提示数量
- 今日卖出提示数量
- 最近一次任务执行时间
- 最近一次任务状态

### 4.2 筛股页面

- 展示进入候选池的股票
- 显示命中的筛股规则
- 显示软规则标签
- 显示是否需要人工复核

### 4.3 买入提示页面

- 展示股票、命中规则、触发时间、触发条件
- 显示是否为硬规则、软规则加分或例外条件
- 支持人工标记“已复核/忽略/关注”

### 4.4 卖出提示页面

- 展示股票、风险类型、触发条件、建议动作
- 支持人工标记“已复核/忽略”

### 4.5 规则配置页面

- 展示三张规则表
- 展示每条规则的优先级、执行级别、冲突处理、最小字段
- V1 先只读展示,不开放网页修改

### 4.6 任务与日志页面

- 展示每日任务执行记录
- 展示失败日志
- 支持手动触发一次全量刷新

## 5. V1 数据流设计

### 5.1 每日批处理流程

1. 拉取 A 股股票池与基础行情数据
2. 生成筛股候选池
3. 在候选池上运行买入提示规则
4. 对观察池运行卖出提示规则
5. 写入数据库
6. 更新网页展示

### 5.2 运行频率建议

- V1 先做日频,不做盘中实时推送。
- 每个交易日收盘后跑一次。
- 如需盘中能力,放到 V2。

## 6. 规则引擎设计

### 6.1 筛股层

- 输入:A 股全市场股票池
- 输出:候选股列表
- 主要规则:
  - 长期需求主题优先
  - 趋势对齐过滤
  - 季节轮动方向过滤
  - 阶段性重点人工复核

### 6.2 买入提示层

- 输入:候选股列表
- 输出:买入关注提示
- 主要规则:
  - 趋势确认后买入关注
  - 起涨点/二波结构买点
  - 熟悉标的回补提示
  - 阶段主线共振加分

### 6.3 卖出提示层

- 输入:观察池或人工关注池
- 输出:卖出风险提示
- 主要规则:
  - 短线转弱离场提示
  - 阶段收益兑现提示
  - 题材生命周期结束提示
  - 阶段窗口结束降权

## 7. 数据字段最小集合

### 7.1 行情数据

- 股票代码
- 股票名称
- 交易日期
- 开高低收
- 成交量
- 成交额
- 换手率

### 7.2 技术指标

- MA5 / MA10 / MA20 / MA60
- MACD DIF / DEA / Histogram
- 阶段高点 / 阶段低点
- 启动位 / 前高位

### 7.3 主题与标签

- 行业标签
- 概念标签
- 是否属于季节轮动方向
- 是否属于长期需求主题

### 7.4 事件与人工标签

- 当前阶段重点方向
- 是否进入人工复核池
- 是否属于熟悉标的

## 8. V1 API 设计

### 8.1 页面接口

- `GET /`
- `GET /screening`
- `GET /signals/buy`
- `GET /signals/sell`
- `GET /rules`
- `GET /jobs`

### 8.2 数据接口

- `GET /api/screening/latest`
- `GET /api/signals/buy/latest`
- `GET /api/signals/sell/latest`
- `POST /api/jobs/run`
- `POST /api/review/mark`

## 9. 数据库存储建议

### 9.1 主要表

- `stocks`
- `daily_bars`
- `screening_results`
- `buy_signals`
- `sell_signals`
- `manual_reviews`
- `job_runs`

### 9.2 V1 存储建议

- 本地 SQLite 文件即可。
- 等到需要多用户或更高并发,再迁移到 MySQL/PostgreSQL。

## 10. 安全与运维建议

- V1 增加基础登录,不裸露所有接口。
- 后台管理接口只允许登录后访问。
- 域名只暴露 Nginx 80/443,应用服务走 Docker 内部网络或本地回环。
- Docker 部署时应用容器使用 `docker-compose.yml` 管理并开启自动重启,反向代理可复用服务器现有 Caddy/Nginx。
- 非 Docker 部署时可继续使用 systemd 托管应用进程,开启自动重启。
- 日志写文件并保留最近 7-14 天。

## 11. 推荐实施顺序

### 第一步

- 在现有项目内加入 Web 服务骨架
- 能通过域名或 Docker 反向代理打开首页和规则页

### 第二步

- 接入 SQLite
- 落地筛股/买入/卖出结果表

### 第三步

- 接入规则引擎
- 支持手动运行一次任务

### 第四步

- 增加每日定时任务
- 首页显示最新结果

## 12. 我对 V1 的建议结论

- V1 不要追求实时和复杂回测。
- V1 先做成“收盘后自动刷新 + 网页查看 + 人工复核”的规则辅助系统。
- 只要这个流程跑顺,后面再做盘中提醒、更多数据源、回测和策略迭代,都会容易很多。

## 13. 郑国成版小核心状态机草案

这一节不是新增一套复杂打分系统,而是给当前原型补一层“投资理念 -> 可量化判断 -> 股池迁移”的桥。

核心原则只有两条:

- 主状态机只保留少数硬骨架,不让所有解释变量都变成硬闸门。
- 熟悉度、认知深度、主线偏好、人工理解等变量优先进入诊断层和复核层,而不是全部进入买卖状态本身。

### 13.1 从理念到状态机的四层结构

第一层:理念层

- 主线优先,不做杂乱题材收集。
- 位置重要,强调低位、回补、二波、前高附近等可出手区间。
- 熟悉标的优先,研究不充分不贸然下结论。
- 有催化和阶段共振时加分,没有共振时宁可等待。
- 退潮、过热、兑现、题材结束时要明确降级或退出。

第二层:核心判断轴

- 主线与方向:是不是长期需求主题、阶段主线或季节轮动方向。
- 位置与结构:是不是处在低位、回补位、起涨点、二波确认位、前高附近。
- 催化与阶段:政策、事件、节日、热点、窗口期是否在强化逻辑。
- 赔率与弹性:空间是否足够,是否还有“股价未充分反应”的条件。
- 风险与退潮:是否出现短线转弱、题材生命周期结束、阶段窗口结束、过热兑现。

第三层:主状态机

- 前台观察:已经接近可行动,但仍需盯触发条件,不等于直接重仓。
- 正式候场:逻辑成立、赔率仍在,但还没有进入前台观察。
- 跟踪候场:方向可留意,但尚未达到正式候场质量。
- 研究补缺:逻辑可能成立,但材料、熟悉度或证据链不足。
- 回避:出现明确硬伤,不进入候选。
- 卖出/减仓:已经进入兑现、退潮、转弱或风险释放阶段。

第四层:迁移层

- 正式候场 -> 前台观察:主线、位置、结构、催化同时对齐,且没有硬阻断。
- 跟踪候场 -> 正式候场:方向成立且赔率改善,但还未进入前台。
- 任意状态 -> 研究补缺:证据不足、理解不足、需要补材料。
- 任意状态 -> 回避:出现过热、退潮、题材结束、硬风险等一票否决条件。
- 前台观察 -> 卖出/减仓:从“等待确认”切换到“兑现/离场/降权”。

### 13.2 哪些进入硬闸门,哪些只留在诊断层

建议进入硬闸门的只有 4 类:

- 主线是否成立
- 位置与结构是否合适
- 赔率是否还在
- 风险/退潮/过热是否已触发否决

建议只留在诊断层和复核层的变量:

- 熟悉标的程度
- 对公司或题材的认知深度
- 是否属于个人偏好主线
- 研究材料是否完整
- 人工备注、例外条件、特殊经验判断

也就是说,诊断层是用来解释“为什么保留/为什么等待/为什么不前移”,不是用来无限增加硬门槛。

### 13.2.1 当前 V1 规则的边界划分

建议按下面的口径先落地:

- 硬闸门:趋势对齐过滤、季节轮动方向过滤、趋势确认后买入关注、起涨点/二波结构买点、短线转弱离场提示、阶段收益兑现提示、题材生命周期结束提示。
- 诊断层:长期需求主题优先、阶段性重点人工覆核、熟悉标的回补提示、阶段主线共振加分、阶段窗口结束降权。

这里的意思不是说诊断层不重要,而是:

- 硬闸门负责决定“能不能迁移、该不该降级、是否必须退出”。
- 诊断层负责解释“为什么保留、为什么继续看、为什么优先级上调或下调”。

第一版执行上,宁可少一些硬闸门,也不要把熟悉度、偏好、研究深度、阶段共振这类变量一次性都塞进状态迁移条件里。

### 13.3 对当前三张页面的映射建议

- 筛股页:主要承接“正式候场 + 跟踪候场 + 研究补缺”。
- 买入页:主要承接“前台观察”,重点展示升级条件和触发原因。
- 卖出页:主要承接“卖出/减仓 + 回避”,重点展示退潮、兑现、转弱理由。

当前系统仍保留“候选记录池”逻辑,因此 V1 不强制先聚合成唯一股票池;但每条记录都应该补齐所属层级与迁移原因。

### 13.4 建议新增的最小字段

- `pool_layer`:前台观察 / 正式候场 / 跟踪候场 / 研究补缺 / 回避 / 卖出减仓
- `state_reason`:当前状态的主因说明
- `promotion_trigger`:如果要上移一层,还差什么条件
- `hard_blocker`:阻断前移的一票否决原因
- `diagnostic_tags`:熟悉标的、主线方向、阶段窗口、人工经验标签
- `review_priority`:人工复核优先级

### 13.5 第一版落地建议

- 先不改成复杂分数系统,先把状态机和字段补齐。
- 先让规则引擎输出状态层级、迁移条件和阻断原因。
- 先让首页和三张信号页显示“为什么在这里、下一步往哪里迁移”。
- 当前统一规则表已外置为独立配置文件,后续优先改规则配置,不优先继续堆叠引擎分支判断。
- 等状态机稳定后,再考虑是否需要把部分判断进一步量化成分数。

### 13.6 这份草案的实际意义

它的目的不是把郑国成体系硬拧成一套重因子量化策略,而是:

- 保留郑国成方法里“主线、结构、催化、熟悉标的、退潮退出”这些核心思想。
- 把这些思想压缩成一个可执行、可解释、可迁移的轻量状态机。
- 为后续的股池架构、前台观察、人工复核和迁移监控提供统一骨架。