Quantstrat:在同一柱上执行

Quantstrat: Execute on the same bar

我知道 here 之前有人问过这个问题,但我想进一步扩展这个问题。

假设我的入场价是 50,所以在一天开始时我下了 1 手 50 的限价订单。在交易日,市场崩盘,我的出价被成交。在真实世界的实时交易场景中,我的执行将以 50 的价格在同一个每日柱上执行。即使我使用 1 分钟柱并且实时填充发生在 14:00,数据14:01 的价格与交易和成交完全无关。

此外,如果我已经在进行交易(假设做空 @ 50 秒),我在 80 秒下了止损单,并且市场在 80 秒时向上交易 - 我会在那时和那里被止损, 大约在 80 年代的价格上下浮动。下一个柱线,无论是每天、每小时还是 1 分钟,都可能以 150 开盘。将在下一个柱线开盘时执行该交易的回测现在可能与某个柱线中发生的情况不同步实时现场场景。

我知道任何根据柱线收盘计算其交易信号的策略都可能会受到巨大偏差的影响,而不会强制执行下一个柱线。但是对于具有预定义 entry/exit 信号的策略(我认为这将是大多数),在同一柱上执行的能力是至关重要的!

在上面的 post 链接中,Josh Ulrich 提到将 allowMagicalThinking=TRUE 添加到对 applyStrategy 和 applyRules 的调用中。但是,我似乎找不到任何关于它的文档,而且我对它的实现也没有任何效果。我错过了什么?

调用 applyRules:

 test <- applyRules(strategy=strategy.st,portfolio=portfolio.st, symbol = symbols, mktdata=mktdata , allowMagicalThinking=TRUE)

或者,调用策略:

out <- applyStrategy(strategy=strategy.st,portfolios=portfolio.st, allowMagicalThinking=TRUE)

allowMagicalThinking = TRUE 导致执行发生在与订单输入相同的观察中。无法强制在与导致订单的信号相同的观察结果中输入订单。

如果您的信号确实是预定义的,您可以将它们包含在您的 mktdata 对象中并充分移动它们,以便在您认为应该执行的时候执行。

我提醒任何这样做的人仔细检查你的结果,因为你几乎绕过了 quantstrat 的所有内置保护措施,以避免在你的回测中产生前瞻性偏差。