使用PyQtGraph绘制精美的股票行情K线图的示例代码
作者:otter1010 发布时间:2023-12-05 11:58:21
标签:PyQtGraph,K线图
pyqtgraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于其在内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架,因此它在大数据量的处理及快速显示方面有着天然的优势,非常适合于需要快速绘图更新、视频或实时交互性的操作场合,在数学、科学和工程领域都有着广泛的应用。
K线图介绍
对于股票交易者来讲,K线图是弄清股票一段时间走势的一种最基本的图形工具,K线分为阳线和阴线,阳线和阴线都包含了开盘价、收盘价、最高价和最低价,一般K线如下图所示:
当收盘价大于开盘价时,称为阳线,在图形上一般用红色表示,反之,当收盘价低于开盘价时,称为阴线,在图形上一般用绿色表示。由于其形状颇似一根根蜡烛,K线图有时也叫做蜡烛图。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'QWidget_plot.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from PyQt4 import QtCore, QtGui
import datetime
import pyqtgraph as pg
import tushare as ts
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout_2 = QtGui.QVBoxLayout(self.centralwidget)
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout"))
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 31))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.drawChart = DrawChart(ktype='D')
self.verticalLayout_2.addWidget(self.drawChart.pyqtgraphDrawChart())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
class DrawChart():
def __init__(self, code='sz50', start=str(datetime.date.today() - datetime.timedelta(days=200)), end=str(datetime.date.today() + datetime.timedelta(days=1)), ktype='D'):
self.code = code
self.start = start
self.end = end
self.ktype = ktype
self.data_list, self.t = self.getData()
def pyqtgraphDrawChart(self):
try:
self.item = CandlestickItem(self.data_list)
self.xdict = {0: str(self.hist_data.index[0]).replace('-', '/'), int((self.t + 1) / 2) - 1: str(self.hist_data.index[int((self.t + 1) / 2)]).replace('-', '/'), self.t - 1: str(self.hist_data.index[-1]).replace('-', '/')}
self.stringaxis = pg.AxisItem(orientation='bottom')
self.stringaxis.setTicks([self.xdict.items()])
self.plt = pg.PlotWidget(axisItems={'bottom': self.stringaxis}, enableMenu=False)
self.plt.addItem(self.item)
# self.plt.showGrid(x=True, y=True)
return self.plt
except:
return pg.PlotWidget()
def getData(self):
self.start = str(datetime.date.today() - datetime.timedelta(days=150))
self.end = str(datetime.date.today() + datetime.timedelta(days=1))
self.hist_data = ts.get_hist_data(self.code, self.start, self.end, self.ktype).sort_index()[-300:-1]
data_list = []
t = 0
for dates, row in self.hist_data.iterrows():
open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20 = row[:10]
datas = (t, open, close, low, high, volume, price_change, p_change, ma5, ma10, ma20)
data_list.append(datas)
t += 1
return data_list, t
class CandlestickItem(pg.GraphicsObject):
def __init__(self, data):
pg.GraphicsObject.__init__(self)
self.data = data
self.generatePicture()
def generatePicture(self):
self.picture = QtGui.QPicture()
p = QtGui.QPainter(self.picture)
p.setPen(pg.mkPen('w'))
w = (self.data[1][0] - self.data[0][0]) / 3.
prema5 = 0
prema10 = 0
prema20 = 0
for (t, open, close, min, max, volume, price_change, p_change, ma5, ma10, ma20) in self.data:
if open > close:
p.setPen(pg.mkPen('g'))
p.setBrush(pg.mkBrush('g'))
else:
p.setPen(pg.mkPen('r'))
p.setBrush(pg.mkBrush('r'))
p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
p.drawRect(QtCore.QRectF(t - w, open, w * 2, close - open))
if prema5 != 0:
p.setPen(pg.mkPen('w'))
p.setBrush(pg.mkBrush('w'))
p.drawLine(QtCore.QPointF(t-1, prema5), QtCore.QPointF(t, ma5))
prema5 = ma5
if prema10 != 0:
p.setPen(pg.mkPen('c'))
p.setBrush(pg.mkBrush('c'))
p.drawLine(QtCore.QPointF(t-1, prema10), QtCore.QPointF(t, ma10))
prema10 = ma10
if prema20 != 0:
p.setPen(pg.mkPen('m'))
p.setBrush(pg.mkBrush('m'))
p.drawLine(QtCore.QPointF(t-1, prema20), QtCore.QPointF(t, ma20))
prema20 = ma20
p.end()
def paint(self, p, *args):
p.drawPicture(0, 0, self.picture)
def boundingRect(self):
return QtCore.QRectF(self.picture.boundingRect())
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
来源:https://blog.csdn.net/otter1010/article/details/83719709


猜你喜欢
- 在MySQL中,A LEFT JOIN B join_condition执行过程如下:· 根据表A和A依赖的所有表设置表B。· 根据LEFT
- 偶然发现linux系统附带的一个数独游戏,打开玩了几把。无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了。于是就打算借助计算机的强
- 在之前介绍PyQtGraph的文章中,我们都是一次性的获取数据并将其绘制为图形。然而在很多场景中,我们都需要对实时的数据进行图形化展示,比如
- 1.什么是Appiumappium是一个开源的测试自动化框架,可以与原生的、混合的和移动的web应用程序一直使用。它使用WebDriver协
- 我设计第一篇网页的时候,就遇到了字体的设置问题。我发现如果用软件约定的字体大小,则显示效果会很难看的。我是用FrontPage2000作网页
- 1.having 子句的用法 having 子句对 group by 子句所确定的行组进行控制,having 子句条件中只允许涉及常量,聚组
- isnull()Null 值指出变量不包含有效数据。Null 与 Empty 不同,后者指出变量未经初始化。Null 与零长度字符串 (&q
- <html> <head> <style type="text/css"> * {
- Python写倒序输出(任意位数)倒序输出数字这种方法最后输出的是字符而不是数字x=int(input('请输入任意一个数字:
- 父组件处理:<template> <div class="wrap">
- 大数据一般是在“云”上玩的,但“云”都是要钱的,而且数据上上下下的也比较麻烦。所以,在本地电脑上快速处理数据的技能还是要的。pandas在比
- 1、表的主键、外键必须有索引;2、数据量超过300的表应该有索引;3、经常与其他表进行连接的表,在连接字段上应该建立索引;4、经常出现在Wh
- 1:django-admin.py startproject 项目名2:cd 项目名3:修改setting.py(1):
- 本文实例为大家分享了python批量转换图片为黑白的具体代码,供大家参考,具体内容如下用到的库:OpenCV、osimport cv2imp
- 说明Python语言中列表(List)与其他语言的数组(Array)类似,是一种有序的集合数据结构,Python List可支持各种数据类型
- python excel文件(.xls文件)如何处理xlrd 用于读取文件,xlwt 用于写入文件,xlutils 是两个工具包的桥梁,也就
- 1、汇总统计介绍几个聚集函数有多少名学生SELECT COUNT(*) FROM student;SELECT COUNT(1) FROM
- 这几天正在为压缩代码的事情所困扰,大家也可以看见,我的博客顶端有两个在线的压缩工具,但在实际应用过程中,除了CSS的压缩比较满意外,JS的压
- 当你第一次在机器上安装MySQL时,mysql数据库中的授权表是这样初始化的:你可以从本地主机(localhost)上以root连接而不指定
- 本篇文章将在项目中引入 typescript,以及手动搭建一个用于测试组件库组件 Vue3 项目因为我们是使用 Vite+Ts 开发的是 V