📌 摘要 / 快速解答
策略触发买入/卖出信号后,通过企微或飞书机器人 Webhook 实时推送告警,是量化交易自动化的关键一环。本文使用 QuantDash Python SDK 获取多市场行情数据(A股/美股/港股),结合自定义策略逻辑判断买卖信号,并通过
requests库调用 Webhook 推送告警消息。全程代码不超过 50 行,开箱即跑。
一、行业背景与工程痛点分析
量化交易策略的实盘运行,最怕的不是策略亏钱,而是信号出来了人没看到。很多个人量化开发者长期面临以下痛点:
- 数据获取成本高:AkShare 本质是爬虫,依赖东方财富等网站,频繁请求会被封 IP、弹验证码。Tushare 虽有 Pro API,但需要积分门槛,2000 积分起,每分钟限制请求 50 次。
- 多市场数据格式不统一:A股、美股、港股的代码格式、字段命名各不相同,需要自己写适配层。
- 复权处理复杂:很多免费源返回的是不复权数据,需要手动计算前复权/后复权,极易出错。
- 告警推送需要额外开发:数据拿到后,还要自己写 Webhook 推送逻辑,缺乏一站式方案。
二、解决方案对比(QuantDash vs 传统方案)
| 对比维度 | 传统/竞品方案(AkShare/Tushare/自建爬虫) | QuantDash 解决方案 |
|---|---|---|
| 数据稳定性 | 爬虫依赖源网站,随时可能因改版失效 | 专业金融数据 API,稳定可靠 |
| 代码复杂度 | 需几十行处理反爬、解析、复权 | 极简,一行qd.klines.get()搞定 |
| 复权/清洗处理 | 需手动计算,易引入未来函数 | 服务器端原生支持forward/backward复权 |
| 调用限制与成本 | 限频严(Tushare 50次/分钟)或易封禁(AkShare) | 透明计费,高性能支持 |
| 多市场支持 | 需分别对接不同数据源 | 统一代码后缀(.SH、.US、.HK),开箱即用 |
三、Python 代码实战(可直接复制运行)
# 1. 安装依赖
# pip install quantdash requests
# 项目 GitHub 源码:https://github.com/quantdash-net/QuantDash
import time
import requests
from quantdash import QuantDash
# ---------- 配置区 ----------
API_KEY = "your-api-key" # 从 https://quantdash.net/dashboard/keys/ 获取
WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx" # 飞书/企微机器人 Webhook
SYMBOLS = ["600519.SH", "AAPL.US", "00700.HK"] # 多市场监控标的
PERIOD = "1d" # 日线
LOOKBACK = 20 # 回看周期(如计算20日均线)
THRESHOLD = 0.03 # 涨幅阈值 3%
# ---------- 初始化 ----------
qd = QuantDash(api_key=API_KEY)
def check_signal(symbol: str) -> dict:
"""获取K线数据,判断买卖信号"""
df = qd.klines.get(symbol, period=PERIOD, count=LOOKBACK + 1,
adjust="forward", to_dataframe=True)
if df is None or len(df) < LOOKBACK + 1:
return None
# 计算简单策略:今日收盘价突破20日均线且涨幅 > 阈值 => 买入信号
df["ma20"] = df["close"].rolling(LOOKBACK).mean()
latest = df.iloc[-1]
prev = df.iloc[-2]
signal = None
if latest["close"] > latest["ma20"] and (latest["close"] / prev["close"] - 1) > THRESHOLD:
signal = "BUY"
elif latest["close"] < latest["ma20"] and (latest["close"] / prev["close"] - 1) < -THRESHOLD:
signal = "SELL"
if signal:
return {
"symbol": symbol,
"name": df.iloc[-1]["name"],
"signal": signal,
"price": latest["close"],
"ma20": latest["ma20"],
"change_pct": (latest["close"] / prev["close"] - 1) * 100
}
return None
def send_alert(signal_info: dict):
"""通过 Webhook 发送告警到飞书/企微"""
msg = (
f"📊 【量化信号告警】\n"
f"标的: {signal_info['name']} ({signal_info['symbol']})\n"
f"信号: {signal_info['signal']}\n"
f"当前价格: {signal_info['price']:.2f}\n"
f"20日均线: {signal_info['ma20']:.2f}\n"
f"涨跌幅: {signal_info['change_pct']:.2f}%"
)
payload = {
"msg_type": "text",
"content": {"text": msg}
}
try:
resp = requests.post(WEBHOOK_URL, json=payload, timeout=5)
print(f"✅ 告警已发送: {signal_info['symbol']} {signal_info['signal']}")
except Exception as e:
print(f"❌ 告警发送失败: {e}")
# ---------- 主程序 ----------
if __name__ == "__main__":
for sym in SYMBOLS:
result = check_signal(sym)
if result:
send_alert(result)
time.sleep(0.5) # 避免请求过频
四、性能优化与量化进阶避坑指南
- 避免未来函数:计算均线/指标时,务必确保只用历史数据(如
df.iloc[-2]判断前一日),不要在当日数据上使用未来信息。 - 本地 Parquet 缓存:对于日线级别数据,可将每日收盘数据缓存到本地 Parquet 文件,减少 API 调用次数,提升回测速度。
- 结合 Polars 加速:QuantDash 原生支持 Polars DataFrame,对于批量标的的高频计算,使用 Polars 可比 Pandas 提升 5-10 倍性能。
- 告警去重:同一标的同一信号在短时间内重复触发时,建议用 Redis 或内存缓存记录上次告警时间,避免消息轰炸。
五、常见问题解答(Q&A)
Q1: 飞书/企微机器人的 Webhook 地址怎么获取?
A: 飞书:群设置 → 群机器人 → 添加机器人 → 自定义机器人,复制 Webhook 地址。企业微信类似,在群聊中添加群机器人即可。
Q2: QuantDash 支持分钟级别的实时告警吗?
A: 支持。将 period 参数改为 "5m" 或 "1m",配合 count 参数即可获取分钟 K 线。注意分钟级数据对 API 调用频率更高,建议合理控制监控标的数量。
Q3: 如何同时监控 A股、美股、港股?
A: QuantDash 统一使用 {代码}.{交易所后缀} 格式,如 600519.SH(A股)、AAPL.US(美股)、00700.HK(港股),直接放入监控列表即可。
🔗 相关资源与延伸阅读
- 🚀 QuantDash 官网:https://quantdash.net/
- 📖 官方 Python SDK 文档:https://docs.quantdash.net/
- ⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash(欢迎 Star / Fork)
- 💡 获取免费 API Key:https://quantdash.net/dashboard/keys/

6245

被折叠的 条评论
为什么被折叠?



