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海龟画图,普通人分分钟学会程序员...为什么普通人总是错过发财机遇? 00:56 一只濒危海龟被放归墨西哥湾 曾在距其家约8000公里的海岸被发... 02:05 虎鲨上下颚力量极强,即使是海龟坚硬的背甲也能轻松要穿 00:12 莎莎现场见证王楚钦夺冠,反穿羽绒服太萌,邱贻可为大头鼓掌#... 00:16 男子经过时看到的奇葩一幕,一排小车的天窗都被削掉了一...https://www.sohu.com/a/830709525_100114195
2....Python编程语言程序绘画游戏设计界面应用设计教程Python教程书本套书是基于当前少儿编程市场上*行的Python编程语言进行课程设计的。*一个分册(基础篇)的定位是打好编程基础,后面三个分册的定位为基础知识的三个应用方向(程序绘画、游戏设计、界面应用设计)。在知识点选取、案例选取、关注角度方法上下功夫,力求既教知识又教方法、既精简又高效、既夯实基础又发挥创造、既有趣又易...https://h5.youzan.com/v2/goods/35vu8p4cuw0mocn
3.python教程下载python教程安卓版下载来自应用汇: python教程http://www.appchina.com/app/com.zengmumu.ems?from=spi-desc python教程 版本更新 更新隐私政策 移除不必要的权限 优化代码 python教程 类似软件 QPython 自媒体教程 素描绘画入门教程 Python编程狮 Python编译器 易培Excel教程 http://www.appchina.com/app/com.zengmumu.ems
4.Python3教程菜鸟教程> Python3 教程 > Python3 简介 > Python3 环境搭建 > Python3 VScode >Python3 AI 编程助手 > Python3 基础语法 > Python3 基本数据类型 > Python3 数据类型转换 > Python3 解释器 > Python3 注释 > Python3 运算符 > Python3 数字(Number) > Python3 字符串 > Python3 列表 > ...https://m.runoob.com/python3/
5.Python教程Python全栈开发从入门到精通(第一集)(02作业)(下)【Python教程】Python全栈开发从入门到精通(第一集)(02 作业)(下) 07:32 03 基本类型介绍 int 类型转换 简单字符串 18:55 04 索引和切片(上) 19:02 04 索引和切片(中) 19:04 04 索引和切片(下) 26:00 05 字符串相关操作(上)为你推荐(16) 08:04 花2万多刚学完的Java教程全套,视频分享给大家,入...http://m.open.163.com/mobile/free/gb/video?mid=UHHGUQE5T&plid=XHHGUQ8B0
6.笨鸟教程笨鸟教程,涵盖Intellij IDEA教程,PyCharm教程,GoLand教程,WebStorm教程,ChatGPT教程,AI绘画教程,Obsidian教程, Notion教程,Midjourney教程,Java教程,Python教程,Golang教程,AI工具等各类AI编程教程。https://www.javatiku.cn/
1.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
2.python海龟知识点归纳python海龟知识点归纳 目录 1、画笔移动命令 2、画笔控制命令 ?编辑 3、画笔其他命令 4、画笔命令代码 5、海龟基本画图思路 (1)带旋转图案的基本思路 (2)基本画图思路2 (3)n角星画法(只适用于n为奇数的情况) 6、海龟正n边形画法总结 7、海龟画图例题...https://blog.csdn.net/xzal12/article/details/144053521
3.用python画小猫简单mob649e81624618的技术博客在这篇文章中,我们将一步步教会你如何用Python画出一只简单的小猫。不需要任何图形学的知识,只需按照我们的步骤走,你就能够顺利完成你的作品。 整体流程 首先,我们将整个流程梳理成一个表格,帮助你更清晰地理解步骤: 接下来,我们会详细讲解每个步骤,并提供相应的代码。 https://blog.51cto.com/u_16175491/12657759
4.PythonTkinter详细基础教程:物联沃Python Tkinter详细基础教程: 目录 前言 模块导入 tkinter核心组件 基础架构 第一步 导入tk模块 第二步 获取TK对象 第三步 指定窗口大小位置 第四步 主窗口标题 第五步 显示主窗口 总和 1、Label 标签 基本属性 1.1 text,bg,font,fg 1.2 width,height,anchor,padx...https://www.iotword.com/21335.html
5.Python入门教程完整版(懂中文就能学会)pdf版+源码(讲义/笔记)电子书...Python客栈 广告 商业广告,理性选择 ↑ 回复“小白”获取必备资料 软件问题没解决?试试这里 零距离AI可以帮你高效完成AI问答、AI对话、提供软件相关教程以及解决生活中遇到的各种疑难杂症,还能帮助你进行AI写作、AI绘画等等,提高你的工作学习效率。 我要提问 ...https://www.jb51.net/books/672756.html
6....PhotoshopBeta24.7内置Ai绘图功能免费破解版附安装教程...3dMax教程 剪映3.3.0(电脑) Twinmotion Twinmotion PR2022 C4DR23 PS绘画 Blender3.3 UE5 酷家乐5.0 Blender3.5 Octane Render Corona9.0 CAD2022 CAD三维建模 AI绘画 AI室内设计 UGNX11.0 更多软件 默认排序? Patrick. 2023-07-16 移除工具无法使用,显示:“正在下载必须的组件。下载完成后,请稍后返回查看以使用...https://www.yutu.cn/softhtml/downsoft_8622.html
7.人工智能,丹青圣手,构建StableDiffusion本次我们全平台构建基于Stable-Diffusion算法的Webui可视化图形界面服务,基于本地模型来进行AI绘画操作。 本地安装Stable-Diffusion-Webui 如果系统之前安装过Python3.10或者使用过Pytorch深度学习框架,那么推荐直接本地安装Stable-Diffusion-Webui,因为Stable-Diffusion的核心依赖库也是Pytorch。 https://cloud.tencent.com/developer/news/1017825
8.Devlog非科班自学技术美术探索笔记装机:bilibili赵德柱装机教程 继续学习绘画基础(非常基础) 英语区:draw a box,ctrl+paint 中文区:K大V大 继续学习blender cg boost的zach小蓝车基础套件 继续进修本职工作内容... 学习记录都是实时放在dc频道里的,豆瓣这边就不再重发一遍了。 最近评论中有瓣友询问就业相关的问题,可惜楼主本人并不是业内人士,无法...https://www.douban.com/group/topic/288011432/
9.云代码Python在人工智能领域中有哪些具体应用 2024-04-20 Python会即将消亡吗 2024-04-20 在Python中如何将对象转换为另一种类型 2024-04-20 python ide编辑器怎么选择(PyCharm VS Code Atom) 2024-04-12 AI绘画副业变现赚钱有哪些方法 2024-04-12 注意力机制在AI绘画中如何提高图像理解和生成质量 ...https://yuncode.net/