Files
zjjk/南向资金监控平台需求.md
2026-03-20 21:47:30 +08:00

450 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 南向资金监控平台需求文档
## 1. 文档目的
本文档用于明确南向资金监控平台的首期建设范围、数据口径、系统边界、验收标准与后续演进方向,作为产品、设计、开发和测试的统一执行依据。
当前版本以“先做出可验证效果”为目标,优先保证数据真实性、页面可用性和系统可扩展性,不追求一次性做全。
## 2. 项目目标
构建一个面向港股通南向资金监控与分析的网站系统,满足以下目标:
- 交易时段内,实时展示南向资金总净流入、沪市港股通与深市港股通拆分、关键阈值变化和分钟级曲线。
- 非交易时段,沉淀并展示自 `2026-01-01` 起的历史日度、周度、月度和累计统计结果。
- 对关键资金异动和阈值突破进行邮件提醒,并保留完整推送记录。
- 首版先使用本地 `JSON` 文件存储,后续可平滑迁移到 `MySQL`,业务逻辑不因存储替换而重写。
## 3. 当前版本建设原则
### 3.1 数据真实性优先
- 当前版本不接受演示数据、模拟数据、人工虚构数据作为正式展示口径。
- 页面展示的数据必须能够追溯到真实采集结果。
- 所有核心数据都需要保留来源、采集时间、交易日、原始载荷摘要。
### 3.2 单一主数据源
首版暂定只接入 `同花顺`,不再混用其他站点。
要求:
- 实时数据优先使用同花顺 `沪深港通/港股通` 页面或其真实数据接口。
- 历史数据优先使用同花顺同一体系下的历史页或可回溯接口。
- 不再使用快讯标题、资讯摘要、新闻阈值作为正式实时主口径。
### 3.3 存储先轻后重
- 首版使用本地 `JSON` 文件存储。
- 存储结构、Repository 层、配置项需为后续迁移到 `MySQL` 预留空间。
- 禁止把文件路径、文件命名规则、JSON 结构直接耦合到业务层。
## 4. 业务范围
### 4.1 首期 MVP 范围
首期必须交付以下能力:
- 南向资金实时监控
- 历史日/周/月/累计统计
- 沪市港股通、深市港股通拆分展示
- 分钟级快照沉淀
- 阈值突破告警
- 异动速度告警
- 邮件发送
- 推送记录查询
- 基础配置管理
### 4.2 暂不纳入首期正式验收
以下内容可保留设计位,但不作为首期必须完成项:
- 板块流入推断模型
- 个股级资金画像
- 北向资金同步监控
- 企业微信、短信、公众号等多渠道推送
- AI 自动生成盘中点评和收盘总结
## 5. 数据口径要求
### 5.1 监控对象
监控对象为 `港股通南向资金`,由以下两部分组成:
- 港股通(沪)
- 港股通(深)
页面总南向资金口径为两者汇总。
### 5.2 时间口径
- 历史统计起始日:`2026-01-01`
- 实时监控范围:当前交易日盘中数据
- 历史截止日:系统可获取的最新交易日
### 5.3 交易时段口径
需按港股交易时段处理:
- 上午:`09:30-12:00`
- 下午:`13:00-16:00`
- 收盘竞价及最终收口:以 `16:10` 作为当日结果可确认的安全时间点
说明:
- 盘中展示为实时值或准实时值。
- 当天最终值在 `16:10` 后才允许标记为“收盘最终值”。
- `16:10` 前即使页面已显示较新数值,也只能标记为“盘中值”或“待最终确认”。
### 5.4 统计粒度
- 分钟级:盘中监控、阈值判断、异动提醒
- 日级:按交易日统计净流入
- 周级:按自然周内交易日汇总
- 月级:按自然月内交易日汇总
- 累计级:自 `2026-01-01` 起累计净流入
### 5.5 核心指标
系统首版至少需要提供以下指标:
- 当日南向资金净流入金额
- 当日南向资金累计净流入金额
- 港股通(沪)净流入金额
- 港股通(深)净流入金额
- 买入额
- 卖出额
- 净买额
- 1 分钟净变化值
- 5 分钟净变化值
- 历史日净流入
- 历史周净流入
- 历史月净流入
- 历史累计净流入
### 5.6 数据精度分级
为避免页面误导,数据必须带精度标记:
- `realtime_exact`:来自实时接口的准确值
- `close_final`:当日收盘最终值
- `historical_exact`:历史准确值
- `unavailable`:当前无法获取
首版正式页面仅允许展示以上状态,不再显示无来源的推断数值。
## 6. 功能需求
### 6.1 实时总览页
至少展示以下内容:
- 当前市场状态
- 当前交易日总净流入
- 港股通(沪)与港股通(深)拆分
- 分钟级累计净流入曲线
- 1 分钟与 5 分钟变化
- 当前阈值进度
- 当前数据来源
- 当前数据精度状态
- 最近触发的推送记录
页面要求:
- 清楚区分“盘中值”和“收盘最终值”
- 清楚展示数据更新时间
- 若数据暂不可用,必须显示原因或状态,而不是显示假值
### 6.2 历史统计页
至少展示以下内容:
- 日度净流入图
- 周度净流入图
- 月度净流入图
- 累计净流入图
- 最近 20 个交易日概览
至少展示以下统计卡:
-`2026-01-01` 起累计净流入
- 历史交易日数量
- 最大单日净流入
- 最大单日净流出
- 连续净流入天数
- 连续净流出天数
### 6.3 推送记录页
至少展示以下内容:
- 推送时间
- 推送类型
- 触发规则
- 触发时资金数值
- 邮件标题
- 邮件发送状态
- 错误信息
- 筛选与查询能力
### 6.4 规则配置页
至少支持以下配置项展示与维护:
- 实时采集间隔
- 历史回补起始日
- 阈值突破档位
- 5 分钟异动阈值
- 邮件开关
- 发件邮箱
- SMTP 地址与端口
- 收件人列表
- 当前主数据源
## 7. 告警需求
### 7.1 5 分钟异动提醒
规则要求:
- 当 5 分钟内净变化绝对值超过设定阈值时触发提醒
- 需区分“快速流入”和“快速流出”
- 同类提醒在冷却窗口内只发送一次
默认配置建议:
- 窗口:`5` 分钟
- 冷却:`5` 分钟
- 阈值:可配置,不写死到代码中
### 7.2 阈值突破提醒
规则要求:
- 当日累计净流入每突破一个固定档位时发送提醒
- 默认档位为每 `50` 亿港元
- 同一交易日内,同一档位仅提醒一次
- 次日重新计数
示例:
- 突破 `50` 亿发送一次
- 突破 `100` 亿发送一次
- 突破 `150` 亿发送一次
### 7.3 推送留痕
所有推送行为必须持久化保存,至少保留:
- 推送时间
- 推送类型
- 规则编码
- 触发值
- 触发说明
- 邮件标题
- 邮件摘要
- 发送状态
- 错误信息
## 8. 数据源与采集要求
### 8.1 数据源限制
首版正式口径限定为:
- 数据源:`同花顺`
- 采集范围:`沪深港通 / 港股通` 相关页面与真实接口
### 8.2 采集要求
系统需支持:
- 分钟级实时采集
- 日终归档
- 历史回补
- 失败重试
- 原始载荷保存
- 采集日志记录
### 8.3 数据可信要求
每条采集结果至少需要保留:
- `trade_date`
- `snapshot_time`
- `source_name`
- `source_url`
- `precision`
- `payload_type`
- `raw_payload`
### 8.4 失败降级要求
如果实时接口不可用:
- 页面展示“数据暂不可用”
- 不得自动降级成新闻快讯阈值口径
- 必须记录失败原因和最后一次成功采集时间
## 9. 后端需求
### 9.1 技术栈
- 语言:`Python`
- Web 框架:`FastAPI`
- 存储:首版 `JSON` 文件,后续迁移 `MySQL`
### 9.2 后端核心模块
- 数据采集模块
- 历史回补模块
- 数据归档模块
- 指标计算模块
- 告警引擎模块
- 邮件发送模块
- API 服务模块
- 推送日志模块
### 9.3 存储设计要求
首版至少包含以下存储单元或等价结构:
- 分钟快照
- 日统计
- 周统计
- 月统计
- 推送记录
- 告警触发记录
- 原始采集结果
- 系统配置
建议按目录或文件集合进行组织,例如:
- `minute_snapshots/*.json`
- `daily_stats/*.json`
- `weekly_stats/*.json`
- `monthly_stats/*.json`
- `push_records/*.json`
- `alert_triggers/*.json`
- `raw_payloads/*.json`
- `system_config.json`
### 9.4 首版 JSON 存储要求
- JSON 文件需按模块拆分,禁止所有数据写入单一大文件。
- 需支持按交易日或时间分片,避免文件无限增长。
- 写入需具备基本原子性,避免采集中断导致 JSON 损坏。
- 读取层需封装统一接口,前端 API 与业务模块不直接操作文件路径。
- 历史聚合结果允许单独缓存为 JSON减少页面重复计算开销。
### 9.5 远期 MySQL 迁移要求
- 业务层通过 Repository 或 Storage Adapter 访问数据。
- JSON 字段命名需尽量与未来 MySQL 字段命名保持一致。
- 迁移后 API 出参结构不应变化。
- JSON 阶段的历史数据需可导入 MySQL。
## 10. 前端需求
### 10.1 技术栈
- 框架:`Vue 3`
- 推荐Composition API + TypeScript
### 10.2 设计要求
- 页面风格偏金融信息终端,而不是普通后台管理系统
- 重点信息层级清晰,数值、趋势、时间、来源必须易于识别
- 支持桌面端优先,同时兼容移动端基本浏览
### 10.3 交互要求
- 数据加载时有明确加载状态
- 无数据时有明确空状态
- 错误时有明确错误状态
- 每个核心模块都能看到“更新时间”和“数据来源”
## 11. API 需求
首版建议至少提供以下接口:
- `/api/health`:健康检查
- `/api/meta`:系统元信息、市场状态、数据源信息
- `/api/overview`:实时总览
- `/api/history`:历史统计
- `/api/push-records`:推送记录
- `/api/rules`:规则与配置
- `/api/source-diagnostics`:采集诊断结果
`/api/source-diagnostics` 至少返回:
- 当前主源
- 最后一次成功采集时间
- 最后一次失败时间
- 最近错误原因
- 最近成功的来源 URL
- 当前实时接口可用性
- 当前历史接口可用性
## 12. 非功能需求
### 12.1 稳定性
- 单次抓取失败不能导致服务整体不可用
- 邮件发送失败需记录并可重试
- 前端页面异常不应影响后台采集
### 12.2 可维护性
- 采集逻辑、指标逻辑、告警逻辑、API 逻辑、展示逻辑分层
- 配置项外置,不写死在代码中
- 关键数据结构命名稳定,便于后续迁移数据库和增加数据源
### 12.3 可观测性
- 记录采集成功/失败日志
- 记录接口耗时
- 记录最近一次成功持久化时间
- 支持快速定位某天某次采集所用源链接
## 13. 验收标准
### 13.1 实时采集验收
- 交易时段内可按配置周期写入分钟级快照
- 页面可展示当日最新实时值
- 总值等于港股通(沪)与港股通(深)汇总
- 每条实时记录可追溯到同花顺真实接口或页面
### 13.2 收盘归档验收
- 当天 `16:10` 后能将当日结果标记为最终值
- 收盘后历史页可看到该交易日准确结果
- 当日最终值与盘中值状态区分清楚
### 13.3 历史统计验收
- 可查看自 `2026-01-01` 起的日/周/月/累计统计
- 统计结果由真实历史数据生成
- 最近 20 个交易日可正常查询
- JSON 存储内容可被系统正确读取并生成页面结果
### 13.4 告警验收
- 50 亿档位突破可触发一次邮件
- 5 分钟异动可触发提醒
- 所有推送记录均可在页面查询
### 13.5 展示验收
- 前端风格具备专业金融看板特征
- 桌面端与移动端基本可用
- 核心数值、来源、更新时间、精度状态清晰可读
## 14. 当前实施状态
- 真实数据源切换到东方财富:历史由 `https://datacenter-web.eastmoney.com/api/data/v1/get``reportName=RPT_MUTUAL_DEAL_HISTORY``MUTUAL_TYPE in ("002","004")`)回溯;分钟/实时由 `https://push2.eastmoney.com/api/qt/kamt/get``https://push2.eastmoney.com/api/qt/kamtbs.rtmin/get` 拉取,数据写进 `backend/data/raw_payloads/` 并由同步脚本处理。
- JSON 存储按模块组织:`minute_snapshots/<trade_date>.json``daily_stats/summary.json``push_records/records.json`Repository 层屏蔽路径,前端与 API 只关心字段;`tools/sync_eastmoney.py` 可按需触发并自动刷新数据与历史。
- 推送与告警链路已经打通:新增 `alert_service` + `email_notification_service`,支持 QQ SMTP`sender_email` / `smtp_username` / `smtp_password` / `recipients`);已有 `tools/send_test_alert.py` 脚本和 `POST /api/push-records/test` 接口可立即生成一条基于当前快照的测试邮件,并把记录写入 `backend/data/push_records/records.json`
- 前端推送记录页改为列表展示,默认显示最新 6 条记录,分类展示状态、时间、规则、触发值、摘要、描述与错误信息。不再在页面暴露规则配置详情;配置通过`backend/data/system_config.json``monitoring_repository` 等存储。
- 实时页面、历史页面、推送记录页面已通过 Tab 切换控制,总体页面无滚动条;日/周曲线以 SVG 图表形式呈现,配置/规则信息保留在后端,并把推送记录单独展示,确保可验证效果。