用Python+TuShare搭建A股实时监控系统的实战经验
# 用Python+TuShare搭建A股实时监控系统的实战经验
## 前言
作为一个量化交易爱好者,我一直在寻找一套稳定、高效的数据底座来支撑自己的交易系统。经过对比AKShare、BaoStock等方案后,我最终选择了TuShare Pro作为核心数据源。本文分享我用Python+TuShare搭建A股实时监控系统的完整过程,踩过的坑和最终的解决方案。
## 一、系统架构设计
整个监控系统分为三个核心模块:
```
数据采集层 → 信号处理层 → 可视化/告警层
```
- **数据采集层**:通过TuShare Pro API定时拉取行情、资金流、融资融券等数据
- **信号处理层**:基于采集的数据计算技术指标和自定义信号
- **可视化/告警层**:使用Streamlit搭建实时看板,配合企业微信Webhook推送告警
## 二、数据采集:TuShare接口选型
### 2.1 核心接口选择
在我的系统中,主要用到了以下TuShare接口:
| 接口 | 用途 | 调用频率 |
|------|------|----------|
| `moneyflow` | 个股资金流向 | 每日收盘后 |
| `margin` | 融资融券数据 | 每日收盘后 |
| `daily` | 日线行情 | 盘中+盘后 |
| `stk_limit` | 涨跌停统计 | 盘后 |
| `hsgt_top10` | 沪深港通十大成交股 | 盘后 |
| `cyq_perf` | 筹码分布 | 每周 |
### 2.2 资金流数据采集实战
资金流是我最看重的数据之一,TuShare的moneyflow接口可以获取个股级别的资金流向:
```python
import tushare as ts
import pandas as pd
from datetime import datetime, timedelta
pro = ts.pro_api('your_token')
def get_moneyflow(ts_code, days=30):
"""获取个股资金流向数据"""
end_date = datetime.now().strftime('%Y%m%d')
start_date = (datetime.now() - timedelta(days=days)).strftime('%Y%m%d')
df = pro.moneyflow(
ts_code=ts_code,
start_date=start_date,
end_date=end_date
)
return df.sort_values('trade_date')
# 获取平安银行近30天资金流
df_flow = get_moneyflow('000001.SZ')
print(df_flow[['trade_date', 'buy_sm_amount', 'sell_sm_amount', 'buy_lg_amount', 'sell_lg_amount']].head())
```
**踩坑提示**:moneyflow接口需要120+积分,调用频率有限制,建议做好本地缓存。
### 2.3 融资融券数据采集
融资融券数据是观察市场杠杆情绪的重要指标:
```python
def get_margin_data(ts_code, days=60):
"""获取融资融券数据"""
end_date = datetime.now().strftime('%Y%m%d')
start_date = (datetime.now() - timedelta(days=days)).strftime('%Y%m%d')
df = pro.margin(
ts_code=ts_code,
start_date=start_date,
end_date=end_date
)
return df.sort_values('trade_date')
df_margin = get_margin_data('000001.SZ')
```
## 三、信号处理:从数据到交易信号
### 3.1 资金流背离信号
我的核心策略之一是资金流背离信号——当股价下跌但主力资金持续净流入时,可能预示反弹:
```python
def detect_moneyflow_divergence(df_price, df_flow, window=10):
"""检测资金流与价格背离"""
# 计算价格趋势
price_trend = df_price['close'].pct_change(window).iloc[-1]
# 计算主力净流入趋势
df_flow['net_lg_flow'] = df_flow['buy_lg_amount'] - df_flow['sell_lg_amount']
flow_trend = df_flow['net_lg_flow'].rolling(window).sum().iloc[-1]
# 背离条件:价格下跌 + 主力净流入
if price_trend < -0.02 and flow_trend > 0:
return True, f"资金流背离:{window}日跌幅{price_trend:.2%},主力净流入{flow_trend:.0f}万元"
return False, ""
```
### 3.2 融资融券异常信号
融资余额短期大幅增长往往意味着市场情绪过热:
```python
def detect_margin_anomaly(df_margin, threshold=0.05):
"""检测融资余额异常增长"""
df_margin['rzye_pct'] = df_margin['rzye'].pct_change()
latest = df_margin.iloc[-1]
if latest['rzye_pct'] > threshold:
return True, f"融资余额异动:单日增长{latest['rzye_pct']:.2%}"
return False, ""
```
## 四、可视化看板搭建
用Streamlit搭建实时监控看板,核心代码如下:
```python
import streamlit as st
import plotly.graph_objects as go
st.set_page_config(page_title="A股监控系统", layout="wide")
# 侧边栏选择股票
ts_code = st.sidebar.text_input("股票代码", "000001.SZ")
# 资金流向图
df_flow = get_moneyflow(ts_code)
fig = go.Figure()
fig.add_trace(go.Bar(
x=df_flow['trade_date'],
y=df_flow['buy_lg_amount'] - df_flow['sell_lg_amount'],
name='主力净流入'
))
st.plotly_chart(fig, use_container_width=True)
# 信号检测
is_diverge, msg = detect_moneyflow_divergence(df_price, df_flow)
if is_diverge:
st.warning(f"⚠️ {msg}")
```
## 五、性能优化经验
### 5.1 数据缓存策略
TuShare的接口有调用频率限制,本地缓存至关重要:
```python
import os
import pickle
from datetime import datetime
def cache_data(key, data, cache_dir='./cache'):
"""缓存数据到本地"""
os.makedirs(cache_dir, exist_ok=True)
filepath = os.path.join(cache_dir, f"{key}.pkl")
with open(filepath, 'wb') as f:
pickle.dump({'data': data, 'timestamp': datetime.now()}, f)
def load_cache(key, cache_dir='./cache', max_age_hours=4):
"""加载缓存,超时返回None"""
filepath = os.path.join(cache_dir, f"{key}.pkl")
if os.path.exists(filepath):
with open(filepath, 'rb') as f:
cache = pickle.load(f)
age = (datetime.now() - cache['timestamp']).total_seconds() / 3600
if age < max_age_hours:
return cache['data']
return None
```
### 5.2 批量获取优化
用`trade_date`一次提取全市场数据再本地过滤,比逐个股票查询效率高很多:
```python
# 好的做法:按日期批量获取
df_all = pro.moneyflow(trade_date='20260522')
# 避免:逐个股票查询
# for code in codes:
# df = pro.moneyflow(ts_code=code, trade_date='20260522') # 太慢!
```
## 六、总结
1. **TuShare Pro的数据质量稳定**,moneyflow和margin接口是做短线监控的利器
2. **积分机制需要注意**:120分只能调用基础接口,建议多写文章赚积分到2000+才能解锁更多数据
3. **本地缓存是必须的**,避免频繁调用接口被限流
4. **Streamlit非常适合快速搭建监控看板**,结合Plotly做可视化效果很好
希望这篇文章能帮到正在搭建量化系统的朋友们。TuShare的社区很活跃,有问题可以在QQ群或官方文档中找到答案。
---
*本文基于TuShare Pro实际使用经验编写,数据接口以官方文档为准。*
更多推荐
所有评论(0)