Python期货量化交易基础教程(20)

我们在第16章用浏览器实现过绘制技术指标,但当技术指标数量多时浏览器容易卡顿,所以我们需要一种更高性能的绘图方法。

Python绘图库最著名的莫属matplotlib,matplotlib强大、专业,适用于各种数据分析领域,但在实时绘制K线图时性能有些低,尤其是数据量大的时候更显不足,我们推荐使用PyQtGraph,PyQtGraph提供了高度优化的绘图接口。

本章借鉴了开源量化平台VNPY绘制K线的方法。

PyQtGraph依赖于PyQt,可与PyQt配合使用,PyQtGraph可嵌入PyQt的部件组成丰富的GUI界面程序。

安装pyqtgraph:

20.1、PyQtGraph简介:

PyQtGraph应用基于项的图形概念,例如,窗口中的一个图片就是一个项,图片上的一个曲线或一个文字也是一个项,窗口由GraphicsView或其子类创建,图形项由QGraphicsItem或其子类创建,窗口包括窗口中的各种图形项组成一个图形视图。

图形视图需要创建一个场景(scene),类似舞台表演之前需要建立一个环境用来搭建舞台,这个场景是通过QGraphicsScene对象实现的,通常会自动创建。

场景用来管理图形项,对场景中的一个项变换,也会应用到其子对象,例如移动一个图片,图片上的各类图形会跟着移动。

图形视图使用三种坐标系,最顶层的窗口使用物理坐标系,类似画图时的画框,物理坐标系左上角坐标原点(0,0),场景使用逻辑坐标系,类似画框上的画图区,第三种坐标系是图形项使用的坐标系,它是以(0,0)为原点的逻辑坐标系,每个项的原点就是该项在场景中的位置。

图形项也称为图元Item,图元Item通过创建QGraphicsItem的子类来创建,在子类中需要实现它的两个纯虚拟公共函数:boundingRect(),它返回图元绘制的区域的估计值,即图元在这个函数返回的范围内绘制;paint(),它实现实际的绘画,绘制基于逻辑坐标系,默认原点是(0,0)。这两个函数会被自动调用。

图形视图的层次结构如下:

图元Item有以下三种:

数据类(QGraphicsItem的子类)

容器类(QGraphicsItem的子类;包含其他QGraphicsItem对象,必须在GraphicsView中查看)

容器类(QWidget的子类;可以嵌入在PyQtGUI中)

在PyQtGraph中,有以下几种绘制数据类图形的方法:

plot()方法的基本参数如下:

PyQtGraph提供了两种类似的方法来进行全局设置:

我们可以这么使用:

背景颜色为pyqtgraph.mkColor函数的合法输入,包括以下形式:

20.2、技术指标绘制:

20.2.1、K线和成交量绘制类:

首先需要记录K线,函数get_kline_serial()订阅K线后K线的数量便固定了,K线更新时只是修改原数据,不会增加数量,因此若想记录K线的增加可使用如下类:

初始化BarManager时传入订阅的K线,然后随着K线更新反复调用update_bar()即可把新K线追加到变量self.bars中。

若要画价差K线,也可以模仿K线记录类编写价差K线的记录类,例如:

由于不同指标和K线需要对齐x轴,以免图形发生错位,简单的处理方法是重置K线数据的行索引,用K线的总数量重置行索引,绘图时x轴会按行索引对齐。

K线包含影线和实体,影线是线段,实体是矩形,成交量以柱体显示也是矩形,我们用QPainter类来画K线和成交量,QPainter需要在一个绘图设备上画图,绘图设备包含QPixmap、QImage、QBitmap、QPicture,我们用的绘图设备是QPicture,QPicture用来记录QPainter的绘制指令,在paint()中重放QPicture记录的绘制指令即可画图。

例如,用以下函数绘制K线:

参数ix是需要绘制K线的x轴位置,bar是一根K线,首先创建QPicture,然后创建QPainter并传入参数QPicture,QPicture便开始记录QPainter的指令,QPainter.end()结束记录,然后返回QPicture,QPicture会在paint()函数中重放画图指令,例如:

boundingRect()函数用来设置绘图的范围,例如:

随着K线更新,K线的价格范围也会变化,以下函数被反复调用以返回指定x轴范围的y轴价格范围:

成交量的绘制过程和K线类似,可把K线和成交量的公共函数写在同一个类中,K线和成交量作为子类继承该类即可,例如:

完整的代码如下:

实际使用中成交量的作用不大,用其他软件看成交量即可,没必要重画。

20.2.2、技术指标计算类:

类似均线这样的曲线,我们可创建一个曲线类,用该曲线类统一计算这类曲线,例如:

技术指标计算函数采用的是模块tqsdk.ta中的函数,模块tqsdk.ta中的函数默认用K线的收盘价计算,返回值为pandas.DataFrame类型,一开始指标周期范围内的K线不够计算的,指标值会以Nan值表示,但Nan值是不确定值,无法绘图,需要对Nan值替换,一个方法是替换成第一个计算出的指标值,即绘图时把最开始的指标画成直线。

函数update_bar会被反复调用以更新指标值,由于技术指标需要与K线的x轴对齐,因此默认以全部K线计算,但当K线数量逐渐增多时会增加计算量,如果只计算最新的K线效率会更高,但对齐x轴又需要增加更多代码量,读者可自行尝试。

MACD指标既有曲线又有直线,可以分别来画,曲线用曲线类CurveItem计算,直线可类似画K线影线那样画,则需要多创建一个画MACD柱线的类,如下:

函数tickStrings会被自动调用以转换x轴刻度。

20.2.4、指标窗口类:

我们用PlotWidget创建一个指标窗口,用GraphicsLayout创建一个图形层,图形层可以以网格的形式布局图元,我们把图形层设置为PlotWidget的中心层,例如:

我们在图形层GraphicsLayout中添加图元容器PlotItem,可按行列位置添加,在图元容器PlotItem中再添加K线或指标图形,还可以添加文字,例如:

反复调用K线类的update_bar函数即可绘制K线,曲线类需要用setData()函数更新指标值。

总结一下绘图流程:

上述是简化过程,还有一些细节工作要做,比如调用K线管理类更新K线,图元容器是否显示x轴或其他轴,图元容器x轴是否联动,比如成交量指标处在副图的图元容器,和主图K线所处的图元容器x轴应该联动,这样拖动一个图形,另一个就可以跟着移动,主图的图元称为锚定图元,其他副图图元可锚定该图元的x轴以实现联动,随着K线的更新,图元容器需调整可视范围以始终显示最新K线,不同的图元容器是否显示不同的K线,等等。

我们结合窗口类的完整代码看一下:

20.2.5、图形显示:

我们把上述几个类的代码保存在文件中,例如文件名:klineschart.py,文件作为模块导入到代码中,我们还需要用到第19章里的信号线程,我们结合代码看一下:

代码一共创建了五个图元容器,按行布局,图元容器里分别添加了K线均线、成交量、K线布林线、MACD、价差K线,代码里注释的很清楚了,结合注释就可以理解指标绘制的过程了,绘制显示效果如下:

THE END
1.python可视化工具visdom使用教程w3cschool笔记python可视化工具visdom使用教程 学习数据分析与科学计算的小伙伴们对数据可视化的需求是比较重视的。所以python的第三方库种有很多python可视化工具,今天小编要介绍的python可视化工具是visdom,在小编往期的文章中已经有简单的visdom的使用介绍了,今天小编就系统化地整理一下常用的一些visdom的使用方法吧。https://www.w3cschool.cn/article/86830765.html
2.安装Python和pygame及相应的环境变量配置(图文教程)实践部分 用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板1) 一个类似于Windows画图板的小玩意儿,精简了很多功能但是有更帅的笔刷。这一次主要是将笔刷的实现。 用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板2) 加上了按钮,我们的涂鸦画板可以用了! 用Python和Pygame写游戏-从入门到精通(实战二:恶...https://www.iteye.com/resource/weixin_38585666-13772327
3.Python基础案例教程(微课版)课后参考答案钟柏昌.pdfPython基础案例教程(微课版)课后参考答案钟柏昌.pdf 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 1 .更换案例 中的乱序数据 内容 ,如将 “2,5,0,8,3,7,4,6,9,1 ”数据修改为 “12,5,10,85,34,7,4,62,9,1,172,22,0,184”。测试不同的乱序数据,查看运行结果。 代码: s [...https://max.book118.com/html/2022/1212/8066101062005021.shtm
4.Mind+Python编程入门系列课程—09弹球小游戏积分版DF创客社区教程目录:Python编程入门系列课程——01 智能绘星 Python编程入门系列课程——02 模拟星空 Python编程入门...https://mc.dfrobot.com.cn/thread-309541-1-1.html
5.KeyShot11破解版LuxionKeyShotPro11.3.3.2win/...通过Python脚本控制台提供更深入的功能,以释放KeyShot的强大功能。 17、实时区域渲染 选择并集中您的计算机能力来渲染场景的小区域并实时查看结果。 18、渲染通道 对于更多的后处理控制,KeyShot包括渲染通道,如小丑、深度和普通通道。 19、渲染队列 存储您一整天准备的所有场景,并在您准备好时处理整批。 20、3D导出...http://www.sd173.com/soft/10830.html
1.Python绘图的简易方法及步骤python简单画图程序Python作为一种高级编程语言,具有易学易用、功能强大等特点,越来越受到广大程序员的青睐。在其中,绘图功能是Python的一大亮点之一,而其中的turtle模块则是其独特之处。turtle模块可以通过一些简单的命令,实现图形绘制、图像设计等高级功能。 目录 【第一章:turtle概述】 ...https://blog.csdn.net/weixin_73425532/article/details/131325955
2.Python实时画图mob64ca12d2317d的技术博客通过以上步骤,我们可以实现 Python 实时画图的功能。首先,我们导入所需的库;然后,创建图形对象;接着,更新数据并绘制图形;最后,通过循环来实现实时更新。你也可以根据自己的需求进行调整和扩展,如更改数据源、修改图形样式等。希望本文对你有所帮助,祝你在开发过程中能够顺利实现实时画图功能!https://blog.51cto.com/u_16213307/9174606
3.用Python串口实时显示数据并绘图pyqtgraph(详细教程)用Python串口实时显示数据并绘图 使用pyserial进行串口传输 一、安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "‘E:\Anaconda3\Scripts\pip-script.py’ is not present."错误 使用 easy_install pip命令就能解决,换一条重新能执行安装的命令 常用方法: ser = serial.Serial(0...https://cloud.tencent.com/developer/article/1809695
4.PythonMatplotlib绘图基础详细教程Mysqlmatplotlib是python中用于绘制各种图像的模块,功能十分强大,通常与pandas模块搭配使用,可以生成各种样视的图片,用于数据的分析和展示,下面这篇文章主要给大家介绍了关于Python Matplotlib绘图基础的相关资料,需要的朋友可以参考下 plt是最常用的接口 1. 画图的基本步骤 ...https://m.jb51.net/article/253730.htm
5.turtle在本教程中我们将探索海龟绘图的一些基本知识。 启动海龟环境 在Python shell 中,导入 turtle 模块的所有对象: from turtle import * 如果你遇到了 No module named '_tkinter' 错误,则需要在你的系统中安装 Tk 接口包。 基本绘图 让海龟前进 100 步: forward(100) 你应该会看到(最可能的情况,是在你的...https://docs.python.org/zh-cn/3/library/turtle.html