真格量化的回测交易撮合机制简介

我们设计策略时为了评估其表现总是需要进行回测。完美的回测当然是越逼近真实交易越好,比如根据逐笔的价格和成交量数据来进行回测。但这个Tick级别的回测需要比较长的时间,用户为了节约时间也会选择进行“每日”或“分钟”级别的回测。

 

为了帮助用户理解回测与实盘的区别,客观地评估策略在不同回测时间频率下的回测表现,我们在此简单介绍真格量化回测引擎的撮合机制。

 

每日级别:

 

回测频率选择“每日”时,系统根据委托价格与当日价格最低及最高点进行比较来判定是否成交(即“K棒拟合”算法)。

以买入委托为例,如果发出限价委托,当委托买价高于当日最低价时,则判定发生成交。

成交价格根据委托价格是否高于K线均价分为两种情况:

 

当委托价格小于K线均价时,成交价即为委托价。当委托价格高于K线均价时,成交价判定为(委托价+K线均价)/2.

成交数量根据当天成交量的三角分布模型判定。

如果发出市价买入委托,对成交价的判定为(当日K线最高价+当日K线均价)/2。成交数量依然根据当天成交量的三角分布模型判定。

当日线出现全天单边市场状况时(即全天只有一个涨停价或跌停价),对于涨停情况,系统判定买入委托,无论限价还是市价,都不能成交。对于跌停情况,系统判定卖出委托,无论限价还是市价,都不能成交。

 

在日级别回测时,系统并不进行开盘集合竞价,每个交易日只进行一次成交判定,未成交的委托将被自动撤单(相当于FAK)。

 

在“每日”级别回测时,系统只会在每日的15:00发送一次行情,如果有成交,系统则以这个时间15:00来显示成交时间。

 

分钟级别:

在分钟级别回测时,判定成交的方法与日级相同,但成交价格的估算与日线有所区别。以买入委托为例,如果发出限价买入委托,系统判定发生成交时,成交价即为委托价:

成交数量根据所在K线的三角分布模型判定。

但与日级别不同的是,在一个交易日内,如果一笔委托在一个分钟K线中并未完全成交,其可继续与下一根K线比较,进行成交判定,直到可成交的委托数量完全成交或该交易日结束。当交易日结束而委托仍未完全成交时,该委托将被自动撤单。如果发出市价委托,以买入委托为例,成交价依然判定为(该分钟最高价+该分钟均价)/2。未成交的委托继续与下一个分钟K线价格进行成交判定。如果该分钟K线本身只有一个价(涨跌停的情况),则在当前K线为涨停时,如果是市价买入,则系统判定无法成交,如果是市价卖出则可全部成交。在当前K线为跌停时,如果是市价买入则可完全成交,市价卖出则系统判定无法成交。未成交的委托量与下一根K线继续进行成交判定(“后续撮合”过程)。

与日级别回测类似,分钟级别回测的成交数量也是通过各个分钟k线的成交量的三角分布模型判定,且同样不进行开盘集合竞价。

 

用户还应当注意,系统进行撮合时是基于完整的分钟K线,以下图为例,如果我们以最新的一根K线,比如14:47的K线,作为发出交易指令的依据,系统会以这根完整K线包含的信息进行撮合。这与真实的交易存在差异。比如在真实的交易中,我们在14:46:01和14:47:00所知道的信息(比如K线均价)并不一致,而回测中系统是假定我们已经有了这根K线的完整信息,然后据此进行成交判定。在回测中,用户可以通过取倒数第二根K线作为发出交易委托的依据来规避可能的“未来数据”问题。

 

在分钟级别回测,系统每分钟发送一次行情,如果判定发生成交则以该分钟对应时间显示成交时间。

Tick级别:

 

在Tick级别回测时,系统使用“盘口拟合”算法进行成交判定。其与“K棒拟合”算法不同的是系统会根据“首次成交”和“非首次成交”的区别来判定成交数量:

 

对于限价委托:

以限价买入委托为例,如果委托价格高于卖盘第一档价格,即判定成交,发生“首次撮合”(即针对第一个Tick进行逐档位撮合的过程),“首次撮合”时发生的第一笔成交为“首次成交”。如果首次撮合之后仍有委托未成交,则其继续与下一个Tick进行“后续撮合”。

 

我们以下图的限价买入委托情况为例。

对于“首次成交”情况,如果买入委托价格高于卖盘对应档位价格(603>602),则判定该档位委托量(20)能够全部成交,成交价为该档位对手价(602)。未成交的委托数量(80)继续与下一个档位的对手盘价格比较,如果委托价仍高于或等于对手盘价格,则继续可与该档位委托量(66)全部成交。对于仍有剩余的委托量(14),如果在当前一个Tick内无法成交,则进入下一个Tick进行“后续撮合”,如果委托价高于或等于下一个Tick对应档位的对手价格,则继续在该档位委托量完全成交(14).

对于“首次撮合”委托价与对手盘价格相同的情况,如下图:

当委托价与对手盘第一档价格相同时,系统判定只有一半委托量可以成交(30的一半15)。如果首次撮合之后,仍有剩余委托量,其在后续撮合中,如果委托价仍等于对手盘价格,此时系统会判定其与对手盘委托量完全成交。这是对非首次成交的处理,体现了“时间优先、价格优先”的原则。

对于市价委托:

系统会将市价委托转为以涨跌停价为委托价格的限价委托,然后用和限价委托相同的逻辑进行成交判定。成交价即为和对手各档位进行撮合成交的加权均价。

 

 

在Tick级别回测,系统也不进行集合竞价,但会提供一个集合竞价产生的价格数据。

在回测记录的交易流水中,系统会以发生成交的那一秒对应的时间来显示成交时间,这与真实的交易撮合过程也最为接近。

 

— — — — — — E N D — — — — — —

往期文章:

Numpy处理tick级别数据技巧

真正赚钱的期权策略曲线是这样的

多品种历史波动率计算

如何实现全市场自动盯盘

AI是怎样看懂研报的

真格量化策略debug秘籍

真格量化对接实盘交易

常见高频交易策略简介

如何用撤单函数改进套利成交

Deque提高处理队列效率

策略编程选Python还是C++

如何用Python继承机制节约代码量

十大机器学习算法

如何调用策略附件数据

如何使用智能单

如何扫描全市场跨月价差

如何筛选策略最适合的品种

真格量化可访问:

https://quant.pobo.net.cn

真格量化微信公众号,长按关注:

遇到了技术问题?欢迎加入真格量化Python技术交流QQ群  726895887


 

 

 

<think>好的,我现在要处理用户的问题,用户想了解关于集合竞价在量化交易中的方法或工具。首先,我需要忆一下之前提供的引用内容,看看是否有相关的信息。用户提到的引用3是关于qteasy框架进行集合竞价选股的,这应该是一个关键点。 首先,用户可能需要知道如何在中处理集合竞价的数据。因为集合竞价和连续竞价的机制不同,时需要特别考虑。比如,集合竞价的成交价格是撮合成交的,而通常基于历史数据,但历史数据中的集合竞价阶段的数据可能不够详细,或者需要特定的处理方式。 然后,用户可能需要工具推荐。引用3提到了qteasy,这是一个支持自定义策略的框架,能够处理集合竞价的选股策略。此外,可能还有其他工具,比如vn.py或者Backtrader,但需要确认它们是否支持集合竞价的模拟。 接下来,我得考虑用户的实际需求。用户可能是在开发一个涉及集合竞价的策略,比如在开盘时根据集合竞价的数据决定买入或卖出。这时候的准确性就很重要,因为集合竞价的成交机制不同于连续交易,如果不能正确模拟,结果可能不准确。 还要考虑中的撮合机制。引用2提到真格量化有不同级别的,比如每日或分钟级别,但集合竞价可能需要更精细的数据,比如Tick级别,或者特定的时间段处理。需要解释在时如何处理集合竞价阶段的订单撮合,比如使用开盘价作为成交价,或者模拟撮合过程。 另外,用户可能需要具体的步骤,比如如何获取集合竞价的历史数据,如何在策略中编写相关逻辑,以及如何验证结果的有效性。这里可能需要分点答,结构清晰。 还要注意用户提到的“方法或工具”,所以答中需要包括方法和工具两部分。方法部分可以包括数据处理、撮合逻辑、策略编写;工具部分可以介绍qteasy、vn.py等,并说明它们的优缺点。 最后,要确保答符合系统指令,使用正确的中文,LaTeX格式,生成相关问题,并适当引用提供的资料。比如引用3中的qteasy示例,可以给出代码片段,说明如何实现集合竞价策略的。 检查是否有遗漏点,比如的挑战,比如数据精度、撮合规则的不同,以及如何解决这些问题。可能还需要提到结果的分析,比如滑点、成交率等指标。 总结,答的结构应该是先介绍集合竞价的要点,然后分方法和工具两部分详细说明,接着给出示例代码,最后生成相关问题。确保引用正确,使用正确的格式,语言自然。</think>### 集合竞价在量化交易中的方法与工具 #### 核心要点 集合竞价阶段的需重点处理**价格形成机制**和**订单撮合规则**。由于集合竞价通过最大成交量原则确定开盘价[^1],需模拟以下环节: 1. **数据获取**:需包含集合竞价时段的历史委托簿数据(如逐笔委托、成交量) 2. **撮合逻辑**:按价格优先、时间优先原则模拟订单匹配 3. **成交判定**:根据最终开盘价判断策略订单是否成交 #### 常用方法 1. **开盘价模拟法** 假设策略订单以开盘价成交,适用于高频数据不可得的情况。 例如:若策略在9:25提交买入委托且开盘价≤限价,则视为成交。 ```python # qteasy示例:开盘价触发策略 from qteasy import Strategy class AuctionStrategy(Strategy): def on_data(self, data): open_price = data.open[-1] if self.signal_condition(open_price): self.buy(price=open_price, volume=100) ``` 2. **委托簿重建法** 基于Level2数据重构集合竞价委托簿,更精确但计算复杂。需处理: - 价格层级的买卖量累积 - 虚拟成交价计算(最大成交量对应价格) 3. **混合撮合法** 在分钟级框架中嵌入特殊时间切片,例如将9:20-9:25作为独立时段处理[^2]。 #### 工具推荐 | 工具名称 | 特点 | 数据要求 | |---------------|----------------------------------------------------------------------|------------------------| | **qteasy** | 支持自定义交易时段划分,提供集合竞价事件触发器[^3] | 分钟级/日级+开盘价数据 | | **vn.py** | 开源框架,可扩展撮合引擎,需自行实现集合竞价规则 | Level2逐笔数据 | | **Backtrader**| 通过扩展`DataFeed`添加竞价阶段数据 | CSV自定义格式 | | **JoinQuant** | 内置集合竞价模拟模块,支持`before_open`函数处理竞价逻辑 | 平台集成数据 | #### 实现挑战与解决方案 1. **数据缺口** - 问题:多数免费数据集仅包含开盘价,缺少委托明细 - 应对:使用`开盘价+成交量`估算成交概率,例如: $$ P(成交)=\begin{cases} 1 & \text{当 } P_{\text{order}} \geq P_{\text{open}} \text{(买)}\\ 0 & \text{否则} \end{cases} $$ 2. **撮合时延** - 问题:实盘订单提交时间影响成交优先级 - 模拟:在中引入随机延迟因子 ```python import numpy as np submit_time = auction_start + np.random.uniform(0, 300) # 随机分布在5分钟内 ``` 3. **价格穿透** - 问题:极端行情下开盘价跳空导致失真 - 校验:加入滑点控制模块 ```python executed_price = open_price * (1 + 0.0005) # 买入时增加0.05%滑点 ``` #### 验证方法 1. **敏感性分析**:调整订单提交时间参数,观察收益曲线稳定性 2. **样本外试**:使用奇数/偶数日分割训练集与试集 3. **Monte Carlo检验**:对开盘价施加随机扰动,评估策略鲁棒性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值