3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化回测中,如何处理股票的分红、送股、配股及红利税是决定回测真实性的关键因素。聚宽(JoinQuant)提供了两种回测模式:传统前复权回测模式和真实价格(动态复权)回测模式。本文将深度解析开启 set_option('use_real_price', True) 后的账户处理机制及红利税扣除细节。
在 initialize 初始化函数中,可以通过以下代码开启真实价格模式:
def initialize(context):
# 开启真实价格模式(强烈推荐)
set_option('use_real_price', True)
use_real_price=False):use_real_price=True):history 或 attribute_history 获取历史价格,系统会实时使用当时的复权因子对历史价格进行前复权。这有效避免了未来函数,保证了交易撮合与持仓股数的真实性。当持仓中的股票发生拆分、合并或分红时,真实价格模式会按照历史实际情况对账户进行动态调整:
context.portfolio.total_value)不因取整而减少,多余的碎股价值会略微补偿到可用资金(context.portfolio.available_cash)中。history 等 API 拿到的历史价格可能不同,因为它们是基于“当前逻辑日期”前复权的价格。因此,切勿跨日期缓存 API 返回的价格结果。在实际 A 股交易中,红利税是根据持股时间实行差别化税率的(持股超1年免税,1个月以内扣20%,1个月至1年扣10%),且在卖出时由券商扣收。
由于回测和模拟交易系统在分红当天需要将分红现金发放到账户,而系统无法预知用户未来何时会卖出该股票(即无法准确计算持仓时间),因此聚宽采取了以下统一的处理方式:
以下是一个开启了 use_real_price 的标准均线策略模板:
import jqdata
def initialize(context):
# 1. 开启真实价格模式,规避未来函数,启用真实分红送股处理
set_option('use_real_price', True)
# 2. 设置基准
set_benchmark('000300.XSHG')
# 3. 设定操作股票
g.security = '000001.XSHE'
# 4. 每日运行
run_daily(market_open, time='every_bar')
def market_open(context):
security = g.security
# 获取基于当天逻辑日前复权的 5 日收盘价
close_data = attribute_history(security, 5, '1d', ['close'])
MA5 = close_data['close'].mean()
current_price = close_data['close'][-1]
cash = context.portfolio.available_cash
# 均线突破买入
if current_price > 1.01 * MA5:
order_value(security, cash)
log.info("Buying %s" % (security))
# 跌破均线卖出
elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
order_target(security, 0)
log.info("Selling %s" % (security))