7.2 KiB
市场结构与成交额趋势设计
- 关联功能:FEAT-MO-005
- 设计状态:待用户审阅
- 日期:2026-08-25
1. 目标
把综合概览的重点从可选分时图调整为盘面结构总结,优先回答:市场强弱如何、行业和题材资金及涨跌方向如何、全市场成交额是在放大还是收缩。
本切片继续采用 Nest 服务端聚合、Vue 通过 Axios 访问业务 API 的边界。TDX 保持指数、市场宽度和基础行情主链路;AKTools/AKShare 只作为行业、题材和资金流向的候选补充源,必须先通过实际能力探针。
2. 用户范围
首屏展示
- 市场结论和主要指数。
- 上涨、下跌、平盘、涨停、跌停、炸板等市场宽度与短线情绪。
- 行业和题材的涨跌排行。
- 行业和题材资金净流入、净流出排行。
- 全市场成交额趋势图和累计成交额。
- 每个模块的交易日期、最后更新时间、数据源和
fresh/delayed/partial/unavailable状态。
交互范围
- 首屏每个排行模块只展示重点名次,并提供“查看全部”入口。
- 排行支持行业/题材切换,以及涨幅、跌幅、成交额、净流入、净流出排序。
- 点击行业或题材进入现有详情页体系;无法识别的 provider 原始分类不得生成错误详情链接。
- 成交额趋势支持盘中增量和累计值;收盘后保留完整交易日曲线。
3. 明确不在本切片范围
- 不把分时 K 线作为首页核心视图;详情页分时仍保持独立能力验证状态。
- 不提供交易指令、荐股、目标价、仓位建议或自动下单。
- 不启用用户体系、MySQL、Redis、RocketMQ 或 AI 运行链路。
- 不把价格涨跌、成交额或成交量推导成主力净流入;资金净流入必须来自有明确字段口径的数据源。
- 不把单个行业指数代表全市场资金;全市场成交额与板块资金流必须分别标识。
4. 数据源与口径
4.1 TDX 主链路
- 指数、市场宽度、核心行情和已验证的日成交额继续使用 TDX。
- 当前已有的日成交额趋势只能作为收盘后及历史对比口径,不能直接冒充盘中 5/15 分钟趋势。
- 盘中成交额趋势必须先验证 TDX 是否能返回多市场、带时间戳的分时 Amount;若 TDX 不支持,再评估 AKTools 或快照聚合方案。
4.2 AKTools/AKShare 补充链路
优先探测以下能力:
- 行业板块涨跌幅和成交额排行。
- 概念题材涨跌幅和成交额排行。
- 行业/题材资金净流入和净流出排行。
- 全市场或指数的分时成交额字段。
探针必须记录接口参数、HTTP 状态、字段结构、交易日期、更新时间和重复请求稳定性;不保存原始载荷。探针失败时只记录 unavailable,不生成示例数据。
4.3 分类口径
industry:供应商的行业板块分类。concept:供应商的概念/题材分类。board:仅在数据源明确提供独立板块分类时启用;不能把行业或概念重复映射成第三种分类。- 每条排行记录必须带
category、code、name、tradeDate、asOf和source。
4.4 资金口径
netInflow只能使用上游明确提供的净流入字段。- 无法确认主力、大单或统计方向时返回
null并说明原因。 - 不同数据源的资金字段不在服务端直接求和;跨源比较只在字段口径相同且文档明确时允许。
4.5 成交额趋势口径
- 基本单位统一为亿元;服务端负责单位转换,前端不根据字段名猜单位。
- 每个点至少包含
time、amount、cumulativeAmount。 amount表示该时间区间成交额,cumulativeAmount表示当日截至该点累计成交额。- 缺少时间戳、金额为负数、时间倒序或区间重复时,该点被拒绝并将模块标记为
partial。
5. API 设计
继续使用统一响应外壳:
{
"snapshotId": "20260825-101500",
"asOf": "2026-08-25T10:15:00+08:00",
"tradeDate": "20260825",
"source": "tdx",
"status": "fresh",
"data": {},
"warnings": []
}
新增或调整为以下独立接口,禁止把所有数据塞入一个首页接口:
GET /api/market-overview/sector-rankings
GET /api/market-overview/capital-flow
GET /api/market-overview/turnover-trend
sector-rankings
查询参数:category=industry|concept|board、sort=rise|fall|turnover、limit=1..100。
记录字段:category、code、name、changePercent、turnoverAmount、advancingCount、decliningCount、leader、tradeDate。
capital-flow
查询参数:category=industry|concept|board、sort=inflow|outflow、limit=1..100。
记录字段:category、code、name、netInflow、netOutflow、turnoverAmount、tradeDate、flowDefinition。
turnover-trend
查询参数:interval=5|15、tradeDate=YYYYMMDD(默认最近可用交易日)。
记录字段:time、amount、cumulativeAmount;响应额外返回 unit=亿元、marketCount 和 granularity。
所有参数使用白名单和范围校验;上游地址、原始异常和完整载荷不得进入响应。
6. 前端结构
web/src/api/market-overview/index.ts
web/src/views/market-overview/
├── components/MarketSummaryPanel.vue
├── components/MarketBreadthPanel.vue
├── components/SectorRankingPanel.vue
├── components/CapitalFlowPanel.vue
└── components/TurnoverTrendPanel.vue
组件只消费已生成的契约类型,不直连 AKTools/TDX。排行表格优先保证扫描效率,避免把全部分类堆叠在首屏;窄屏时改为分类标签和横向可滚动表格,不能出现页面级横向溢出。
7. 失败、时效和安全
- 四类状态沿用
fresh、delayed、partial、unavailable。 - 单个上游接口失败只影响对应模块;其他模块继续展示。
- 收盘后的最后记录不自动判定为延迟;必须结合上海交易时段和交易日期判断。
- AKTools 仍只允许服务端固定白名单调用,设置超时、响应体上限、字段校验和错误脱敏。
- 不保存行情原始载荷,不记录家庭网络地址、TDX 凭据或 AKTools 凭据。
8. 性能与验证目标
- 排行接口只返回请求的
limit条记录;服务端拒绝超过 100 条的单次请求。 - 首页模块并行请求,单个模块超时不阻塞首屏。
- 成交额趋势默认最多返回一个交易日的 5 分钟点,必要时再支持 15 分钟降采样。
- 单测覆盖字段映射、单位转换、排序、分类白名单、资金口径缺失、时间倒序、重复点和部分数据。
- 真实联调至少覆盖交易时段一次和收盘后一次,分别记录最后时间、成功率、缺口率和状态判断。
- 完成 HTTP/OpenAPI、前端状态、构建、Playwright 桌面/窄屏、代码 Review 和规范 Review。
9. 分阶段实施
- 数据源能力探针:先确认行业/题材排行、资金流和盘中成交额接口。
- 服务端适配器与 DTO:固定数据源边界,先输出独立 API。
- 前端排行和成交额趋势组件:接入模块状态和点击详情。
- 盘中与收盘后联调:校验时间口径和数据质量。
- 完成治理档案、Review、GitNexus 前后对比和 Gitea 推送。