问题:

  回测环境,下委托单买入10600股002652.SZ,返回如下警告信息,请问这是怎么回事?

2025-06-24 10:00:00 - WARNING - 后端服务 当前策略成交比例设置为:0.25,委托数量10600超过当前周期可成交数量,撮合成交数量调整为4200

原因和解决方法:

  为了贴近真实的历史成交情况,Ptrade默认会在回测时将撮合的成交数量限制在当前回测时点的真实历史成交量的25%以内。

  以提问中的股票为例,其在2025-06-24 10:00:00对应的1分钟k线的成交量为17100,乘以25%后是4275,向下取整手后是4200股,与警告信息中调整后的撮合成交量一致。

  解决这个问题,有两个方法:

一、取消回测限制

Ptrade的set_volume_ratio函数对应前述的25%比例限制,读者可以自行修改这个比例限制。代码如下:

1
2
def initialize(context): 
set_volume_ratio(volume_ratio=0.25) # 将比例以小数的形式填入,不能超过1。

Ptrade的set_limit_mode函数可开启或关闭回测成交数量限制,读者可自行修改。代码如下:

1
2
def initialize(context): 
set_limit_mode('UNLIMITED') # 回测中不限制成交数量

二、继续在回测中滚动成交

  这里所称的滚动成交,指的是让策略的回测框架时间继续向后滚动,从而产生新的可成交数量。

  在回测中,不论一段代码实际会耗时多久,均不会影响回测框架的时间(例如运行一段代码会耗时5分钟,假设在10:00开始运行这段代码,则运行完毕后,回测框架的时间仍然是10:00)。所以,我们的思路应该时如何推动回测框架内的时间变动,而不是推动真实的时间变动,time.sleep()等方法在这个场景中是无效的。

  阿猪这里例举一个思路步骤供参考:

  (1)将回测的周期设为“分钟”;
  (2)以全局变量的形式创建一个dict或者dataframe,用于存储待成交的股票,字段包含股票代码、拟成交总数量、累计已成交数量;
  (3)在handle_data中每分钟读取一次前述全局变量,如果累计已成交数量尚未达到拟成交总数量,则继续下单。
  (4)将本次下单后返回的已成交数量累加到全局变量中,然后撤单。
  (5)等待下一个handle_data重复步骤(3)、(4),直到完成任务。