
A股每天都有股票突然拉涨停或闪崩跌停。散户看到的是"机会"或"灾难",而量化玩家看到的是"信号"。这篇文章不讲K线理论,只给你一套可落地的技术方案——从数据接入到告警推送,独立搭建一个7×24小时运行的股票异动风控机器人。
交易所对异动有明确定义:连续3个交易日内日收盘价格涨跌幅偏离值累计达到±20%、日振幅值达到15%、日换手率达到20%等。触发异动意味着市场情绪剧烈波动,对持仓者来说,这是必须关注的风险信号。
手动盯盘不现实,你需要一个机器人替你24小时值班。
核心需求拆解:
需求 | 技术实现 |
|---|---|
实时获取行情数据 | WebSocket订阅 / 定时轮询 |
实时计算异动指标 | 滑动窗口 + 偏离值公式 |
触发条件立即告警 | 规则引擎 + 消息推送 |
历史回测验证策略 | 离线数据 + 回放机制 |
1┌─────────────────────────────────┐
2│ 告警层(通知你) │ 钉钉/飞书/邮件/短信
3├─────────────────────────────────┤
4│ 规则层(判断异动) │ 偏离值/振幅/换手率/量比
5├─────────────────────────────────┤
6│ 计算层(实时处理) │ 滑动窗口 + 指标计算
7├─────────────────────────────────┤
8│ 数据层(获取行情) │ Tushare / AKShare / 交易所API
9└─────────────────────────────────┘
10每层解耦,单独迭代,这是工程化思维的基本功。
推荐AKShare免费接口,覆盖A股全量数据,无频率限制。
python1import akshare as ak
2import pandas as pd
3
4def get_realtime_quotes():
5 """获取实时行情,每3秒刷新一次"""
6 df = ak.stock_zh_a_spot_em()
7 df = df[['代码', '名称', '最新价', '涨跌幅', '成交量', '换手率', '振幅']]
8 df.columns = ['code', 'name', 'price', 'pct_change', 'volume', 'turnover', 'amplitude']
9 return df
10生产环境建议用WebSocket直连腾讯云金融数据API,延迟可控制在50ms以内,比轮询快一个量级。
python1def calc_deviation(df, window=3):
2 """计算N日涨跌幅偏离值"""
3 df['pct_change_1d'] = df['pct_change']
4 df['benchmark'] = df['pct_change_1d'].rolling(window).sum() # 同期大盘涨幅
5 df['deviation'] = df['pct_change_1d'] - df['benchmark']
6 df['cum_deviation'] = df['deviation'].rolling(window).sum()
7 return df
8
9def check_abnormal(row):
10 """异动判定规则"""
11 rules = {
12 'deviation': abs(row['cum_deviation']) >= 20, # 偏离值±20%
13 'amplitude': row['amplitude'] >= 15, # 振幅≥15%
14 'turnover': row['turnover'] >= 20, # 换手率≥20%
15 'volume_ratio': row['volume'] / row['volume_ma_5'] >= 3 # 量比≥3
16 }
17 return any(rules.values()), rules
18这四条规则覆盖了90%的交易所异动场景。先跑通这四条,再根据需要扩展。
python1import requests
2
3def send_alert(stock, reason, value):
4 """飞书机器人推送"""
5 webhook_url = "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"
6 message = {
7 "msg_type": "interactive",
8 "card": {
9 "config": {"wide_screen_mode": True},
10 "elements": [{
11 "tag": "markdown",
12 "content": f"## 🚨 异动告警\n"
13 f"**{stock['name']}({stock['code']})**\n"
14 f"原因: {reason}\n"
15 f"数值: {value}\n"
16 f"时间: {datetime.now().strftime('%H:%M:%S')}"
17 }]
18 }
19 }
20 requests.post(webhook_url, json=message)
21python1def backtest(df, start_date, end_date):
2 """用历史数据验证规则有效性"""
3 df = df[(df['date'] >= start_date) & (df['date'] <= end_date)]
4 signals = []
5 for i in range(len(df)):
6 window = df.iloc[max(0,i-2):i+1]
7 if len(window) < 3: continue
8 abnormal, rules = check_abnormal(window.iloc[-1])
9 if abnormal:
10 signals.append({
11 'date': window.iloc[-1]['date'],
12 'code': window.iloc[-1]['code'],
13 'reason': [k for k,v in rules.items() if v][0]
14 })
15 return pd.DataFrame(signals)
16
17# 跑一遍2025年全年数据,看看误报率多少
18results = backtest(hist_df, '2025-01-01', '2025-12-31')
19print(f"全年触发{len(results)}次,误报率{calc_false_positive(results)}%")
20回测不是可选项,是必选项。误报率超过30%的规则,上线后你会被消息轰炸到关掉机器人。
步骤 | 操作 | 工具 |
|---|---|---|
① 容器化 | Docker打包,确保环境一致 | Dockerfile + docker-compose |
② 定时调度 | 每3秒拉一次数据,用Cron或APScheduler | APScheduler 比 Crontab 更灵活 |
③ 稳定运行 | 异常自动重启,日志持久化 | supervisor 或 systemd |
dockerfile1FROM python:3.11-slim
2WORKDIR /app
3COPY requirements.txt .
4RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
5COPY . .
6CMD ["python", "main.py"]
7坑 | 真相 | 解决方案 |
|---|---|---|
❌ 数据源单点故障 | AKShare偶尔抽风,机器人直接瞎了 | 双数据源兜底,AKShare挂了切Tushare |
❌ 告警风暴 | 一天触发200条,全部忽略 | 合并同股票连续告警,5分钟内只推一次 |
❌ 回测 overfitting | 历史数据表现完美,实盘全废 | 规则参数用滚动窗口优化,别硬编码固定值 |
搭建异动风控机器人的本质,不是写代码,是把你的风控逻辑翻译成机器能执行的规则。
先跑通最小版本:接数据 → 算偏离值 → 触发告警。三步就够。然后再逐步加规则、加回测、加部署。
别追求一步到位,先让机器人替你值第一个夜班。
本文首发于腾讯云开发者社区。风控不是等亏了才做的事,是赚钱之前就该建好的系统。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。