一个现代化的股票监控与预警系统,采用前后端分离架构,集成了实时数据获取、异动检测、智能预警、用户界面等完整功能。
当前版本: v2.0 (重构版本)
开发状态: 核心功能已完成,系统可正常使用
架构: React + Flask + WebSocket 前后端分离
数据源: Tushare Pro API (支持2120积分权限)
- 📊 数据获取系统: Tushare Pro集成,支持日线、指标、资金流向数据
⚠️ 预警规则系统: 多维度预警规则配置和管理- 📝 预警记录系统: 完整的预警历史记录和统计
- 🎯 前端界面: 现代化React界面,自选股管理,K线图展示
- 🔌 API接口: 完整的RESTful API,支持CRUD操作
- 🗄️ 数据库架构: 优化的MySQL表结构和索引设计
- 🌐 WebSocket实时通信: 架构完成,待激活
- 🔍 异动检测算法: 框架完成,待实现
- 📱 实时监控面板: 计划中
- 📊 实时数据监控: 基于Tushare Pro的高质量股票数据
⚠️ 智能预警系统: 多维度预警规则,支持价格、成交量、技术指标等- 🔍 异动检测: 统计学算法识别价格和成交量异常变化
- 📱 现代化界面: React + Tailwind CSS响应式设计
- 🌐 实时通信: WebSocket技术实现毫秒级数据推送
- 📈 数据可视化: K线图、指标图表、实时更新
- 后端: Python 3.11+ / Flask / SQLAlchemy / WebSocket
- 前端: React 18 / Vite / Tailwind CSS / Shadcn/UI
- 数据处理: Pandas / NumPy / Tushare Pro
- 数据库: MySQL 8.0+ / 优化索引设计
- 通信: WebSocket / RESTful API / CORS支持
本项目采用完全前后端分离架构:
- 前端: React + Vite + Tailwind CSS (位于
web/目录) - 后端: Flask + REST API + WebSocket (位于
app/目录) - 数据库: MySQL 8.0+ (优化索引设计)
- 数据源: Tushare Pro API (支持2120积分权限)
- Python 3.11+ (后端开发语言)
- Node.js 18+ (前端构建工具)
- MySQL 8.0+ (数据存储)
- Tushare Pro账号 (免费注册即可)
# 在项目根目录下运行
pip install -r requirements_minimal.txt主要依赖说明:
- ✅ Flask 及相关扩展(Web框架)
- ✅ Flask-SocketIO(WebSocket支持)
- ✅ SQLAlchemy(数据库ORM)
- ✅ Tushare(股票数据源)
- ✅ PyMySQL(MySQL数据库驱动)
python init_datasource_db.py这个脚本会:
- 创建
data_source_config表 - 添加默认的Tushare Pro配置(未激活)
- 添加默认的Yahoo Finance配置(未激活)
预期输出:
✅ 数据源配置表创建成功
✅ 默认数据源配置创建成功
检查数据库配置 - 确认 config.py 中的数据库连接信息:
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASSWORD = 'your_password' # 修改为您的数据库密码
DB_NAME = 'stock'检查前后端分离配置 - 确认 config.py 中:
ENABLE_LEGACY_TEMPLATES = False # ✅ 已设置为False,不使用旧模板python run.py后端服务信息:
- API地址:
http://localhost:5000/api - WebSocket地址:
ws://localhost:5000 - 支持CORS:
http://localhost:5173(Vite开发服务器)
# 进入前端目录
cd web
# 安装依赖(如果还没安装)
pnpm install
# 启动开发服务器
pnpm dev前端服务信息:
- 开发地址:
http://localhost:5173 - 框架: Vite + React 18
- UI库: Shadcn/UI + Tailwind CSS
- 访问
http://localhost:5173 - 点击"数据源"标签页
- 输入您的Tushare Token
- 点击"测试连接"
- 测试成功后,点击"激活"
curl -X PUT http://localhost:5000/api/datasources/1 \
-H "Content-Type: application/json" \
-d '{
"config_data": {
"token": "YOUR_TUSHARE_TOKEN_HERE"
},
"is_active": true,
"is_default": true
}'- 访问 https://tushare.pro/
- 注册账号(免费)
- 在个人中心获取Token
- 免费版足够个人使用
打开浏览器访问:http://localhost:5000/api/datasources
应该返回JSON数据:
{
"success": true,
"data": [
{
"id": 1,
"source_type": "tushare",
"source_name": "Tushare Pro",
"is_active": false
}
]
}打开浏览器访问:http://localhost:5173
应该看到股票异动检测与智能预警系统的主界面。
- 前端界面: http://localhost:5173
- 后端API: http://localhost:5000/api
- WebSocket: ws://localhost:5000
为什么要用自选股?
- ✅ 精准高效: 只添加您关注的股票,避免一次性获取所有5000只股票
- ✅ 节省资源: 只获取和存储自选股数据,避免浪费空间
- ✅ 不会超限: 避免频繁调用Tushare API,符合免费版限制
- ✅ 用户友好: 更符合个人使用习惯
功能特点:
- ✅ 手动添加股票代码
- ✅ 设置股票备注
- ✅ 删除不关注的股票
- ✅ 查看最后同步时间
- ✅ 单只股票同步
- ✅ 批量同步所有自选股
使用流程:
-
添加自选股
1. 点击"添加"按钮 2. 输入股票代码(例如: 000001.SZ) 3. 输入股票名称(选填) 4. 添加备注(选填) 5. 点击"确认添加" -
常见股票代码格式:
- 深圳市场:
000001.SZ、002594.SZ、300750.SZ - 上海市场:
600000.SH、601318.SH、688981.SH
- 深圳市场:
-
推荐添加的股票(示例):
000001.SZ - 平安银行 600036.SH - 招商银行 000858.SZ - 五粮液 600519.SH - 贵州茅台 000333.SZ - 美的集团 -
同步数据
- 自动同步: 第一次点击股票查看K线图时自动获取
- 手动同步: 点击"同步"按钮,同步所有自选股数据
-
查看K线图
1. 在自选股列表中点击任意股票 2. 右侧显示K线图 3. 鼠标悬停查看详细信息
- K线图展示: 60个交易日历史数据,双Y轴(价格+成交量)
- 指标面板: 每日指标和资金流向数据
- 时间切换: 支持不同时间周期(开发中)
- 规则类型: 价格阈值、涨跌幅、成交量、换手率等
- 比较条件: 大于、小于、等于等逻辑运算
- 预警级别: 低级、中级、高级、严重四个级别
- 规则管理: 启用/禁用、编辑、删除规则
- 历史记录: 完整的预警触发历史
- 统计分析: 按类型、级别、时间的统计信息
- 状态管理: 预警解决状态跟踪
- Tushare集成: 支持Tushare Pro API配置
- 连接测试: 验证数据源连接状态
- 权限管理: 根据积分显示可用功能
- ✅ Tushare Pro API集成,支持2120积分权限
- ✅ 股票基础数据同步 (
stock_basic) - ✅ 日线行情数据 (
stock_daily_history) - ✅ 每日指标数据 (
stock_daily_basic) - ✅ 资金流向数据 (
stock_moneyflow) - ✅ NaN值处理和数据清洗机制
- ✅ 增量同步和全量刷新
- ✅ 预警规则数据库设计 (
alert_rules) - ✅ 预警记录系统 (
risk_alerts) - ✅ 多维度预警规则支持
- ✅ 预警触发引擎 (手动触发版本)
- ✅ 预警统计和历史管理
- ✅ React + Tailwind CSS现代化界面
- ✅ 自选股管理功能
- ✅ K线图展示 (ECharts集成)
- ✅ 预警规则配置页面
- ✅ 数据源配置界面
- ✅ 响应式设计和优雅交互
- ✅ 自定义确认对话框
- ✅ RESTful API设计
- ✅ 完整的CRUD操作
- ✅ 数据验证和错误处理
- ✅ CORS跨域支持
- ✅ 统一响应格式
- 🔄 WebSocket实时通信框架
- 🔄 实时数据推送服务
- 🔄 客户端连接管理
- ⏳ 实时数据流激活
- ⏳ 前端WebSocket集成
- 🔄 统计学异动检测框架
- 🔄 技术指标分析模块
- ⏳ 价格异动检测算法
- ⏳ 成交量异动检测算法
- ⏳ 多维度综合分析
- 📅 定时任务调度器: 替代手动触发的自动监控机制
- 📅 实时数据管道: 数据更新时自动触发预警检查
- 📅 多渠道通知: 邮件、短信、WebSocket推送等
- 📅 预警性能优化: 大量规则和股票的高效处理
- 📅 实时监控面板: 市场概览和异动榜单
- 📅 机器学习预测: 基于历史数据的价格预测
- 📅 投资组合管理: 多股票组合风险管理
- 📅 策略回测: 预警策略历史回测分析
- 📅 移动端适配: 响应式设计优化
- 📅 缓存策略: Redis集成和多层缓存
- 📅 数据库优化: 索引优化和查询性能提升
- 📅 负载均衡: 多实例部署支持
- 📅 监控告警: 系统运行状态监控
-
自动化预警监控 (优先级: 高)
- 实现定时任务调度器,每分钟自动运行预警检查
- 替代当前的手动触发机制
- 集成实时数据更新触发
-
WebSocket实时通信激活 (优先级: 高)
- 激活现有WebSocket框架
- 实现前端实时数据接收
- 完成实时预警推送
-
异动检测算法实现 (优先级: 中)
- 实现基于统计学的价格异动检测
- 实现成交量异动检测算法
- 集成技术指标分析
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端界面层 │ │ 通信层 │ │ 后端服务层 │
│ │ │ │ │ │
│ React 18 │◄──►│ WebSocket │◄──►│ Flask API │
│ Tailwind CSS │ │ RESTful API │ │ SQLAlchemy ORM │
│ Shadcn/UI │ │ CORS Support │ │ 业务逻辑层 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌─────────────────┐ │
│ 数据源层 │◄───────────┘
│ │
│ Tushare Pro │
│ Yahoo Finance │
│ 本地缓存 │
└─────────────────┘
│
┌─────────────────┐
│ 数据存储层 │
│ │
│ MySQL 8.0+ │
│ 索引优化 │
│ 数据完整性 │
└─────────────────┘
- TushareService: Tushare Pro API集成
- StockDataService: 数据同步和缓存管理
- RealtimeDataManager: 实时数据处理
- AlertTriggerEngine: 预警规则触发引擎
- AnomalyDetectionEngine: 异动检测算法 (开发中)
- RealtimeMonitorService: 实时监控服务 (开发中)
- WebSocket服务: 实时双向通信
- RESTful API: 标准HTTP接口
- 事件驱动: 异步消息处理
- StockDashboard: 主控制面板
- WatchlistManager: 自选股管理
- AlertRules: 预警规则配置
- StockChart: K线图表组件
基础路径: /api/datasources
GET /api/datasources响应示例:
{
"success": true,
"data": [
{
"id": 1,
"source_type": "tushare",
"source_name": "Tushare Pro",
"is_active": true,
"is_default": true,
"status": "成功",
"last_test_time": "2025-09-30T12:00:00"
}
]
}POST /api/datasources/{id}/testPUT /api/datasources/{id}
Content-Type: application/json
{
"config_data": {
"token": "your-tushare-token-here"
},
"is_active": true,
"is_default": true
}import requests
# 获取股票列表
response = requests.get('http://localhost:5000/api/stocks')响应示例:
{
"success": true,
"data": [
{
"ts_code": "000001.SZ",
"symbol": "000001",
"name": "平安银行",
"area": "深圳",
"industry": "银行",
"market": "主板"
}
],
"total": 4500,
"source": "tushare"
}# 获取日线数据
response = requests.get('http://localhost:5000/api/stocks/000001.SZ/daily?limit=60')参数:
start_date: 开始日期 (YYYYMMDD格式,可选)end_date: 结束日期 (YYYYMMDD格式,可选)limit: 返回条数限制 (默认60)
# 获取实时行情
response = requests.post('http://localhost:5000/api/stocks/realtime',
json={"symbols": ["000001.SZ", "600000.SH"]})# 获取每日指标
response = requests.get('http://localhost:5000/api/stocks/000001.SZ/basic')# 获取资金流向
response = requests.get('http://localhost:5000/api/stocks/000001.SZ/moneyflow')# 获取预警规则
response = requests.get('http://localhost:5000/api/rules')# 创建预警规则
rule_data = {
"rule_name": "平安银行涨幅预警",
"stock_code": "000001.SZ",
"rule_type": "price_change_percent",
"comparison_operator": "greater_than",
"threshold_value": 5.0,
"alert_level": "medium"
}
response = requests.post('http://localhost:5000/api/rules', json=rule_data)rule_type 可选值:
price_change_percent: 价格涨跌幅price_threshold: 价格阈值volume_ratio: 成交量比率turnover_rate: 换手率market_value_change: 市值变化
comparison_operator 可选值:
greater_than: 大于greater_than_or_equal: 大于等于less_than: 小于less_than_or_equal: 小于等于equal: 等于not_equal: 不等于
alert_level 级别:
low: 低级预警medium: 中级预警high: 高级预警critical: 严重预警
# 获取预警记录
response = requests.get('http://localhost:5000/api/alerts?limit=50')# 手动触发预警检查
response = requests.post('http://localhost:5000/api/trigger/check')ws://localhost:5000
import io from 'socket.io-client';
const socket = io('http://localhost:5000');
// 连接成功
socket.on('connected', (data) => {
console.log('连接成功:', data);
});
// 订阅市场数据
socket.emit('subscribe', {
type: 'market_data',
params: { symbol: '000001.SZ' }
});
// 接收实时数据
socket.on('market_data_update', (data) => {
console.log('市场数据更新:', data);
});
// 接收预警信息
socket.on('risk_alert', (data) => {
console.log('预警信息:', data);
});
// 取消订阅
socket.emit('unsubscribe', {
type: 'market_data',
params: { symbol: '000001.SZ' }
});market_data: 市场数据indicators: 技术指标signals: 交易信号monitor: 实时监控risk_alerts: 风险预警portfolio: 投资组合
{
"success": false,
"message": "错误描述信息"
}200: 成功400: 请求参数错误404: 资源不存在500: 服务器内部错误
lm_quantitative_analysis/
├── app/ # 后端应用
│ ├── api/ # REST API接口
│ │ ├── stock_routes.py # 股票数据API
│ │ ├── alert_routes.py # 预警规则API
│ │ └── datasource_routes.py # 数据源配置API
│ ├── models/ # 数据模型
│ │ ├── stock_basic.py # 股票基础信息
│ │ ├── alert_rule.py # 预警规则模型
│ │ └── risk_alert.py # 预警记录模型
│ ├── services/ # 业务服务
│ │ ├── tushare_service.py # Tushare数据服务
│ │ ├── stock_data_service.py # 股票数据服务
│ │ └── alert_trigger_engine.py # 预警触发引擎
│ ├── websocket/ # WebSocket事件
│ │ └── websocket_events.py # 实时通信事件
│ └── utils/ # 工具函数
├── web/ # 前端应用
│ ├── src/
│ │ ├── components/ # React组件
│ │ │ ├── ui/ # Shadcn UI组件
│ │ │ ├── StockDashboard.jsx
│ │ │ ├── WatchlistManager.jsx
│ │ │ ├── AlertRules.jsx
│ │ │ └── StockChart.jsx
│ │ ├── services/ # 前端服务
│ │ │ └── api.js # API调用封装
│ │ ├── App.jsx
│ │ └── main.jsx
│ ├── package.json
│ └── vite.config.js
├── 实时股票异动检测与智能预警系统核心功能设计/ # 项目文档
│ ├── 基于WebSocket的实时股票异动检测与智能预警系统.md
│ ├── 快速启动指南.md
│ └── API_ROUTES_SUMMARY.md
├── config.py # 配置文件
├── run.py # 启动脚本
├── requirements_minimal.txt # 依赖清单
└── README.md # 项目说明
在 config.py 中修改数据库连接:
# MySQL配置
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASSWORD = 'your_password'
DB_NAME = 'stock'
SQLALCHEMY_DATABASE_URI = f'mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}/{DB_NAME}'# 在前端界面配置,或通过环境变量
TUSHARE_TOKEN = "your_tushare_token_here"LOG_LEVEL = 'INFO'
LOG_FILE = 'logs/stock_analysis.log'接口: pro.stock_basic()
用途: 获取所有A股上市公司基本信息
权限: 免费用户可用
返回字段:
ts_code: 股票代码(如 000001.SZ)symbol: 股票代码(如 000001)name: 股票名称area: 地域industry: 行业market: 市场类型(主板/创业板/科创板)list_date: 上市日期
接口: pro.daily()
用途: 获取股票每日K线数据
权限: 免费用户可获取近3年日线数据
返回字段:
ts_code: 股票代码trade_date: 交易日期open/high/low/close: 开盘价/最高价/最低价/收盘价pre_close: 昨收价change: 涨跌额pct_chg: 涨跌幅(%)vol: 成交量(手)amount: 成交额(千元)
接口: pro.daily_basic()
用途: 获取股票每日基本面指标
权限: 免费用户可用
返回字段:
turnover_rate: 换手率(%)volume_ratio: 量比pe: 市盈率pb: 市净率ps: 市销率dv_ratio: 股息率dv_ttm: 股息率(TTM)total_share: 总股本(万股)float_share: 流通股本(万股)free_share: 自由流通股本(万股)total_mv: 总市值(万元)circ_mv: 流通市值(万元)
接口: pro.moneyflow()
用途: 获取沪深A股票资金流向数据
权限: 需要2000积分以上(免费用户可能无法访问)
返回字段:
buy_sm_vol: 小单买入量(手)buy_sm_amount: 小单买入金额(万元)sell_sm_vol: 小单卖出量(手)sell_sm_amount: 小单卖出金额(万元)buy_md_vol: 中单买入量(手)buy_md_amount: 中单买入金额(万元)sell_md_vol: 中单卖出量(手)sell_md_amount: 中单卖出金额(万元)buy_lg_vol: 大单买入量(手)buy_lg_amount: 大单买入金额(万元)sell_lg_vol: 大单卖出量(手)sell_lg_amount: 大单卖出金额(万元)buy_elg_vol: 特大单买入量(手)buy_elg_amount: 特大单买入金额(万元)sell_elg_vol: 特大单卖出量(手)sell_elg_amount: 特大单卖出金额(万元)net_mf_vol: 净流入量(手)net_mf_amount: 净流入额(万元)
免费用户(0积分):
- ✅ 股票基本信息
- ✅ 日线行情数据(近3年)
- ✅ 每日基本面指标
- ❌ 实时行情数据
- ❌ 分钟级数据
- ❌ 资金流向数据
2120积分用户:
- ✅ 所有免费功能
- ✅ 资金流向数据
- ✅ 更多历史数据
- ❌ 实时行情(需5000积分)
- ❌ 分钟级数据(需5000积分)
- 增量同步: 只获取最新的交易日数据
- 全量刷新: 定期更新历史数据
- 智能缓存: 避免重复调用API
- 错误重试: 网络异常时自动重试
- 限流控制: 遵守API调用频率限制
错误: Can't connect to MySQL server
解决方案:
# 1. 确认MySQL服务已启动
sudo systemctl start mysql # Linux
# 或在Windows服务中启动MySQL
# 2. 检查config.py中的数据库配置
# 确认用户名、密码、主机地址正确
# 3. 创建数据库
mysql -u root -p
CREATE DATABASE IF NOT EXISTS stock CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;错误: CORS policy: No 'Access-Control-Allow-Origin'
解决方案:
# 1. 确认后端已启动在5000端口
# 检查终端输出: * Running on http://localhost:5000
# 2. 确认前端运行在5173端口
# 检查终端输出: Local: http://localhost:5173/
# 3. 检查CORS配置
# 确认app/__init__.py中已配置CORS允许localhost:5173错误: Token未设置或无效
解决方案:
# 1. 确认Token已正确复制(不要有空格或换行)
# 2. 在Tushare官网验证Token状态
# 3. 检查积分余额(某些接口需要积分)
# 4. 尝试在Tushare官网重新生成Token错误: WebSocket connection failed
解决方案:
# 1. 安装eventlet依赖
pip install eventlet
# 2. 确认使用python run.py启动(不是flask run)
python run.py
# 3. 检查防火墙设置
# 确认5000端口未被阻止
# 4. 检查浏览器控制台错误信息错误: ModuleNotFoundError: No module named 'xxx'
解决方案:
# 重新安装依赖
pip install -r requirements_minimal.txt
# 如果使用虚拟环境,确认已激活
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows错误: 数据同步失败 或 API调用超限
解决方案:
# 1. 检查网络连接
# 2. 验证Tushare Token有效性
# 3. 检查API调用频率(免费版有限制)
# 4. 等待一段时间后重试
# 5. 使用自选股功能减少API调用# 后端日志
tail -f logs/stock_analysis.log
# 前端控制台
# 打开浏览器开发者工具 -> Console# 测试后端API
curl http://localhost:5000/api/datasources
# 测试数据源连接
curl -X POST http://localhost:5000/api/datasources/1/test-- 连接数据库
mysql -u root -p stock
-- 查看表结构
SHOW TABLES;
DESCRIBE data_source_config;
-- 查看数据
SELECT * FROM data_source_config;如果问题仍未解决,请:
- 查看项目GitHub Issues
- 提供详细的错误信息和日志
- 说明操作系统和Python版本
- 描述重现问题的步骤
- ✅ 架构重构: 从多因子选股系统重构为实时股票异动检测与预警系统
- ✅ 前后端分离: React + Flask架构,替代原有的模板系统
- ✅ 数据源集成: 完整的Tushare Pro API集成,支持2120积分权限
- ✅ 预警系统: 完整的预警规则和记录系统
- ✅ 现代化界面: React 18 + Tailwind CSS + Shadcn/UI
- ✅ API标准化: RESTful API设计,完整的CRUD操作
- ✅ 数据库优化: MySQL表结构优化和索引设计
- 多因子选股系统基础功能
- 机器学习模型集成
- 组合优化和回测功能
如需更详细的技术设计文档,请参考:
- 系统设计文档 - 完整的系统设计和实现细节
欢迎提交Issue和Pull Request来改进这个项目:
- Bug报告: 请详细描述问题和复现步骤
- 功能建议: 请说明功能需求和使用场景
- 代码贡献: 请遵循项目的代码规范
- 文档改进: 帮助完善项目文档
本项目采用 MIT 许可证。
如有问题或建议,请通过以下方式联系:
- 提交Issue到项目仓库
- 发送邮件:2389934506@qq.com
实时股票异动检测与智能预警系统 - 让股票监控更智能! 🚀
