ricequant / rqalpha

A extendable, replaceable Python algorithmic backtest && trading framework supporting multiple securities
http://rqalpha.io
Other
5.38k stars 1.61k forks source link

next_bar回测逻辑错误 #268

Closed xclxxl414 closed 6 years ago

xclxxl414 commented 6 years ago

1. RQAlpha的版本

3.0.9

2. Python的版本

3.5.2

3. 是Windows/Linux/MacOS or others?

windows,linux

以next_bar撮合时,已有仓位卖单无法执行成功,导致买单因为资金不足无法提交。

Cuizi7 commented 6 years ago

麻烦详细说明 “无法执行成功” 具体是什么表现,是订单被拒还是一直挂单无法成交?

P.S. 如果指的是在发出卖单的同一个bar无法提交买单的话,这种情况是正常的,因为在 next_bar 下挂单直到下一个bar才会被撮合,产生交易后资金才会发生变动。

xclxxl414 commented 6 years ago

@Cuizi7 举例: 满仓持有A(100%),T日以next_bar模式下卖单A(-50%)和买单C(+50%)。 卖单挂单会成功,买单在T日挂单校验阶段(order相关接口内部)即会失败,失败原因是没有可用资金,根本就没有机会进入next_bar撮合。

Cuizi7 commented 6 years ago

就是我说的上述原因,可以选择其他撮合模式或使用signal模式,或者使用分钟回测。

xclxxl414 commented 6 years ago

@Cuizi7 我想使用日K开盘价撮合,该怎么配置? 原先以为next_bar就是被设计来满足这个需求的,但实际逻辑无法跑通。

Cuizi7 commented 6 years ago

next_bar 是"下一个Bar开盘价撮合" 可以使用signal模式,不进行撮合,直接按发单价成交。

xclxxl414 commented 6 years ago

signal模式如果发市价单则框架按照last_price成交(按照SimulationEventSource的逻辑handle_bar在15:00调用,last_price即收盘价),无法起到按开盘价成交的目的;如果发限价单,若传入当前bar的开盘价,而handle_bar中若利用入参bar_dict参与了逻辑计算的话则实际上引入了未来数据,对此框架未提供相应保护,需要策略编写人员十分注意才能避免;若传入下一交易日开盘价也有前视偏差的可能性。

Cuizi7 commented 6 years ago

日回测本身就是对策略在较长时间周期内表现的一种模拟,若日内市场变动对策略表现有明显影响的话建议采用更细粒度的回测。

quant2008 commented 1 year ago

我觉得这个回复不能令人满意。按次日开盘价成交很有价值,因为我们在集合竞价阶段发单,确实能够保证按准确的开盘价成交。但我们无法保证按准确的收盘价成交。所以还是希望支持next bar open这种撮合模式

Cuizi7 commented 1 year ago

@quant2008 原来是个五年前的老 issue,现在可以在 open_auction 中发单模拟集合竞价的场景。