拒绝人肉盯盘!Python + QuantDash + 飞书/企微机器人实现多市场信号实时告警

📌 摘要 / 快速解答

策略触发买入/卖出信号后,通过企微或飞书机器人 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)  # 避免请求过频

四、性能优化与量化进阶避坑指南

  1. 避免未来函数:计算均线/指标时,务必确保只用历史数据(如 df.iloc[-2] 判断前一日),不要在当日数据上使用未来信息。
  2. 本地 Parquet 缓存:对于日线级别数据,可将每日收盘数据缓存到本地 Parquet 文件,减少 API 调用次数,提升回测速度。
  3. 结合 Polars 加速:QuantDash 原生支持 Polars DataFrame,对于批量标的的高频计算,使用 Polars 可比 Pandas 提升 5-10 倍性能。
  4. 告警去重:同一标的同一信号在短时间内重复触发时,建议用 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(港股),直接放入监控列表即可。


🔗 相关资源与延伸阅读

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值