如何将真格量化回测数据展示到客户端

本文介绍如何在量化交易系统中利用特定插件将日志中的信号数据可视化,展示在客户端技术分析图表上。通过编写策略输出特定格式的日志,再使用自定义公式在K线图上显示信号,适用于博易5.3+/6及汇点客户端。

简介


通过本功能,可以将量化交易系统上(用户)日志内记录的特殊信号数据展示在客户端的技术分析图表上。其实质是在客户端的指标模块上增加一个插件,提供解析特定格式的日志文件并得到序列数据的函数。用户可以在此函数的基础上编写自己的各种指标,来定制想要看到的信号的外观。
此功能适用于博易5.3+/6及汇点客户端。


安装功能插件


在博易5.3+/6/汇点客户端的 cfg 目录下,创建名为 Dll 的目录(如果该目录还不存在的情况下)。
将 PQSignalShow.dll 文件复制到刚才创建的 Dll 目录下。
该DLL文件可在这里下载


启动客户端(以下用博易5.3+为例,其它客户端操作可能略有不同),选择主菜单中“特色功能”下的“指标管理”:


进入“函数管理”:


点击右下角的“函数管理”,选择“注册Dll函数“页签:


红框中按照图示填写,最后两个文本字段可以自己随意,其余内容必须如下图:


至此,相关功能插件已经安装完毕。


使用插件


导出信号数据


输出信号的代码可以参考这个文章附带的策略(如需要策略密码,策略密码为123)。


在真格量化量化交易系统中欲导出信号,需要通过log对象输出特定格式的日志。遵循下列规则:


1,每一行日志只能输出一个信号。


2,信号内容是一个json字符串,包含一个字典,具备下列字段:


a.HappenTime:信号发生时间,非常关键,建议用datetime对象的字符串格式。


b.Type:信号类型,整数,相当于指标中的线条名称。


c.Value:取值,可为布尔、整数或浮点数。若省略则等于布尔值的true或整数1。


d.KeepMode:可选,布尔型取值。若为true表示后续K线上延续当前的Value。


3,信号内容的json字符串必须用“PQSignalBegin<”和“>PQSignalEnd”括起来。前后其它内容会被忽略。


因为要通过json格式导出,我们需要在代码头部先导入json模块
import json


以量化交易系统中默认提供的“期货”类策略模板为例,增加下列代码:
#ma1上穿ma2时买入螺纹主力1手
elif MA1[-1] >= MA2[-1] and MA1[-2]<MA2[-2]:
​ QuickInsertOrder(context.myacc,g.code,'buy','open',dyndata.now,10)
​ signal = {}
​ signal["HappenTime"] = str(GetCurrentTime())
​ signal["Type"] = 1
http://log.info("PQSignalBegin<" + json.dumps(signal, ensure_ascii=False, default=str) + ">PQSignalEnd")
#ma1下穿ma2时卖出平仓
elif MA1[-1] <= MA2[-1] and MA1[-2]>MA2[-2]:
​ QuickInsertOrder(context.myacc,g.code,'sell','close',dyndata.now,10)
​ signal = {}
​ signal["HappenTime"] = str(GetCurrentTime())
​ signal["Type"] = 2
http://log.info("PQSignalBegin<" + json.dumps(signal, ensure_ascii=False, default=str) + ">PQSignalEnd")
参考下图中红线框出部分:


运行回测(每天),得到的日志如下图所示:


把该日志下载下来,保存到本机硬盘:


在主图上叠加信号


在公式管理器点击“新增公式”:


编写公式,例如:


其中的目标文件名为下载好的含有信号的日志文件。
点击“确定”保存该公式。
在K线图加载公式,即可将真格量化的买卖信号显示在客户端的K线图上:


显示效果,用户应注意这些信号只包括我们在真格量化的回测时间段产生的信号:

 


在副图上绘制指标——以账户权益曲线为例


此种方式也可以用来绘制自定义指标,此时会主要用到Value字段。仍按上述例子,在策略末尾增加一部分“信号”的输出:
#输出权益值
mydata = {}
mydata["HappenTime"] = str(GetCurrentTime())
mydata["Type"] = 3
mydata["Value"]= context.myacc.AccountBalance.AssetsBalance
http://log.info("PQSignalBegin<" + json.dumps(mydata, ensure_ascii=False, default=str) + ">PQSignalEnd")
如以下代码:


运行回测(仍为日线级别)得到的日志如下图所示,保存该日志到硬盘:


在博易5.3+客户端上编写指标,例如:


在副图上可以看到这个指标:


在本例子中,用了Type:3的信号作为权益数据输出到副图上作为信号对照。并在副图背景上绘制了红色区域作为回测账户有持仓的部分。用户可以参照这个方法,自己再发挥想象,输出其他自己关注的指标。

<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检验**:对开盘价施加随机扰动,评估策略鲁棒性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值