JQData + matplotlib 实现回测日志的交易细节可视化 量化数据接口

article/2025/1/8 5:34:44

原文:https://zhuanlan.zhihu.com/p/49051899
前言:

做量化交易的朋友都知道回测的重要性,回测结果是衡量一个量化交易策略是否靠谱的重要依据。回测平台会按历史行情数据模拟成交,并将回测结果汇总成报告。

在很多时候,仅有一份回测的最终结果是不够的。比如说当我们发现结果不符合策略的设计预期时,就需要对部分或全部股票的买卖操作进行检查确认。通常我们要翻阅回测平台给出的回测日志,找到有待检查确认的买卖交易,根据其品种、时间周期和交易时间翻查当时的历史行情,而这时又往往需要打开第三方行情软件,输入该品种的交易代码,调整K线图到特定的时间周期(比如60分钟图),再在时间轴上定位至相应的日期,然后查看该笔交易发生当时的行情走势是否符合你的策略预期。整个过程操作起来很麻烦,如果你的电脑只有一个显示屏,还得在回测平台和第三方行情软件之间来回切换,效率极低。

通过解析回测日志,可以提取出交易代码和交易时间等信息,再利用JQData的本地数据下载功能,结合matplotlib这一常用绘图工具库,可以实现自动获取行情数据然后在屏幕上绘制相应的K线图,并直接定位到图上的特定日期附近,这样就能快速方便地可视化复盘回测日志中的每笔交易,直观地来检验每一笔交易是否符合预期。

整个项目全部用python语言来编写,以下分几个部分简要介绍实现的方法:

一.解析回测日志:

在策略的代码中可以加入日志信息来详细记录每笔买/卖操作,比如像这样:

买入:log.info(“Buying %s” % (security))
卖出:log.info(“Selling %s” % (security))
如此一来,JoinQuant的回测日志中将会包含每笔买卖操作的详细信息,回测结束后在“日志输出”一栏下面可以找到很多买入,卖出的日志信息,例如:

2017-06-20 09:30:00 - INFO - Buying 000002.XSHE
2017-06-26 09:30:00 - INFO - Selling 000002.XSHE

将这些日志依照横线和空格等特征关键字split之后,可以很容易的提取出时间、买卖方向以及品种代码等有用的信息。

注意:如果你想使用来自其他回测平台的日志,可能还需要将提取出的品种代码转换为JQData兼容的格式,JQData提供了一个API可以实现这种转换:normalize_code,详见官方文档。

考虑到回测日志可能包含很多次的买入和卖出,所以还设计了连续输入模式,并做了一定的容错处理,可以将多行日志一次性复制粘贴进来。

二.获取数据:

提取出交易代码和时间等信息之后,就可以调用JQData的get_price函数获取该股票的历史行情数据。get_price函数的参数较多,其中security是必填的,即股票的交易代码(JQData格式)。start_date和end_date两个参数为股票的上市和退市日期,可以通过get_security_info函数查得。然后根据策略运行的频率选择frequency参数,如果是日线的话就用默认值’daily’,参数fq使用默认值’pre’即前复权。注意一定要加上skip_paused=True,来跳过停牌时期。

除了历史行情数据之外,聚宽还提供了财务数据、经济基本面数据以及一些特色因子数据等,可供下载。如果你的策略中用到了这些数据,希望在复盘时与行情数据一并展示,可以调用JQData提供的相应API来获取。

参考API文档>>

三.绘图:

有了数据,接下来就可以绘图了,这里我们用到了matplotlib以及它的一个扩展库mpl_finance来实现。如果是初次使用的话需执行以下命令安装:

python -mpip install -U matplotlib
python -mpip install https://github.com/matplotlib/mpl_finance/archive/master.zip
使用时需在代码中导入相应的module

import numpy
import matplotlib.ticker as ticker
import matplotlib.pyplot as plt
from mpl_finance import candlestick_ohlc
首先创建一个figure,采用3x1栅格布局(grid)

fig = plt.figure()
grid = plt.GridSpec(3, 1, hspace=0.15)
上方主图占2个grid,下方副图占1个grid,两者共享X坐标轴,底部适当留出空白

main_ax = plt.subplot(grid[0:2,0])
extra_ax = plt.subplot(grid[2,0], sharex=main_ax)
fig.subplots_adjust(bottom=0.2)
接下来先画主图,主图显示K线和买卖点

candlestick2_ohlc(main_ax, o, h, l, c, width=0.6, colorup=‘red’, colordown=‘cyan’)
main_ax为subplot返回的主图Axes实例,o、h、l、c分别为开高低收数据序列,阳线颜色用红色,阴线用青蓝色,与国内行情软件通常默认的设置一致。

然后根据日志中提取出的买卖方向和时间信息,在主图上用箭头标注出相应的买入点和卖出点。

extra_ax.arrow(x, y, 0, dy, color=clr, width=0.4)
x和y为箭头起点的坐标,dy为y轴方向箭头的长度,由于箭头方向只可能是向上或者向下,所以x轴方向长度dx为0,clr为箭头的颜色,向上箭头和向下箭头可以被设置为不同的颜色,width是箭头的宽度,设置为0.4。

主图下方为副图,可跟据策略的具体需要安排显示的内容,比如偏重技术分析的可以显示成交量或其他一些副图指标,偏重资金面的话可以显示主力资金流向或龙虎榜数据等信息,偏重基本面的可以显示财务指标等。通过JQData提供的丰富的API可以方便地获取这些数据,再用matplotlib的bar, plot等函数展现出来。

以成交量为例,先声明两个列表分别表示柱子实体颜色和边框颜色:

c=[]
ec=[]

然后遍历一遍成交量,当前K线的成交量大于前一根的,边框设为红色,实体设为黑色。当前K线成交量小于前一根的话,边框和实体都设为青蓝色:

for i in range(n):if i == 0:c.append('black')ec.append('red')else:if v[i] > v[i - 1]:c.append('black')ec.append('red')else:c.append('cyan')ec.append('cyan')

最后调用bar函数,传入x轴坐标、成交量、实体颜色以及边框颜色等4个数列:

extra_ax.bar(range(n), v, color=c, edgecolor=ec)

绘制出来的效果是这样子的,图中白色和黄色的箭头指出了策略的买点和卖点,一目了然:

在这里插入图片描述
总结

以上介绍了用JQData + matplotlib实现快速方便地查看回测日志中的交易细节,具体的代码可以访问https://github.com/zc8424/VisualizeThemAll获得,目前还只是实现了一些基本的功能,未来借助JQData强大的API还将做进一步的深入开发。大家如果感兴趣的话请关注此项目,欢迎多提意见和建议。
原文:https://zhuanlan.zhihu.com/p/49051899


http://chatgpt.dhexx.cn/article/bGjWNuo8.shtml

相关文章

Note: Python学习笔记 -- Anaconda install jqdata

运行代码下列代码,提示错误 没有安装 jqdata。打开Anaconda Prompt 输入 pip install jqdata 提示cannot find command git然后百度了半天,有人说 pip install git 出错可以使用 conda install git 但是依然出错。最后去官网下载了Git:https://git-scm.…

jq使用教程01_最贴心教程,安装JQData全靠这篇指南

Hi, 各位亲爱的小伙伴们! 近来听说有部分小伙伴在安装JQData时遇到了点小麻烦,导致最后没有安装成功,为了帮助小伙伴们快速成功安装JQData,小编今天来为大家排一下“雷”,希望能帮到你们哟 (・ω&#xff6…

事件驱动的选股小工具(JQData)

昨天发改委下发了《关于积极推进风电、光伏发电无补贴平价上网有关工作的通知》,也不知道对股市是利空还是利多。连夜做了一个搜索公司经营范围的小工具,看看那些股票受到影响。 以后还可以增加筛选条件,比如财务指标,剔除ST股票,…

股票python量化交易008-JoinQuant中JQData的使用

查阅JoinQuant中JQData的使用文档python代码实现导入JQData,并认证用户身份。认证完毕显示“auth success”后即可使用 from jqdatasdk import *; auth(ID,Password);#ID是申请时所填写的手机号;Password为聚宽官网登录密码 # 查询jqdata的调用次数情况 surplus_count = g…

jqdata pyechart: 用grid双图实现k线带图成交 — by QUANTAXIS

from jqdatasdk import * from pyecharts import Kline,Bar,Grid 首先我们先应JQDATA 的活动演示一下如何调用pyecharts 画图 auth(acc,password) dataget_price(000001.XSHE) auth success先打印下 data 我们可以看到 jqdata返回的格式是 一个单index的Dataframe data.he…

Quant | JQData使用API简单梳理(二)

聚宽平台实际上提供了两种查询数据的方法,第一种是线上在聚宽平台可以使用的API:jqdata,另外一种则是本地的接口:JQData,是的,你没有看错,只是大小写的不同,搞得一开始我以为完全是同一种。jqdata可以线上通过import jqdata来引入数据接口,本地的JQData则是通过import…

jqdata(data是什么文件格式)

期货交易中bar和tick是什么意思 Bar 的概念 在一定时间段内的时间序列就构成了一根 K 线(日本蜡烛图),单根 K 线被称为 Bar。 如果是一分钟内的 Tick 序列,即构成一根分钟 K 线,又称分钟 Bar; 如果是一天内的分钟序列,即构成一根日…

JQData | 量化界最好用的本地量化金融数据(free free~)

什么是本地量化金融数据 - JQData ? 使用JQData本地量化金融数据服务,可快速查看、计算或接入金融数据信息,解决本地、web、自研金融终端调用数据的需求。支持python多版本及多操作系统。为财经类企业、金融机构、学术研究机构和量化爱好者们…

获取股票数据【使用JQData查询行情数据、财务指标、估值指标】

了解股票: 在上一次量化小科普【什么是量化?常用的股票量化指标、如何搭建量化交易系统】对于量化的概念有了一个基本认识,其中量化的主体在这门课程的学习中是“股票”,而当别人问你:“什么是股票?”&…

JQData安装的问题(本地调用的量化金融数据接口-免费)

JQData简介(1)JQData是聚宽数据团队专门为有志于从事量化投资的金融机构、研究人员以及个人量化爱好者提供的本地量化金融数据。用户只需在本地Python环境下安装JQData数据包,输入三行代码,即可调用由聚宽数据团队专业生产的全套量化金融数据,让你轻松告别平台限制,灵活安…

JQData安装(转)

首先,JQData是基于python的一个数据包,所以安装JQData的第一步是安装Python (没有接触过python或者python基础不好的小伙伴,可以关注聚宽量化课堂的python讲堂进行python学习)。 对于python安装包的选择,…

JQData安装的问题(只解决安装的问题)

1. JQData简介 (1)JQData是聚宽数据团队专门为有志于从事量化投资的金融机构、研究人员以及个人量化爱好者提供的本地量化金融数据。用户只需在本地Python环境下安装JQData数据包,输入三行代码,即可调用由聚宽数据团队专业生产的…

JQData-本地调用的量化金融数据接口(免费)

什么是聚宽数据-JQData? 使用JQData金融数据服务,可快速查看、计算或接入金融数据信息,解决本地、web、自研金融终端调用数据的需求。支持python多版本及多操作系统。为财经类企业、金融机构、学术研究机构和量化爱好者们提供一站式财经信息服务及数据解决方案。 提供哪些…

JQData安装 | 最贴心教程,安装JQData全靠这篇指南

转自 JQData安装 | 最贴心教程,安装JQData全靠这篇指南 Hi, 各位亲爱的小伙伴们! 首先,感谢聚宽小编 JQData01 给我开放了更多的数据访问资源 近来听说有部分小伙伴在安装JQData时遇到了点小麻烦,导致最后没有安装成功&#xff0c…

如何理解敏捷开发

目录 什么是敏捷开发 2.0 常用的 4 种开发模式 瀑布式开发 迭代式开发 螺旋式开发 敏捷软件开发 4 种开发模式总结 什么是 DevOps 精益管理的7个原则 DevOps的开发流程 提交 编译 单元测试 部署到测试环境中 预生产测试 部署到生产环境 敏捷开发 2.0 解决的问…

什么是敏捷?什么是敏捷开发?

什么是敏捷? 显示敏捷相互馈送的各个方面的关系图,例如协作、开发和自动化版本控制和部署。 敏捷是一个术语,描述软件开发方法,强调增量交付、团队协作、持续规划和持续学习。 敏捷术语于 2001 年在敏捷宣言中创造。 宣言旨在制定…

瀑布式开发与敏捷开发的区别是什么

摘要:瀑布模型式是最典型的预见性的方法,严格遵循预先计划的需求、分析、设计、编码、测试的步骤顺序进行。敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。我们将在文章中详细说明两者各自的适合场景。 详细解答&am…

【敏捷式开发公司-禅道使用心得】

前言:本人测试小菜鸡一枚,近期入职了一家六七十人的小公司,在我入职之前,他们一直是用Teambition(以下简称TB)来做项目管理的,包括提交需求、bug管理都是在TB。入职后我也大概使用了一下&#x…

敏捷开发和瀑布式开发

瀑布模型的特点: (传统的开发方式) 1、强调文档 前一个阶段的输出就是下一个阶段的输入,文档是个阶段衔接的唯一信息。所以很多开发人员好象是在开发文档,而不是开发软件,因为要到开发的后期才可以看到软…

【APICloud系列|21】使用APICloud敏捷式开发总结,回顾开发一个完整APP过程。

导读:APICloud是柚子(北京)科技有限公司创建的低代码开发平台,总部位于北京, 通过生产力工具与混合开发技术,为企业与开发者构建高效的IT环境;在APICloud平台已有80万注册用户,平台每日生成安装包超6000个。业务团队延伸至上海、深圳、重庆、青岛等10余个城市。 APICloud是…