版本:v1.0 | 更新日期:2026-07-16
1. 系统概述
1.1 系统定位
Market Hotspot 是一套面向 A 股(含港股通)的盘中热点侦测与评估系统。通过多源行情数据的实时采集、多维特征计算、加权评分以及收盘后的量化评估,帮助用户识别盘中异动个股和板块热点。
1.2 核心能力
| 能力 |
说明 |
| 实时热点侦测 |
每分钟计算 HotScore 综合评分,对股票池内个股实时排名 |
| 板块联动分析 |
监控行业/概念板块的涨跌、涨停分布,识别板块共振 |
| 异动告警 |
成交额爆发、HotScore 急升、板块共振、涨停炸板等 5 种告警规则 |
| 信号评估闭环 |
盘中拍快照 → N 分钟后回填真实涨跌 → 计算 Precision/Recall/超额收益 |
| 权重自动调优 |
基于滚动 IC 分析,收盘后自动调整 HotScore 分量权重 |
| 龙虎榜集成 |
收盘后自动采集东方财富龙虎榜数据,回填至评估指标 |
| 股票池热更新 |
每 5 分钟从 MySQL 检测股票池变化,自动增删采集和计算范围 |
1.3 技术栈
| 类别 |
技术选型 |
| 后端框架 |
FastAPI + Uvicorn(异步) |
| 行情数据源 |
通达信 pytdx、新浪财经 HTTP、东方财富 Playwright |
| 实时缓存 |
Redis(排行、特征、告警、龙虎榜) |
| 历史持久化 |
DuckDB(特征历史、评估记录、日报) |
| 股票池/板块 |
MySQL(stock_pool 数据库) |
| 实时推送 |
WebSocket |
| 进程模型 |
单进程多协程(asyncio) |
2. 系统架构
2.1 分层架构
┌─────────────────────────────────────────────────────────┐
│ API 层 │
│ FastAPI REST · WebSocket /ws · 静态前端(预留) │
├─────────────────────────────────────────────────────────┤
│ 计算引擎层 │
│ FeatureEngine · HotScoreEngine · SectorEngine · Alert │
├─────────────────────────────────────────────────────────┤
│ 评估层 │
│ EvalEngine · Baseline · SessionAnalyzer · IC · Reporter │
├─────────────────────────────────────────────────────────┤
│ 采集层 │
│ Tick · OrderBook · Sector · LimitUp · HK · Longhu │
├─────────────────────────────────────────────────────────┤
│ 存储层 │
│ DataBus(内存) · Redis(实时) · DuckDB(历史) · MySQL │
└─────────────────────────────────────────────────────────┘
2.2 数据流向
数据源 采集层 DataBus 引擎层 存储 / API
────── ────── ─────── ────── ────────
通达信 pytdx ──→ TickCollector ──→ [tick] ──→ FeatureEngine ──→ Redis 排行
──→ OrderBookCollector ──→ [orderbook] ↓ DuckDB 历史
──→ LimitUpCollector ──→ [limitup] ──→ HotScoreEngine ──→ WebSocket
↓
新浪财经 HTTP ──→ SectorCollector ──→ [sector] ──→ SectorEngine ──→ Redis 板块
──→ HKCollector ──→ [tick/ob] ↓
AlertEngine ──→ Redis 告警
东方财富 ──→ LonghuCollector ──→ (直写Redis) ↓
EvalEngine ──→ DuckDB 评估
MySQL ──→ 股票池/板块映射 ↓
DailyReporter ──→ 日报 + 调权
2.3 内部消息总线(DataBus)
系统通过内存中的 DataBus(基于 asyncio.Queue)实现采集层与引擎层的解耦:
| 通道 |
生产者 |
消费者 |
tick |
TickCollector, HKCollector |
FeatureEngine |
orderbook |
OrderBookCollector, HKCollector |
FeatureEngine |
sector |
SectorCollector |
SectorEngine |
limitup |
LimitUpCollector |
SectorEngine |
3. 数据采集层
3.1 采集器一览
| 采集器 |
数据源 |
采集内容 |
默认间隔 |
运行时段 |
| TickCollector |
通达信 pytdx |
逐笔成交(含买卖方向) |
15 秒 |
09:30–15:00 |
| OrderBookCollector |
通达信 pytdx |
五档盘口快照 |
10 秒 |
09:15–15:35 |
| SectorCollector |
新浪财经 HTTP |
行业 + 概念板块涨跌 |
300 秒 |
09:15–15:35 |
| LimitUpCollector |
通达信 pytdx |
股票池内涨停检测 |
60 秒 |
09:25–15:35 |
| HKCollector |
新浪 hq.sinajs.cn |
港股实时行情 |
30 秒 |
09:15–16:10 |
| LonghuCollector |
东方财富 Playwright |
龙虎榜上榜记录 |
按需(17:00) |
收盘后单次 |
说明:OrderBook、Sector、LimitUp 延伸到 15:35 以覆盖 A 股盘后固定价格交易时段(15:00–15:30)。
3.2 CollectorManager
CollectorManager 负责统一管理所有采集器的生命周期:
- 注册与启动:
register_defaults() 自动创建所有采集器实例并注入关注列表
- 时段控制:
_session_monitor() 每 30 秒检测当前时段,自动暂停/恢复各采集器
- 连接池:为 pytdx 系采集器(tick/orderbook/limitup)提供共享的 TCP 连接池(默认 8 个连接)
- 通达信服务器选优:启动时自动测速,选择延迟最低的服务器
3.3 TickCollector 细节
- 增量采集:记录每只股票上次采集位置,只拉取新数据
- 买卖方向解析:根据成交价与买一/卖一的关系判断主动买/卖
- 并发控制:通过连接池限制并发连接数
- 数据标准化:统一输出
TickRecord 结构体
3.4 HKCollector 特殊处理
- 港股代码格式:
HK00700(带 HK 前缀)
- 午休跳过:12:00–13:00 不采集
- 容错机制:连续失败后自动重建 HTTP 客户端,防止连接老化
3.5 LonghuCollector 工作原理
- 使用 Playwright 打开东方财富龙虎榜页面
- 监听
datacenter-web.eastmoney.com/api/data/v1/get 接口请求
- 自动处理弹窗和广告覆盖层
- 通过 JavaScript 注入一次性获取所有分页数据
- 解析 JSONP/JSON 响应,提取上榜记录
- 输出标准化
LonghuRecord 数据结构
4. 计算引擎层
4.1 FeatureEngine — 特征计算引擎
每分钟消费 tick 和 orderbook 数据,为股票池内每只股票计算 四大类特征:
成交特征
| 特征 |
含义 |
volume_surge_5m |
5 分钟成交额与前 30 分钟均值的比率 |
volume_surge_1m |
1 分钟成交额突增比率 |
volume_ratio |
量比(当前分钟 vs 历史同时刻均值) |
turnover_rate |
区间换手率 |
large_order_ratio |
大单(≥50 万元)占比 |
trade_density |
成交笔数密度(笔/分钟) |
资金主动性特征
| 特征 |
含义 |
active_buy_amount |
主动买入金额 |
active_sell_amount |
主动卖出金额 |
net_active_buy |
净主动买入 = 主买 − 主卖 |
active_buy_ratio |
主动买入占比 = 主买 / 总成交 |
consecutive_buy_count |
连续主动买入笔数 |
buy_momentum |
买入动量(短期 vs 长期主买比率变化) |
盘口结构特征
| 特征 |
含义 |
bid_ask_imbalance |
买卖盘口不平衡度 |
seal_amount |
涨停封单金额 |
seal_duration |
涨停封单持续时间(分钟) |
cancel_rate |
撤单率 |
ask_decay_speed |
卖盘衰减速度 |
spread |
买一卖一价差 |
depth_ratio |
买卖盘口深度比 |
板块联动特征(由 SectorEngine 注入)
| 特征 |
含义 |
sector_change_pct |
所属板块涨跌幅 |
sector_up_ratio |
板块内上涨比例 |
sector_limitup_count |
板块内涨停数 |
sector_volume_surge |
板块成交额突增 |
market_sentiment |
全市场情绪指数(0–100) |
sector_rank |
板块在全市场排名 |
时序缓冲
每只股票维护一个 30 分钟环形缓冲(TimeSeriesBuffer),用于计算滑动窗口指标。被移出股票池的标的会自动清理缓冲。
4.2 HotScoreEngine — 热点评分引擎
核心公式:
HotScore = Σ(weight_i × percentile_rank(feature_i)) × 100
| 分量 |
默认权重 |
来源特征 |
volume_surge |
0.35 |
volume_surge_5m |
active_buy |
0.25 |
active_buy_ratio |
sector_linkage |
0.20 |
sector_up_ratio × sector_change_pct |
turnover |
0.10 |
turnover_rate |
seal_quality |
0.10 |
log1p(seal_amount × seal_duration) |
评分等级
| 等级 |
阈值 |
含义 |
strong_hot |
Score ≥ 85 |
强热点 |
potential_hot |
Score ≥ 70 |
潜在热点 |
normal |
Score < 70 |
普通 |
权重热加载
- 权重配置文件:
config/hotscore_weights.yaml
- 支持运行时修改后自动生效(文件变更检测)
- 收盘后
_auto_adjust_weights() 基于 IC 分析自动优化权重
4.3 SectorEngine — 板块联动引擎
数据来源:新浪财经板块行情 + LimitUp 涨停检测
核心功能:
| 功能 |
说明 |
| 板块热度排行 |
综合涨幅、涨停数、成交额计算板块 heat_score |
| 龙头股识别 |
每个板块内涨幅最高的个股标记为龙头 |
| 全市场情绪指数 |
综合上涨比例、涨停数、板块热度的 0–100 评分 |
| 联动特征注入 |
为 FeatureEngine 提供每只股票所属板块的联动特征 |
板块映射来源:MySQL stock_pool 表的 sector 字段,维护双向映射(sector_to_symbols / symbol_to_sectors)。
4.4 AlertEngine — 异动告警引擎
| 规则 |
条件 |
级别 |
说明 |
hot_surge |
score_delta_5m > 25 |
high |
HotScore 5 分钟内急速升温 |
volume_explosion |
volume_surge_5m > 5 |
high |
成交额 5 倍以上爆发 |
sector_resonance |
sector_heat > 80 且涨停 ≥ 3 |
medium |
板块共振启动 |
seal_break |
涨停封板 → 打开 |
medium |
涨停板炸板预警 |
continuous_buy |
连续买 > 20 且主买比 > 0.75 |
low |
连续大单买入 |
限流策略:
- 同规则同股票冷却:5 分钟内不重复告警
- 全局频控:每分钟最多 20 条告警
5. 评估层
评估层是 Market Hotspot 的核心价值闭环——不仅产出信号,还量化验证信号的准确性。
5.1 评估流程
盘中每分钟:
┌──────────────────────────────────────────────────────┐
│ T 时刻: 拍快照 (HotScore Top N 的标的 + 当前价格) │
│ ↓ │
│ T+N 分钟: 回填真实结果 │
│ · 当前价格 → 计算涨跌幅 │
│ · 是否涨停 │
│ · 是否进入龙虎榜 │
│ · 是否成交额 Top20 │
│ · 是否板块龙头 │
│ ↓ │
│ 生成 EvalRecord (Precision / Recall / 超额收益) │
└──────────────────────────────────────────────────────┘
收盘后 17:00:
┌──────────────────────────────────────────────────────┐
│ 1. 采集龙虎榜 → patch_longhu 回填当日 outcomes │
│ 2. 生成每日评估报告 │
│ 3. 基于 IC 自动调整 HotScore 权重 │
└──────────────────────────────────────────────────────┘
5.2 评估指标
| 指标 |
定义 |
| Precision |
Top N 中上涨股票占比 |
| Recall |
Top N 命中的上涨股票占全市场上涨股票的比例 |
| 平均收益 |
Top N 股票的平均涨跌幅 |
| 超额收益 |
Top N 平均收益 − 全市场平均收益 |
| 上涨比例 |
Top N 中上涨的比例 |
| 涨停命中 |
Top N 中后续涨停的股票数 |
| 龙虎榜命中 |
Top N 中当日上龙虎榜的股票数 |
5.3 评估子模块
| 模块 |
功能 |
| PrecisionByThreshold |
多阈值分析:Score ≥ 90/85/80/75/70,Top 10/20/50 各自的 Precision 和收益 |
| BaselineComparator |
基线对比:HotScore Top20 vs 成交额 Top20 vs 涨幅 Top20 vs 随机 20 只 |
| SessionAnalyzer |
分时段分析:开盘 15 分钟 / 上午中段 / 上午尾段 / 下午前段 / 下午中段 / 尾盘 30 分钟 |
| FeatureICAnalyzer |
分量 IC 分析:计算 5 个 HotScore 分量与后续涨跌的 Spearman Rank IC |
| WeightOptimizer |
权重优化建议:基于 IC 正负和大小,建议权重调整方向(单次步长 ≤ 10%) |
| DailyReporter |
日报生成:汇总以上所有分析生成结构化日报 |
5.4 每日评估报告示例
═══════════════════════════════════════════════════════
2026-07-16 评估报告 | 10分钟窗口 | Top20
═══════════════════════════════════════════════════════
快照数: 25 覆盖股票: 174
── 核心指标 ──
平均 Precision: 14.6%
平均 Recall: 2.3%
平均收益: -0.21%
平均超额收益: -0.11%
平均上涨比例: 14.6%
涨停命中: 107
龙虎榜命中: 3
── 基线对比 ──
策略 平均收益 上涨比例 中位数
HotScore Top20 +0.06% 25.0% +0.00% ★
成交额 Top20 +0.63% 75.0% +0.53%
涨幅 Top20 +0.01% 20.0% +0.00%
随机20只 +0.22% 40.0% +0.00%
── 分时段 Precision ──
下午中段 样本= 6 Precision=7.5% 收益=-0.35% 超额=-0.09%
尾盘30分钟 样本= 19 Precision=16.8% 收益=-0.16% 超额=-0.12%
── 分量 IC 分析 ──
volume_surge IC=-0.082 权重 0.35 → - [基本无用]
active_buy IC=-0.070 权重 0.25 → - [基本无用]
sector_linkage IC= 0.122 权重 0.20 → 0.37 [强信号]
turnover IC= 0.000 权重 0.10 → 0.0 [基本无用]
seal_quality IC= 0.212 权重 0.10 → 0.63 [强信号]
── 多阈值 Precision ──
score≥90 选中= 0 Precision=0.0% 收益=+0.00%
score≥85 选中= 0 Precision=0.0% 收益=+0.00%
score≥80 选中= 15 Precision=13.3% 收益=-0.41%
score≥75 选中= 32 Precision=6.2% 收益=-0.33%
score≥70 选中= 67 Precision=13.4% 收益=-0.22%
top10 选中= 10 Precision=20.0% 收益=-0.43%
top20 选中= 20 Precision=10.0% 收益=-0.37%
top50 选中= 50 Precision=10.0% 收益=-0.22%
═══════════════════════════════════════════════════════
5.5 权重自动调优
收盘后系统基于近 5 日滚动 IC 自动调整 HotScore 权重:
- 计算每个分量在近 5 日的平均 Spearman IC
- IC 为负或接近零的分量,权重逐步降低(单次最多 -10%)
- IC 为正的分量,按 IC 大小重新分配权重
- 调整结果写回
config/hotscore_weights.yaml,同时保留 previous_weights 和 rolling_ic 作为审计记录
6. 存储层
6.1 Redis — 实时状态
| Key 模式 |
数据类型 |
说明 |
TTL |
hotspot:ranking:{date} |
Sorted Set |
热点排行(score 为 HotScore) |
24h |
hotspot:features:{symbol} |
Hash |
最新特征快照 |
24h |
hotspot:score_history:{symbol}:{date} |
List |
当日 HotScore 时序 |
7d |
sector:ranking:{date} |
Sorted Set |
板块热度排行 |
24h |
alert:recent |
List(≤100) |
最近告警列表 |
24h |
hotspot:longhu:{date} |
List |
龙虎榜记录(JSON) |
3d |
eval:latest:{horizon} |
Hash |
最新评估指标 |
无 |
eval:precision_series:{date}:{horizon} |
List |
Precision 分钟时序 |
7d |
system:collector_stats |
Hash |
采集器状态统计 |
无 |
6.2 DuckDB — 历史持久化
| 表 |
内容 |
保留策略 |
feature_history |
每分钟特征 + HotScore 快照 |
data_keep_days(默认 30 天) |
eval_snapshots |
评估快照(Top N 标的列表) |
同上 |
eval_outcomes |
单股回填结果(涨跌、涨停、龙虎榜等) |
同上 |
eval_records |
评估汇总记录(Precision、收益、命中数) |
同上 |
eval_daily_report |
每日评估报告 JSON |
同上 |
数据库文件位置:data/hotspot/hotspot.duckdb
6.3 MySQL — 股票池
系统从 MySQL stock_pool 数据库读取关注列表:
| 表 |
用途 |
stock_pool |
股票池,字段:symbol, name, sector, is_active, market 等 |
仅读取 is_active = 1 的记录,每 5 分钟自动检测变化并热更新。
6.4 DataBus — 内存消息队列
基于 asyncio.Queue 实现的轻量级发布/订阅总线,采集器发布原始数据,引擎层消费。队列溢出时自动清理旧数据并记录警告日志。
7. API 接口
系统默认运行在 http://127.0.0.1:8001。
7.1 系统基础
| 方法 |
路径 |
说明 |
| GET |
/health |
健康检查,返回 status、is_trading_day、is_trading_time |
7.2 热点排行 /api/hotspot
| 方法 |
路径 |
参数 |
说明 |
| GET |
/api/hotspot/ranking |
n=20 |
返回 Top N 热点排行,含名称、等级、涨跌幅、量比 |
| GET |
/api/hotspot/detail/{symbol} |
— |
单股详情:全量特征 + HotScore 分量明细 |
| GET |
/api/hotspot/history/{symbol} |
— |
当日 HotScore 分钟级历史曲线 |
| GET |
/api/hotspot/surging |
threshold=20 |
5 分钟内分数急升的股票(delta_5m > threshold) |
7.3 板块 /api/sector
| 方法 |
路径 |
参数 |
说明 |
| GET |
/api/sector/ranking |
n=30 |
板块热度排行,含 heat_score、涨幅、涨停数、龙头 |
7.4 告警 /api/alert
| 方法 |
路径 |
参数 |
说明 |
| GET |
/api/alert/recent |
n=50 |
最近告警列表 |
7.5 评估 /api/eval
| 方法 |
路径 |
参数 |
说明 |
| GET |
/api/eval/realtime |
horizon=10 |
实时评估指标:Precision、超额收益、涨停命中 |
| GET |
/api/eval/precision_series/{date} |
horizon=10 |
指定日期的 Precision 分钟时序 |
| GET |
/api/eval/daily/{date} |
— |
指定日期的评估日报 |
| GET |
/api/eval/trend |
days=7 |
近 N 日 Precision / 超额收益趋势 |
7.6 龙虎榜 /api/longhu
| 方法 |
路径 |
参数 |
说明 |
| GET |
/api/longhu/today |
trade_date |
当日龙虎榜记录,含上榜原因、买卖金额、是否在股票池 |
| GET |
/api/longhu/symbols |
trade_date |
当日上榜标的代码集合 |
7.7 系统管理 /api/system
| 方法 |
路径 |
说明 |
| GET |
/api/system/collectors |
采集器实时状态 + Redis 存储统计 |
| GET |
/api/system/config |
当前运行配置(密码等敏感字段脱敏) |
7.8 WebSocket /ws
连接后自动接收实时推送,消息格式为 JSON:
| type |
触发时机 |
data 内容 |
ranking_update |
每分钟计算完成后 |
Top 20 排行(含 level、change_pct、score) |
alert |
告警触发时 |
告警详情(规则、级别、标的、描述) |
eval_update |
评估回填完成时 |
最新 EvalRecord(Precision、收益、命中数) |
8. 配置说明
所有配置集中在 config/settings.yaml,支持点分路径访问(如 settings.get("storage.redis.host"))。
8.1 系统配置
| 配置项 |
默认值 |
说明 |
system.name |
market_hotspot |
系统名称 |
system.log_level |
INFO |
日志级别(DEBUG / INFO / WARNING / ERROR) |
system.timezone |
Asia/Shanghai |
系统时区 |
system.debug_mode |
false |
调试模式,跳过交易日/时段限制 |
system.stock_pool_reload_seconds |
300 |
股票池热更新间隔(秒) |
system.data_keep_days |
30 |
DuckDB 历史数据保留天数 |
8.2 采集器配置
| 配置项 |
默认值 |
说明 |
collector.watch_source |
stock_pool |
关注列表来源(stock_pool / market_csv) |
collector.tick.interval_seconds |
15 |
逐笔成交采集间隔 |
collector.tick.max_symbols |
600 |
最大监控标的数 |
collector.orderbook.interval_seconds |
10 |
五档盘口采集间隔 |
collector.orderbook.batch_size |
80 |
盘口单次批量查询数 |
collector.sector.interval_seconds |
300 |
板块行情采集间隔 |
collector.limitup.interval_seconds |
60 |
涨停扫描间隔 |
collector.hk.interval_seconds |
30 |
港股行情采集间隔 |
collector.longhu.headless |
false |
龙虎榜 Playwright 无头模式 |
collector.longhu.timeout_ms |
60000 |
龙虎榜页面加载超时 |
8.3 连接池配置
| 配置项 |
默认值 |
说明 |
collector.connection_pool.size |
8 |
pytdx TCP 连接池大小 |
collector.connection_pool.reconnect_delay |
5 |
断线重连延迟(秒) |
collector.connection_pool.max_retries |
3 |
最大重试次数 |
collector.tdx_servers |
11 个服务器 |
通达信行情服务器列表 |
8.4 特征与评分配置
| 配置项 |
默认值 |
说明 |
feature.buffer_minutes |
30 |
时序缓冲保留分钟数 |
feature.compute_interval_seconds |
60 |
特征计算周期(秒) |
feature.large_order_threshold |
500000 |
大单阈值(元) |
hotscore.thresholds.strong_hot |
85 |
强热点阈值 |
hotscore.thresholds.potential_hot |
70 |
潜在热点阈值 |
8.5 告警配置
| 配置项 |
默认值 |
说明 |
alert.cooldown_minutes |
5 |
同规则同股票告警冷却时间 |
alert.max_alerts_per_minute |
20 |
每分钟最大告警数 |
8.6 评估配置
| 配置项 |
默认值 |
说明 |
eval.horizons |
[5, 10, 15, 30] |
评估回看窗口(分钟) |
eval.top_n_list |
[10, 20, 50] |
评估 Top N 粒度 |
eval.snapshot_interval_seconds |
60 |
快照间隔(秒) |
8.7 存储配置
| 配置项 |
说明 |
storage.redis.host |
Redis 服务器地址 |
storage.redis.port |
Redis 端口 |
storage.redis.db |
Redis 数据库编号 |
storage.redis.password |
Redis 密码 |
storage.duckdb.data_root |
DuckDB 数据目录 |
storage.mysql.host |
MySQL 服务器地址 |
storage.mysql.port |
MySQL 端口 |
storage.mysql.database |
MySQL 数据库名 |
storage.mysql.username |
MySQL 用户名 |
storage.mysql.password |
MySQL 密码 |
8.8 API 配置
| 配置项 |
默认值 |
说明 |
api.host |
127.0.0.1 |
监听地址 |
api.port |
8001 |
监听端口 |
api.ws_ping_interval |
30 |
WebSocket 心跳间隔(秒) |
8.9 HotScore 权重配置
独立文件 config/hotscore_weights.yaml,支持热加载和自动调优:
version: 1
updated_at: "2026-07-14"
note: "初始权重,来自规划书推荐值"
weights:
volume_surge: 0.35
active_buy: 0.25
sector_linkage: 0.20
turnover: 0.10
seal_quality: 0.10
thresholds:
strong_hot: 85
potential_hot: 70
normalization:
method: "percentile_rank"
自动调权后文件会更新 version、附带 previous_weights 和 rolling_ic 审计字段。
9. 运行时间线
9.1 交易日完整时间线
| 时间 |
事件 |
说明 |
| 启动 |
系统初始化 |
加载配置 → 连接存储 → 加载股票池 → 启动采集器 + API |
| 09:15 |
盘前采集开始 |
orderbook / sector / hk 开始运行 |
| 09:25 |
涨停扫描开始 |
limitup 采集器启动 |
| 09:30 |
开盘 |
tick 采集器启动,特征计算和评估开始 |
| 09:30–11:30 |
上午盘 |
每分钟:采集 → 特征 → 评分 → 快照 → 回填 → 告警 |
| 11:30–13:00 |
午休 |
A 股采集暂停,港股持续(跳过 12:00–13:00) |
| 13:00–15:00 |
下午盘 |
恢复全量运行 |
| 15:00–15:30 |
A 股盘后交易 |
orderbook / sector / limitup 继续采集(tick 已停) |
| 15:35 |
A 股采集结束 |
orderbook / sector / limitup 暂停 |
| 16:10 |
港股收盘 |
hk 采集器暂停 |
| 17:00 |
收盘任务 |
① 龙虎榜采集 → ② patch_longhu 回填 → ③ 日报生成 → ④ 权重调优 → ⑤ 历史清理 |
| 每 5 分钟 |
股票池热更新 |
仅在 09:00–15:40 期间检测 MySQL 变化 |
9.2 非交易日
系统保持运行但采集器不启动,计算循环不执行(可通过 debug_mode: true 强制运行)。
10. 部署与运维
10.1 环境要求
| 依赖 |
版本要求 |
说明 |
| Python |
≥ 3.10 |
推荐 3.11+ |
| Redis |
≥ 5.0 |
实时缓存 |
| MySQL |
≥ 5.7 |
股票池数据源 |
| Playwright |
— |
龙虎榜采集需要(需安装 Chromium) |
10.2 安装步骤
# 1. 创建虚拟环境
conda create -n market_hotspot python=3.11
conda activate market_hotspot
# 2. 安装依赖
pip install -r requirements.txt
# 3. 安装 Playwright 浏览器(龙虎榜采集)
playwright install chromium
# 4. 配置
cp config/settings.yaml.example config/settings.yaml
# 编辑 settings.yaml,填入 Redis/MySQL 连接信息
# 5. 启动
python main.py
10.3 运行方式
# 前台运行
python main.py
# 后台运行(Linux)
nohup python main.py > /dev/null 2>&1 &
# systemd 服务(推荐)
systemctl start market_hotspot
10.4 日志
- 控制台输出:带颜色的实时日志
- 文件日志:
logs/ 目录下按日滚动
- 日志格式:
时间|级别|模块:函数:行号 - 消息
- 日志级别:通过
system.log_level 配置
10.5 运维检查
| 检查项 |
方式 |
| 服务存活 |
GET /health |
| 采集器状态 |
GET /api/system/collectors |
| Redis 连通性 |
检查采集器统计是否更新 |
| 数据时效性 |
检查排行更新时间 |
| 磁盘空间 |
DuckDB 文件大小,30 天自动清理 |
11. 工具脚本
11.1 Redis 陈旧数据清理
当股票池发生较大变动后,可运行此脚本清理不在当前股票池中的 Redis 残留数据:
# 预览模式(不实际删除)
python scripts/cleanup_redis_stale.py
# 执行清理
python scripts/cleanup_redis_stale.py --execute
清理范围:
- hotspot:features:* 中不在股票池的标的
- hotspot:score_history:* 中不在股票池的标的
- 当日排行中不在股票池的成员
12. 已规划未实现功能
以下功能在技术方案中有规划但尚未实现:
| 功能 |
说明 |
优先级 |
| AI 模型预测 |
基于 LightGBM 的热点预测模型,model/ 目录已占位 |
中 |
| 前端界面 |
实时排行、K 线、板块热力图等可视化界面,frontend/ 路由已预留 |
高 |
| 节假日日历 |
接入 akshare 的 A 股交易日历,当前仅排除周末 |
中 |
| 板块详情 API |
/api/sector/detail/{sector} 查看板块成分股详情 |
低 |
| 板块共振 API |
/api/sector/resonance 多板块联动分析 |
低 |
| 权重手动调整 |
PUT /api/system/config/weights 通过 API 修改权重 |
低 |
| 评估详细 API |
快照详情、基线对比、IC 趋势等独立接口 |
低 |
附录 A:数据模型
核心数据结构
| 模型 |
字段概要 |
用途 |
TickRecord |
symbol, price, volume, amount, direction, timestamp |
逐笔成交记录 |
OrderBookSnapshot |
symbol, bids[5], asks[5], last_price, amount |
五档盘口快照 |
SectorSnapshot |
sector_code, name, change_pct, volume, leader |
板块快照 |
LimitUpRecord |
symbol, name, seal_amount, open_count, sector |
涨停记录 |
LonghuRecord |
symbol, name, trade_date, reason, buy_amount, sell_amount, net_amount |
龙虎榜记录 |
FeatureSnapshot |
symbol + 25 个特征字段 |
全量特征快照 |
HotScoreResult |
symbol, score, level, rank, components |
评分结果 |
Alert |
rule, level, symbol, message, timestamp |
异动告警 |
EvalSnapshot |
snapshot_id, top_symbols, prices, scores |
评估快照 |
OutcomeRecord |
symbol, return_pct, went_up, hit_limit_up, entered_longhu, ... |
回填结果 |
EvalRecord |
precision_up, avg_return, excess_return, limit_up_count, ... |
评估汇总 |
MarketState |
sentiment, up_ratio, limit_up_count |
全市场状态 |
CollectorStats |
name, total_records, total_requests, errors |
采集器统计 |
附录 B:目录结构
market_hotspot/
├── main.py # 系统入口
├── requirements.txt # Python 依赖
├── .python-version # conda 环境名
│
├── config/
│ ├── settings.yaml # 全局配置
│ └── hotscore_weights.yaml # HotScore 权重(支持热加载 + 自动调优)
│
├── api/ # REST + WebSocket API
│ ├── routes_hotspot.py # 热点排行相关
│ ├── routes_sector.py # 板块相关
│ ├── routes_alert.py # 告警相关
│ ├── routes_eval.py # 评估相关
│ ├── routes_longhu.py # 龙虎榜相关
│ ├── routes_system.py # 系统管理
│ └── ws.py # WebSocket 管理
│
├── collector/ # 数据采集层
│ ├── base.py # 采集器基类
│ ├── manager.py # 采集器管理器
│ ├── tick_collector.py # 逐笔成交
│ ├── orderbook_collector.py # 五档盘口
│ ├── sector_collector.py # 板块行情
│ ├── limitup_collector.py # 涨停检测
│ ├── hk_collector.py # 港股行情
│ └── longhu_collector.py # 龙虎榜
│
├── engine/ # 计算引擎层
│ ├── feature_engine.py # 特征计算
│ ├── hotscore_engine.py # 热点评分
│ ├── sector_engine.py # 板块联动
│ └── alert_engine.py # 异动告警
│
├── evaluator/ # 评估层
│ ├── eval_engine.py # 评估引擎
│ ├── precision.py # 多阈值 Precision
│ ├── baseline.py # 基线对比
│ ├── session_analyzer.py # 分时段分析
│ ├── ic_analyzer.py # IC 分析
│ ├── weight_optimizer.py # 权重优化
│ └── reporter.py # 日报生成
│
├── storage/ # 存储层
│ ├── cache.py # DataBus + 时序缓冲
│ ├── redis_store.py # Redis 存储
│ └── duckdb_store.py # DuckDB 存储
│
├── common/ # 公共模块
│ ├── config.py # 配置管理
│ ├── models.py # 数据模型
│ ├── trading_calendar.py # 交易日历
│ ├── symbol_utils.py # 代码工具
│ └── logger.py # 日志配置
│
├── scripts/ # 工具脚本
│ └── cleanup_redis_stale.py # Redis 清理
│
├── data/ # 运行时数据
│ └── hotspot/hotspot.duckdb # DuckDB 数据库
│
├── logs/ # 运行日志
│
└── docs/ # 文档
├── 技术方案.md
├── 热点侦测系统.pdf
└── 产品说明手册.md # 本文档
暂无评论,快来抢沙发吧~