3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(JoinQuant)的回测环境中,A 股默认遵循 T+1 的交易制度(即当日买入的股票次日才能卖出)。如果需要模拟 T+0 交易(即当日买入后可以立即卖出),可以使用 set_option 函数开启实验性的 T+0 模式。
在策略的 initialize(context) 函数中调用以下代码即可开启:
set_option("t0_mode", True)
以下是一个完整的策略示例,展示了如何开启 T+0 模式,并在同一天内完成买入和卖出操作。
# -*- coding: utf-8 -*-
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 【关键步骤】开启 T+0 模式
# 开启后,A股买入后可以立刻卖出,不再受 T+1 限制
set_option("t0_mode", True)
# 设定要操作的股票,例如平安银行
g.security = '000001.XSHE'
# 每天开盘时运行
run_daily(market_open, time='09:30')
def market_open(context):
security = g.security
# 获取当前可用资金
cash = context.portfolio.available_cash
# 示例:买入股票
if cash > 0:
# 买入 1000 股
order(security, 1000)
log.info("T+0测试:已买入 %s 1000股" % security)
# 示例:立即卖出(在 T+0 模式下,这里可以卖出刚刚买入的股票)
# 如果没有开启 t0_mode,且昨日无持仓,此处卖出会失败或无效
if context.portfolio.positions[security].total_amount >= 1000:
order(security, -1000)
log.info("T+0测试:已卖出 %s 1000股" % security)
context.portfolio.positions[security].closeable_amount(可卖数量)将包含当日买入的仓位。Q: 开启 t0_mode 后,对可转债或期货有影响吗?
A: 可转债和期货本身在交易所规则中通常就是 T+0 的。set_option("t0_mode", True) 主要是针对 A 股股票这种原本是 T+1 的标的强制开启 T+0 权限。对于本身就是 T+0 的品种,该设置不会产生冲突。
Q: 为什么我在实盘中不能用这个代码实现 T+0?
A: set_option("t0_mode", True) 只是改变了回测引擎的内部校验规则。实盘交易必须遵循交易所的法律法规和交易规则,A 股市场目前实行 T+1 制度,无法通过代码强行改变交易所的结算规则。实盘中的 "T+0" 通常是指利用底仓(昨日持仓)进行日内高抛低吸,保持总持仓不变。
Q: 开启 T+0 后,手续费怎么计算?
A: 手续费计算逻辑遵循您通过 set_order_cost 设置的规则。如果您设置了印花税(通常只在卖出时收取),那么在 T+0 的日内频繁交易中,每次卖出都会扣除相应的印花税和佣金,这可能会显著增加交易成本。建议在回测时合理设置手续费以获得真实的收益预估。