A股量化选股和监控系统
一个完整的A股量化选股、实时监控与市场情绪分析系统。
作者: James Mei
邮箱: meijinmeng@126.com
博客: https://www.cnblogs.com/Jame-mei
版本: 1.1.2
许可证: MIT
🆕 v1.1.2 更新 (2026-02-24)
核心优化
- ⚡ 性能提升6-10倍:交易时间使用新浪财经(0.1秒 vs 1.5秒)
- 🔧 修复关键Bug:全市场数据更新、选股功能
- 📊 数据完整性:从8只提升到5748只(98.9%)
- 🎯 智能切换:交易时间新浪优先,盘后akshare稳定
技术改进
- 双数据源架构(新浪+akshare)
- 自动判断交易时间
- 超时保护和降级机制
- 完整的向后兼容
详见:CHANGELOG.md
核心功能
1. 市场情绪评分 (7维度)
基于全市场5000+只A股的综合情绪评分(0-100分):
- 涨跌家数比 (20%)
- 平均涨幅 (20%)
- 涨停/跌停比 (15%)
- 强势股占比 (15%)
- 成交活跃度 (10%)
- 波动率 (10%)
- 趋势强度 (10%)
2. 智能选股引擎
短线选股 (1-5天)
5大策略,每日推荐3-5只短线机会股:
- RSI短线 - 超短线RSI策略,适合T+0或快速进出
- MACD短线 - MACD金叉死叉,短期趋势跟踪
- KDJ短线 - KDJ超买超卖,适合日内波段
- 布林突破 - 布林带突破,捕捉短期波动
- 放量突破 - 量价齐升,短期强势股
多指标共振评分体系 (满分100分):
- RSI信号 (20分)
- KDJ信号 (20分)
- MACD信号 (15分)
- 布林带信号 (15分)
- 量价异动 (15分)
- 资金流向 (15分)
精确买卖点:
- 动态止损止盈(基于ATR)
- 买入价、止损价、止盈价自动计算
- 预期收益率、风险收益比
中长线选股 (20-180天)
7大策略,每日推荐5-10只优质股票:
- MA趋势 - 均线多头排列,趋势跟踪 (20-60天)
- MACD趋势 - MACD趋势确认,中期持有 (15-30天)
- 价值成长 - 长期价值投资 (60-180天)
- 突破回踩 - 突破后回踩买入 (10-30天)
- 底部反转 - RSI+MACD双确认 (15-30天)
- 趋势加速 - 均线多头+放量 (10-20天)
- 强势股回调 - 强势股回调低吸 (5-15天)
综合评分维度:
- 技术指标 (40%) - MA/MACD/RSI/KDJ等
- 资金流向 (30%) - 主力资金净流入
- 市场热度 (15%) - 换手率、振幅
- 风险评估 (15%) - 波动率、回撤
持仓建议:
- 建议仓位(根据评分)
- 预期收益率
- 风险等级
- 持仓周期
选股配置
- 自动过滤创业板(3开头)和科创板(688开头)
- 支持自定义监控股票池(watchlist.json)
- 每日自动推荐,飞书/企业微信告警
3. 实时价格监控
- 交易时间:每5秒更新价格
- 非交易时间:显示历史数据
- 自动判断交易时段(9:15-11:30, 13:00-15:00)
4. 涨跌幅排行榜
- 实时涨幅榜(Top 5)
- 实时跌幅榜(Top 5)
- 支持点击查看详情
5. Web可视化界面
- 市场情绪仪表盘
- 监控股票卡片展示
- 统计数据汇总
- 响应式设计
使用方式
快速开始
- 安装依赖
pip3 install akshare flask ccxt
- 配置监控股票
编辑
web_app.py,修改WATCHED_STOCKS列表:
WATCHED_STOCKS = [
'600900', # 长江电力
'601985', # 中国核电
# 添加更多股票代码...
]
- 启动Web服务
cd scripts/
python3 web_app.py
访问 http://localhost:5000
自动化运行
设置Cron任务(交易时间每5分钟更新):
openclaw cron add --name "A股全市场数据更新" \
--schedule "*/5 9-15 * * 1-5" \
--tz "Asia/Shanghai" \
--payload '{"kind":"systemEvent","text":"cd <skill-path>/scripts && python3 smart_market_updater.py"}'
替换 <skill-path> 为技能安装路径。
手动执行
# 更新全市场数据
python3 scripts/update_all_market_data.py
# 计算市场情绪
python3 scripts/market_sentiment.py
# 智能更新(仅交易时间)
python3 scripts/smart_market_updater.py
# 检查交易时间
python3 scripts/is_trading_time.py
# 短线选股(每日推荐3-5只)
python3 scripts/short_term_selector.py
# 中长线选股(每日推荐5-10只)
python3 scripts/long_term_selector.py
# 增强版中长线选股
python3 scripts/enhanced_long_term_selector.py
目录结构
scripts/
├── web_app.py # Flask Web服务
├── stock_cache_db.py # SQLite数据缓存
├── stock_async_fetcher.py # 异步数据获取
├── market_sentiment.py # 市场情绪计算
├── is_trading_time.py # 交易时间判断
├── smart_market_updater.py # 智能更新器
├── update_all_market_data.py # 全市场数据更新
├── short_term_selector.py # 短线选股引擎
├── long_term_selector.py # 中长线选股引擎
├── enhanced_long_term_selector.py # 增强版中长线选股
├── strategy_config.py # 策略配置文件
└── templates/
└── index.html # Web前端页面
API端点
GET /api/market/sentiment
返回全市场情绪评分
响应示例:
{
"score": 57,
"level": "偏乐观",
"emoji": "🟢",
"description": "市场偏强,情绪稳定",
"stats": {
"total": 5000,
"gainers": 2460,
"losers": 2534,
"limit_up": 15,
"limit_down": 3
}
}
GET /api/stocks
返回所有监控股票数据
GET /api/stocks/realtime
返回监控股票实时价格(轻量级)
GET /api/stock/<code>
返回单只股票详情
配置说明
交易时间配置
默认交易时间:周一至周五 9:15-15:00
修改 is_trading_time.py:
TRADING_HOURS = {
'morning': (9, 15, 11, 30), # 9:15-11:30
'afternoon': (13, 0, 15, 0), # 13:00-15:00
}
数据缓存配置
SQLite数据库:stock_cache.db
默认缓存时间:30分钟
修改 stock_cache_db.py:
MAX_AGE_MINUTES = 30 # 缓存有效期
监控股票配置
编辑 web_app.py 中的 WATCHED_STOCKS 列表
市场情绪阈值
修改 market_sentiment.py:
# 情绪等级阈值
LEVELS = [
(80, 100, '极度乐观', '🔴'),
(65, 79, '乐观', '🟠'),
(55, 64, '偏乐观', '🟢'),
# ...
]
数据来源
- akshare: 获取A股实时行情、全市场数据
- 本地缓存: SQLite数据库存储历史数据
性能优化
-
分级更新
- 实时价格: 5秒(仅价格+涨跌)
- 完整数据: 30秒(含技术指标)
- 后端更新: 5分钟(全市场数据)
-
智能缓存
- 交易时间: 5分钟缓存
- 非交易时间: 显示历史数据
-
异步获取
- 使用异步方式获取全市场数据
- 避免阻塞主线程
故障排查
问题1: 数据全为null
原因: 非交易时间,akshare返回空数据 解决: 等待交易时间,或导入演示数据
问题2: Web界面一直转圈
原因: 数据库无有效数据
解决: 运行 python3 update_all_market_data.py
问题3: Cron任务不执行
原因: 时区配置错误
解决: 确保时区设置为 Asia/Shanghai
问题4: 端口被占用
原因: Flask默认端口5000冲突
解决: 修改 web_app.py 中的端口号
扩展开发
添加新的监控指标
编辑 market_sentiment.py,添加新的评分维度:
def calculate_sentiment(stocks):
# 添加新维度
new_dimension_score = calculate_new_dimension(stocks)
# 调整权重
score = (
gain_ratio_score * 0.18 + # 降低原有权重
# ...
new_dimension_score * 0.10 # 新维度10%
)
自定义告警规则
创建新的告警脚本:
def check_custom_alert():
cache = StockCache()
stocks = cache.get_all_stocks()
# 自定义告警逻辑
alerts = []
for stock in stocks:
if stock['change_pct'] > 5:
alerts.append(stock)
if alerts:
send_alert(alerts)
技术栈
- 后端: Python 3.9+, Flask
- 数据: akshare, SQLite
- 前端: jQuery, Bootstrap
- 自动化: OpenClaw Cron
许可证
MIT License
联系作者
欢迎反馈问题、建议和改进意见!
致谢
- akshare 提供A股数据接口
- OpenClaw 提供自动化调度能力