ricequant / rqalpha

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

为什么会有next_bar, 却没有current_bar_open? #277

Closed tiandian closed 6 years ago

tiandian commented 6 years ago

在现实中的量化交易逻辑通常如下:

  1. 利用历史数据来选股, 如果是以日为单位的话, 就是以昨天以前的数据来进行选股.

  2. 在当前的bar中以当前的价格来成交, 在当前bar中可以知道的价格有开盘价和收盘价, 例如,如果是以日("1d")以上周期为单位的话, 开盘价成交表示是在早晨开盘时运行策略并以当时的市场价格成交,如果是以收盘价成交表示是在下午收盘前运行策略成交。

在运行策略的时候, 是不可能知道下一个bar的价格的, 甚至连下一个bar都不一定存在.

但是rqalpha却存在matching_type为"next_bar"的情况, 当然在回测中大部分情况下都可以获取未来的数据, 但是如果是运行昨天的回测呢, 它是没有next bar数据的。 如果把rqalpha接到实际的交易中, next_bar的运行逻辑是怎样的?

而且rqalpha当matching_type为"current_bar"时以收盘价成交而不是以开盘价成交也与其它回测框架不太一致。

Cuizi7 commented 6 years ago

首先要理解 撮合 的概念。 使用 rqalpha 运行回测的时候,rqalpha 使用了内置的撮合引擎对策略发的单进行撮合,代替了真是交易中交易所的工作,所以实盘中不存在 matching_type 这个可配置项。 为了模拟真是市场中发生的事、测试策略在不同市场反应中的表现同时保持框架逻辑的简洁,rqa设计了不同的撮合类型(matching_type)。其中 next_bar 是指在下一个bar开盘时对当前市场上(当前策略发出的)所有挂单进行撮合。这种撮合类型一定程度上模拟了真是市场上订单的成交偏离下单时间及价格的情况。这种撮合类型不一定适用于所有策略所有粒度的回测。

tiandian commented 6 years ago

其中 next_bar 是指在下一个bar开盘时对当前市场上(当前策略发出的)所有挂单进行撮合.


@Cuizi7 你的解释无法令人满意。

为什么要在下一个bar开盘时对当前市场上(当前策略发出的)所有挂单进行撮合? 而不是当前bar开盘时对当前市场上所有挂单进行撮合?

在现实中大家都是希望尽快买卖的, 因为当前价格/当前的股票基本面是已知的, 所以在当前成交是可控制的。

next_bar成交的问题在于忽略了当前决策到明早之间的任何信息, 假如今晚某支股票出现负面消息, 例如业绩下滑或要退市之类, 别人都是明早卖股票, 而rqalpha可能会明早买该股票, 这是不对的.

我试过几个其它的量化平台,它们基本上都没有使用next_bar的情况, 但都有开盘成交的情况, 希望rqalpha将next_bar成交模式改为开盘成交模式。

Cuizi7 commented 6 years ago

不同的回测粒度以及撮合类型适用于不同的撮合类型,你的上述策略可以使用更细粒度的回测或者其他撮合类型或者使用信号模式。 next_bar 是对市场的某一种抽象,不可能适用于所有回测。

tiandian commented 6 years ago

您的解释是无法令人满意.

我在上面列举了使用next_bar的缺点(忽略了今天下单到明早之间的任何信息, 而且可能会在回测最后一天会遗留未成交的交易), 我认为它相对于使用当前bar开盘价来说只有缺点,没有优点。

能否请您解释一下使用next_bar相对于使用当前bar的优点在哪里? 导致ricequant决定和其它框架保持差异化, 使用next_bar的优势在哪里?

XavierOwen commented 6 years ago

emmm分钟回测应该就可以避免这个问题?分钟回测的撮合机制是不是当前分钟级时间结束后撮合呢?

handsomu commented 6 years ago

@tiandian 设置 next bar 撮合方式出发点就是当前 bar 的高开低收策略全都知道,可以做出很多不符合实际的操作。为了避免这一点,引入了 next bar 的撮合方式。跟您说的不矛盾,您说的是 使用截止到昨天收盘的数据 采用当前 bar 开盘价进行撮合;而我们这里是 使用截止到今天收盘的数据 采用下一 bar 开盘进行撮合。整体后移了一个交易日而已。您在设置的时候选择回测截至日期前移一天即可。 @XavierOwen 分钟回测撮合机制 也分 current bar next bar,是一样的,前者是当前分钟线收盘价,后者是下一分钟线开盘价。 另外, rqalpha 也提供了按照指定价格成交的方式, 可以在文档里面查到,这样可以使用您认为合适的价格直接作为成交价。 在 mod sys_simulation 里面,设置 signal=True 即可

tiandian commented 6 years ago

"设置 next bar 撮合方式出发点就是当前 bar 的高开低收策略全都知道,可以做出很多不符合实际的操作"

@handsomu , 您的说法太模糊, 无法令人知道其具体适用场合, 请举个具体的例子来说明采用next bar更合理, 特别是接到实盘后今天不成交, 留到明天成交.

我能想到的next bar撮合的唯一合理之处就是在收盘后运行策略, 然后等到第二天开盘挂盘成交, 但这不如第二天开盘运行策略并撮合成交合理, 因为在现实中当天收盘后是无法挂盘等待成交的。量化平台最终还是希望能与现实对接的, 所以应尽量能与现实配合。

不知道rqalpha设置next bar撮合的起源来自于哪里? 是否是来自于zipline? 我知道同化顺的MindGo是修改自zipline, 它却并没有next bar撮合的方式, 而是采用开盘价撮合.