问题描述
请问回测中159513昨天15点的成交价1.286既不是收盘价也不是开盘价,那是什么价格?
解决方案
在 JoinQuant (聚宽) 量化平台中,关于 order_target_value 的成交价格以及回测中成交价与实际行情价格不一致的问题,主要与撮合机制和**滑点(Slippage)**有关。
1. order_target_value 使用的是什么价格?
order_target_value(以及其他的 order 系列函数)在默认情况下下的是市价单。根据聚宽的撮合规则,市价单的成交价格计算公式为:
成交价格 = 最新价 ± 滑点
- 最新价的定义:
- 如果在开盘时刻(如 9:30)运行,最新价为当日开盘价。
- 如果在盘中其他时刻运行(如分钟回测),最新价为上一分钟的最后一个价格(即上一分钟的收盘价)。
- 买卖方向的影响:
- 买入时:成交价 = 最新价 + 滑点
- 卖出时:成交价 = 最新价 - 滑点
2. 为什么 15:00 的成交价既不是收盘价也不是开盘价?
您在回测中观察到 159513 在 15:00 的成交价(1.286)既不是当时的收盘价也不是开盘价,根本原因是系统默认加入了滑点。
在真实的交易市场中,由于市场波动和交易延迟,您的委托价格往往不能以理想的盘口价格成交。为了让回测更贴近真实市场,聚宽系统默认开启了滑点机制。
- 系统默认滑点:如果您在
initialize函数中没有显式调用set_slippage函数,系统默认的滑点是PriceRelatedSlippage(0.00246),即双边各千分之 2.46 的百分比滑点。 - 计算示例:假设 15:00 的实际收盘价为 1.283,如果您是买入操作,实际成交价 = 1.283 * (1 + 0.00246) ≈ 1.286。这就是为什么您看到的成交价会略高于(买入)或略低于(卖出)实际行情价格。
3. 如何修改或关闭滑点?
如果您希望回测的成交价严格等于行情价格(不推荐,因为这会高估策略收益),或者希望自定义滑点大小,可以在 initialize 函数中使用 set_slippage 进行设置:
def initialize(context):
# 关闭滑点(设置为固定滑点 0)
set_slippage(FixedSlippage(0))
# 或者设置为更小的固定滑点,例如 0.01 元
# set_slippage(FixedSlippage(0.01))
# 或者修改百分比滑点,例如千分之一
# set_slippage(PriceRelatedSlippage(0.001))
总结:您看到的异常成交价是由于系统默认的滑点机制造成的。order_target_value 默认以市价单成交,成交价等于当时的最新价加上或减去滑点。