问题描述
聚宽的标准回测引擎(无论是分钟级还是 Tick 级)在成交撮合上主要基于“价格优先”和“成交量比例”的理想化假设。但在实际交易中,尤其是针对低流动性个股、极速涨跌停板抢入、或者高频抢单场景,这种模型与**存在巨大的“回测陷阱”。这个有什么办法解决吗?
解决方案
聚宽(JoinQuant)的标准回测引擎在设计上为了兼顾计算效率和通用性,确实采用了一些理想化的假设(如“价格优先”和“按成交量比例撮合”)。在面对低流动性个股、涨跌停板抢单或高频交易时,这些假设会导致回测结果与实盘产生巨大偏差,这就是所谓的“回测陷阱”。
常见的“回测陷阱”解析
- 涨跌停板的“虚假成交”:在回测中,只要价格触及涨跌停价,引擎可能会根据设定的
order_volume_ratio判定部分成交。但在实盘中,涨跌停板往往伴随着巨量的封单,排在后面的单子根本无法成交。 - 低流动性个股的冲击成本缺失:回测引擎通常按设定的滑点成交,忽略了你的大额订单对盘口的实际冲击。在实盘中,买入低流动性股票可能会直接扫空几档盘口,导致实际成交均价远劣于预期。
- 高频抢单的排队劣势:回测无法模拟交易所的订单队列。实盘中,即使价格合适,如果你的单子排在后面,也可能无法成交。
聚宽平台上的解决方案
针对上述问题,可以通过合理配置聚宽的 API 和优化策略逻辑来尽量缩小回测与实盘的差距:
1. 严格限制成交量比例 (order_volume_ratio)
默认情况下,聚宽的成交量比例是 1.0(即不超过市场总成交量)。对于低流动性策略,建议将其调低,以模拟冲击成本和流动性限制。
def initialize(context):
# 设定成交量比例,例如订单成交量不超过该分钟/日总成交量的 10%
set_option('order_volume_ratio', 0.10)
2. 设置更严苛的滑点 (set_slippage)
不要使用默认滑点,应根据交易标的的特性设置更符合实际的滑点。对于低流动性个股,可以设置较大的百分比滑点。
def initialize(context):
# 为股票设定 0.5% 的双边滑点(买入加 0.25%,卖出减 0.25%)
set_option('use_real_price', True)
set_slippage(PriceRelatedSlippage(0.005), type='stock')
3. 策略逻辑中主动过滤涨跌停板
不要依赖回测引擎的撮合来处理涨跌停,应该在代码中主动判断。如果标的接近或处于涨跌停状态,直接放弃下单。
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
# 正常下单逻辑...
4. 开启真实价格模式 (use_real_price)
前复权价格在历史回测中可能会导致股价极低(甚至为负),从而导致计算出的买入股数与实盘严重不符。务必开启真实价格模式。
def initialize(context):
# 强烈建议开启,使用真实价格撮合成交
set_option('use_real_price', True)
5. 模拟盘开启盘口撮合 (match_with_order_book)
如果你已经进入模拟交易阶段,可以开启盘口撮合模式。该模式会根据真实的买一卖一等盘口数据进行撮合,比单纯的 Bar 撮合真实得多。
def initialize(context):
# 仅在模拟交易中生效,开启盘口撮合
set_option('match_with_order_book', True)
6. 避免未来数据 (avoid_future_data)
回测陷阱有时也来源于无意中使用了未来数据(例如在开盘时使用了当天的收盘价)。
def initialize(context):
# 开启避免未来数据模式,若调用未来数据会报错或过滤
set_option("avoid_future_data", True)
总结
没有任何回测引擎能 100% 还原实盘。在聚宽平台上,通过调低 order_volume_ratio、加大滑点、代码层面规避涨跌停以及开启真实价格模式,可以有效挤出回测收益中的“水分”。对于极度依赖微观结构的高频抢单策略,建议在 Tick 级别回测验证后,尽快投入小资金实盘进行检验。