3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)的回测环境中,对于股票的分红(派息)和送股(转增),处理方式取决于您是否开启了动态复权(真实价格)模式。
以下是两种模式下的具体处理逻辑及税务说明:
这是最接近真实交易环境的模式,能够避免“未来函数”并准确模拟资金变动。
initialize 函数中调用 set_option('use_real_price', True)。available_cash(可用资金)中。total_amount)。如果调整后的数量是小数,则向下取整到整数。如果不设置 use_real_price,系统默认使用此模式。
在回测和模拟交易中,红利税的扣除规则如下:
为了保证回测的准确性,建议在策略中始终开启真实价格模式:
# -*- coding: utf-8 -*-
def initialize(context):
# 开启真实价格(动态复权)模式,这是处理分红送股最准确的方式
set_option('use_real_price', True)
# 设置基准
set_benchmark('000300.XSHG')
# 选取一只股票作为示例
g.security = '000001.XSHE'
def handle_data(context, data):
# 简单的买入逻辑
if g.security not in context.portfolio.positions:
order(g.security, 1000)
# 打印当前的持仓数量和现金,观察分红送股日的变化
pos = context.portfolio.positions[g.security]
log.info("当前持仓: %s, 数量: %d, 可用资金: %.2f" % (g.security, pos.total_amount, context.portfolio.available_cash))
Q: 为什么开启真实价格模式后,我获取的历史价格(history API)和交易软件看到的不一样?
A: 开启 use_real_price 后,history、attribute_history 等API获取的仍然是基于当前回测日期的前复权价格,这是为了方便计算技术指标(如均线)。但是,order 下单撮合时使用的是真实价格。如果你需要获取历史上的真实价格(不复权),需要在调用数据API时指定 fq=None。
Q: 分红的钱是什么时候到账的?
A: 在聚宽的回测中,分红现金通常在除权除息日(Ex-date)的开盘前或收盘结算时处理并计入可用资金(视具体回测引擎版本微调,通常T日可用)。
Q: 模拟交易中分红税也是扣20%吗?
A: 是的。由于模拟交易系统无法预知用户何时卖出股票,无法确定持股期限,因此为了保守计算,统一按照20%扣除红利税。实际实盘交易中券商会根据你的持股时长自动计算补扣。