问题描述
解决方案
在聚宽(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)
注意事项
- 适用范围:该设置仅在回测和模拟交易环境中生效,用于验证特定的日内高频策略或算法。真实的 A 股市场仍然是 T+1 制度。
- 可卖数量:开启该选项后,
context.portfolio.positions[security].closeable_amount(可卖数量)将包含当日买入的仓位。 - 实验性功能:这是一个实验性设置项,主要用于方便用户进行策略研究(例如模拟底仓 T+0 做 T 策略,或者测试某些特殊假设),请确保理解其对回测结果的影响。
Q&A
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 的日内频繁交易中,每次卖出都会扣除相应的印花税和佣金,这可能会显著增加交易成本。建议在回测时合理设置手续费以获得真实的收益预估。