vnpy 4.4.0:微信通知、统一推送与 Alpha 自定义表达式

2026-05-15 16 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:9 分钟

量化交易系统跑起来之后,最让人焦虑的不是策略亏钱,而是策略在跑但你不知道——订单挂住了、风控触发了、行情断流了,全靠事后翻日志才发现。vnpy 4.4.0 的更新直指这个问题:微信通知上线、MainEngine 统一推送接口落地、Alpha 模块的表达式引擎可注册自定义函数。三条改动合在一起,把"策略运行状态能不能及时知道"这件事从靠运气变成了靠代码。

微信通知:从邮件到手机,一步到位

之前 vnpy 的通知渠道只有邮件。邮件没问题,但量化交易员不会一直盯着邮箱——微信才是真正会看的入口。4.4.0 新增的微信通知模块基于企业微信 iLink 协议实现,流程是这样的:

  1. 在企业微信后台创建应用,拿到 corpid、corpsecret、agentid。
  2. 启动 vnpy 时扫码绑定你的个人微信到该企业应用。
  3. 之后所有通过 send_notification 发出的消息,会同时推到邮箱和微信。

iLink 协议本身处理了扫码绑定、会话过期检测和推送间隔控制。你不需要自己写 token 刷新逻辑,模块内部会在会话快过期时提示你重新扫码。推送间隔也可以配置——比如设成 30 秒,避免高频策略一分钟发 20 条消息把你自己淹死。

send_notification:一个函数,两条渠道

MainEngine 新增的 send_notification 是这次更新的核心接口。它的设计思路很简单:业务代码只管"我要通知",渠道选择交给 MainEngine 统一调度。

调用方式:

from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine

event_engine = EventEngine()
main_engine = MainEngine(event_engine)
main_engine.add_gateway("CTP")       # 按需添加网关
main_engine.add_app("WeChatManager") # 加载微信通知模块

# 发送通知——邮件和微信同时推送
main_engine.send_notification("CTA策略:螺纹钢持仓触及止损线,已自动平仓")

send_notification 内部会遍历已加载的通知引擎(EmailManager、WeChatManager),把同一条消息分发到所有可用渠道。如果你只配了邮件没配微信,它就只走邮件;两个都配了就双路推送。不需要在策略代码里写 if wechat: ... elif email: ...,策略层完全解耦。

实际使用中,建议把通知内容结构化,而不是丢一整段文字:

# 风控通知模板示例
def format_risk_notice(strategy_name, symbol, reason, action):
    return (
        f"[风控告警] {strategy_name}\n"
        f"标的: {symbol}\n"
        f"原因: {reason}\n"
        f"动作: {action}\n"
        f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
    )

# 在策略的 on_trade 或 risk_check 里调用
main_engine.send_notification(
    format_risk_notice("DualThrust", "rb2401", "最大回撤超5%", "全部平仓")
)

微信消息有长度限制,结构化模板既方便快速扫读,也避免超长内容被截断。

Alpha 表达式引擎:注册你自己的因子函数

vnpy.alpha 模块做因子挖掘时,表达式引擎(类似 WorldQuant Alpha101 的表达式语法)是核心工具。4.4.0 之前,你只能用内置的 rank()zscore()ts_mean() 等函数。如果你的因子逻辑需要自定义计算——比如一个特殊的波动率加权方式——就得绕过表达式引擎,手写整段处理代码。

4.4.0 新增的 register 机制让你把自定义函数直接注入表达式引擎,之后在表达式字符串里就能像内置函数一样调用它。

from vnpy.alpha.engine import AlphaEngine

alpha_engine = AlphaEngine()

# 自定义函数:波动率调整动量
def vol_adjusted_momentum(close, volume, window=10):
    """动量 / 近N日波动率,高动量低波动时值更大"""
    returns = close / close.shift(1) - 1
    momentum = returns.rolling(window).sum()
    vol = returns.rolling(window).std()
    return momentum / vol

# 注册到表达式引擎
alpha_engine.register("vam", vol_adjusted_momentum, params=["window"])

# 现在可以在表达式里直接用了
expression = "rank(vam(close, volume, window=20))"
factor_df = alpha_engine.calculate(expression, data_df)

注册时需要声明参数名列表,引擎在解析表达式字符串时会按参数名匹配传入的字段。这样因子定义和因子计算仍然统一在表达式体系内,回测、筛选、组合流程不需要额外适配。

配置微信通知的实操步骤

把微信通知跑起来需要几步配置,这里给一个完整流程:

# vnpy_wechat_config.py —— 微信通知配置示例

WECHAT_CONFIG = {
    "corpid": "ww1234567890abcdef",       # 企业微信 corpid
    "corpsecret": "your_app_secret_here", # 应用 secret
    "agentid": 1000002,                   # 应用 agentid
    "push_interval": 30,                  # 推送间隔(秒),避免消息轰炸
    "session_expire_warning": True,       # 会话过期前是否提醒重新扫码
}

启动流程:

# 1. 确保 vnpy 4.4.0 已安装
pip install vnpy==4.4.0

# 2. 安装微信通知依赖(如需)
pip install vnpy-wechatmanager

# 3. 启动 vnpy 主界面或脚本,加载 WeChatManager 应用
# 首次运行会弹出扫码绑定页面,用个人微信扫企业应用二维码完成绑定

扫码绑定成功后,后续启动会自动复用会话,直到会话过期触发重新扫码提示。push_interval 建议根据策略频率设置:日内高频策略设 60 秒以上,日线级别策略设 10 秒即可。

上线建议与注意事项

  • 先跑邮件,再加微信:如果之前已经在用 EmailManager,升级后直接加载 WeChatManager 即可,send_notification 会自动双路推送,不需要改策略代码。
  • 控制推送频率:微信消息比邮件更"打扰",务必配置 push_interval。一个每秒都触发的风控条件如果不加间隔,一分钟内你能收到 60 条微信。
  • 会话过期要处理:企业微信的 iLink 会话有有效期,过期后通知会静默失败。4.4.0 会提示你重新扫码,但如果你是无人值守部署,建议加一个定时任务检测会话状态,过期后自动发邮件提醒管理员。
  • Alpha 自定义函数要写文档字符串register 之后函数名会出现在表达式可用函数列表里,写清楚 docstring 方便后续因子梳理。
  • 升级兼容性send_notification 是新增接口,不影响已有的 send_email 调用。但如果你之前自己写了微信推送的 hack 代码,升级后建议统一迁移到官方模块,避免重复推送。

vnpy 4.4.0 的三条改动看起来各自独立,实际串起来是一个完整链路:Alpha 模块挖掘因子 → 策略引擎执行交易 → 风控/事件触发通知 → send_notification 统一分发 → 微信直达手机。从因子定义到消息触达,每一步都可以用代码精确控制,不再有"黑箱运行"的盲区。


相关推荐