3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
聚宽(JoinQuant)的标准回测引擎在设计上为了兼顾计算效率和通用性,确实采用了一些理想化的假设(如“价格优先”和“按成交量比例撮合”)。在面对低流动性个股、涨跌停板抢单或高频交易时,这些假设会导致回测结果与实盘产生巨大偏差,这就是所谓的“回测陷阱”。
order_volume_ratio 判定部分成交。但在实盘中,涨跌停板往往伴随着巨量的封单,排在后面的单子根本无法成交。针对上述问题,可以通过合理配置聚宽的 API 和优化策略逻辑来尽量缩小回测与实盘的差距:
order_volume_ratio)默认情况下,聚宽的成交量比例是 1.0(即不超过市场总成交量)。对于低流动性策略,建议将其调低,以模拟冲击成本和流动性限制。
def initialize(context):
# 设定成交量比例,例如订单成交量不超过该分钟/日总成交量的 10%
set_option('order_volume_ratio', 0.10)
set_slippage)不要使用默认滑点,应根据交易标的的特性设置更符合实际的滑点。对于低流动性个股,可以设置较大的百分比滑点。
def initialize(context):
# 为股票设定 0.5% 的双边滑点(买入加 0.25%,卖出减 0.25%)
set_option('use_real_price', True)
set_slippage(PriceRelatedSlippage(0.005), type='stock')
不要依赖回测引擎的撮合来处理涨跌停,应该在代码中主动判断。如果标的接近或处于涨跌停状态,直接放弃下单。
def handle_data(context, data):
security = '000001.XSHE'
current_data = get_current_data()
# 获取最新价、涨停价和跌停价
last_price = current_data[security].last_price
high_limit = current_data[security].high_limit
low_limit = current_data[security].low_limit
# 如果当前价格等于涨停价,不买入
if last_price >= high_limit:
log.info(f"{security} 已涨停,放弃买入")
return
# 如果当前价格等于跌停价,不卖出
if last_price <= low_limit:
log.info(f"{security} 已跌停,放弃卖出")
return
# 正常下单逻辑...
use_real_price)前复权价格在历史回测中可能会导致股价极低(甚至为负),从而导致计算出的买入股数与实盘严重不符。务必开启真实价格模式。
def initialize(context):
# 强烈建议开启,使用真实价格撮合成交
set_option('use_real_price', True)
match_with_order_book)如果你已经进入模拟交易阶段,可以开启盘口撮合模式。该模式会根据真实的买一卖一等盘口数据进行撮合,比单纯的 Bar 撮合真实得多。
def initialize(context):
# 仅在模拟交易中生效,开启盘口撮合
set_option('match_with_order_book', True)
avoid_future_data)回测陷阱有时也来源于无意中使用了未来数据(例如在开盘时使用了当天的收盘价)。
def initialize(context):
# 开启避免未来数据模式,若调用未来数据会报错或过滤
set_option("avoid_future_data", True)
没有任何回测引擎能 100% 还原实盘。在聚宽平台上,通过调低 order_volume_ratio、加大滑点、代码层面规避涨跌停以及开启真实价格模式,可以有效挤出回测收益中的“水分”。对于极度依赖微观结构的高频抢单策略,建议在 Tick 级别回测验证后,尽快投入小资金实盘进行检验。