问题描述
Ptrade回测环境,下委托单买入10600股002652.SZ,返回如下警告信息,请问这是怎么回事?
2025-06-24 10:00:00 - WARNING - 后端服务 当前策略成交比例设置为:0.25,委托数量10600超过当前周期可成交数量,撮合成交数量调整为4200
解决方案
问题原因分析
在Ptrade回测环境中,出现这个警告是因为触发了回测引擎的流动性限制机制。
为了让回测结果更逼近真实的交易场景,Ptrade默认设置了成交比例限制(Volume Ratio)。默认情况下,这个比例是 0.25。这意味着:
在任何一个交易周期(如1分钟或1天)内,您的策略最大能成交的数量,不能超过该股票在真实历史中该周期总成交量的25%。
在您的例子中:
- 您尝试买入
10600股。 - 系统计算出该股票在当前周期的真实历史成交量的25%只有
4200股(说明当时真实市场的总成交量大约是16800股)。 - 因为
10600 > 4200,系统为了模拟真实的流动性冲击,将您的撮合成交数量强制截断为4200股,并抛出了这个警告。差额部分(10600 - 4200 = 6400股)将不会继续挂单,直接作废。
解决方法
如果您希望在回测中顺利成交全部委托数量,可以通过在 initialize 函数中调用相关API来修改回测引擎的撮合规则。有以下两种主要方法:
方法一:调大成交比例限制 (set_volume_ratio)
您可以使用 set_volume_ratio 函数将成交比例调大,例如设置为 1.0(即允许吃掉市场100%的成交量)。
def initialize(context):
g.security = '002652.SZ'
set_universe(g.security)
# 将最大成交数量设置为本周期可成交总量的100%
set_volume_ratio(volume_ratio=1.0)
def handle_data(context, data):
# 此时下单受到的流动性限制会大幅放宽
order(g.security, 10600)
方法二:完全关闭成交数量限制 (set_limit_mode)
对于月度调仓等低频策略,或者对流动性冲击不是很敏感的策略,您可以直接关闭成交数量限制。使用 set_limit_mode('UNLIMITED') 后,回测撮合时将不再受真实市场成交量的限制(实际撮合成交量甚至可以大于该时间段的实际成交总量)。
def initialize(context):
g.security = '002652.SZ'
set_universe(g.security)
# 回测中完全不限制成交数量
set_limit_mode('UNLIMITED')
def handle_data(context, data):
# 无论下多大的单,只要资金/持仓足够且价格合适,都会全部成交
order(g.security, 10600)
总结建议
- 高频/短线策略:建议保留默认的
0.25限制,或者根据策略资金体量合理设置set_volume_ratio。如果经常触发此警告,说明策略的资金容量已经达到了该股票的流动性瓶颈,在实盘中强行下单会导致严重的滑点。 - 低频/长线策略:为了回测方便,可以直接使用
set_limit_mode('UNLIMITED')关闭限制。