使用PyQtGraph绘制精美的股票行情K线图的示例代码


Posted in Python onMarch 14, 2019

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_())

使用PyQtGraph绘制精美的股票行情K线图的示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中变量交换的例子
Aug 25 Python
python套接字流重定向实例汇总
Mar 03 Python
Python字符串拼接、截取及替换方法总结分析
Apr 13 Python
python正则表达式的使用
Jun 12 Python
Java及python正则表达式详解
Dec 27 Python
Python迭代器定义与简单用法分析
Apr 30 Python
Python解析并读取PDF文件内容的方法
May 08 Python
python处理数据,存进hive表的方法
Jul 04 Python
Python标准库shutil用法实例详解
Aug 13 Python
新手入门Python编程的8个实用建议
Jul 12 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
Aug 20 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 #Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 #Python
Python通过TensorFlow卷积神经网络实现猫狗识别
Mar 14 #Python
python3实现钉钉消息推送的方法示例
Mar 14 #Python
详解Python做一个名片管理系统
Mar 14 #Python
在Python中使用Neo4j的方法
Mar 14 #Python
浅谈Python中eval的强大与危害
Mar 13 #Python
You might like
深思 PHP 数组遍历的差异(array_diff 的实现)
2008/03/23 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
php自定义apk安装包实例
2014/10/20 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
javascript中的__defineGetter__和__defineSetter__介绍
2014/08/15 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
node.js(express)中使用Jcrop进行图片剪切上传功能
2017/04/21 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
一文让你彻底搞清楚javascript中的require、import与export
2017/09/24 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
整理Python中的赋值运算符
2015/05/13 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
基于Python实现文件大小输出
2016/01/11 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python操作csv文件实例详解
2017/07/31 Python
R vs. Python 数据分析中谁与争锋?
2017/10/18 Python
python元组的概念知识点
2019/11/19 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
基层党组织整改方案
2014/10/25 职场文书
复试通知单模板
2015/04/24 职场文书
国情备忘录观后感
2015/06/04 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android