🚀 AI 一键生成 joinquant 策略代码
立即体验

JoinQuant 策略中如何使用 on_event 函数处理持仓标的分红送股事件?

joinquant | 发布时间: 2026/7/30
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 事件回调机制:使用 on_event 处理 DividendsEvent 分红事件

Question: joinquant 策略中如何编写 on_event 函数来监听和处理持仓标的分红送股事件?

解决方案

JoinQuant 事件回调机制:处理 DividendsEvent 分红送股事件

在 JoinQuant(聚宽)量化交易平台中,on_event 是一个可选的事件回调函数。当策略账户中持仓的标的发生特定事件(如分红送股、强行平仓)时,系统会自动触发并调用 on_event 函数。


1. on_event 接口说明

函数定义

def on_event(context, event):
    pass

参数说明

  • context: Context 对象,存放有当前的账户、资金、标的持仓等信息。
  • event: 触发的事件对象。建议使用 Python 的 isinstance 函数对事件类型进行判断。

2. DividendsEvent(分红送股事件)属性详解

当发生分红送股时,传入的 event 即为 DividendsEvent 实例,包含以下主要属性:

  • name: 事件名称,固定为 'Dividends'
  • pindex: 子账户/仓位索引(例如 0)。
  • security: 发生分红送股的标的代码(如 '000001.XSHE')。
  • side: 仓位方向,多头为 'long',空头为 'short'
  • dividends: 分红配送信息的字典列表(通常包含一个元素),可用的 key 包括:
    • date: 发生分红送股的日期。
    • scale_factor: 配送股比例(针对股票、场内基金)。
    • bonus_pre_tax: 税前分红金额(针对股票、场内基金)。
    • bonus_post_tax: 税后分红金额(针对场内基金)。

3. 代码示例

以下是一个简单的示例,展示如何在 JoinQuant 策略中使用 on_event 捕获分红事件,并输出详细的分红日志:

import jqdata
from jqdata import DividendsEvent

def initialize(context):
    # 设置基准与真实价格模式
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    
    # 设置要交易的股票
    g.security = '000001.XSHE'
    
    # 每天开盘交易
    run_daily(market_open, time='9:30')

def market_open(context):
    # 如果未持仓,买入1000股
    if g.security not in context.portfolio.positions:
        order(g.security, 1000)

def on_event(context, event):
    """
    事件回调函数,当持仓标的发生分红送股等事件时自动被触发
    """
    # 判断是否为分红送股事件
    if isinstance(event, DividendsEvent):
        security = event.security
        pindex = event.pindex
        side = event.side
        
        log.info("====== 触发分红送股事件 ======")
        log.info("标的代码: %s, 仓位: %s, 方向: %s" % (security, pindex, side))
        
        # 遍历分红配送详情
        for div in event.dividends:
            div_date = div.get('date')
            scale_factor = div.get('scale_factor', 0)     # 送股比例
            bonus_pre_tax = div.get('bonus_pre_tax', 0)   # 税前分红
            
            log.info("分红派息日: %s" % div_date)
            log.info("配送股比例: %s, 税前每股派息: %s 元" % (scale_factor, bonus_pre_tax))

4. 注意事项与最佳实践

  1. 推荐使能动态复权模式:建议在 initialize 中设置 set_option('use_real_price', True),开启动态复权(真实价格)模式。此时系统会在分红配送发生时,自动调整持仓股票数量与账户现金,日志提示更清晰。
  2. 使用 isinstance 过滤事件:除 DividendsEvent 外,系统还可能触发 ForcedLiquidationEvent(强行平仓事件),因此在 on_event 内应务必先对 event 类型进行判断。
  3. 仅限持仓标的on_event 只会在账户当前持有的标的发生对应事件时才会被回调触发。