使用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获取当前时间对应unix时间戳的方法
May 15 Python
利用Python如何实现数据驱动的接口自动化测试
May 11 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
对Python3之进程池与回调函数的实例详解
Jan 22 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
python如何实现复制目录到指定目录
Feb 13 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 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模板引擎SMARTY
2006/10/09 PHP
DOMXML函数笔记
2006/10/09 PHP
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
Javascript在IE和FireFox中的不同表现简析
2012/12/03 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
纯javascript实现四方向文本无缝滚动效果
2015/06/16 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
AngularJS 单元测试(一)详解
2016/09/21 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
vue-router history模式下的微信分享小结
2018/07/05 Javascript
下载糗事百科的内容_python版
2008/12/07 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
HTML5之SVG 2D入门5—颜色的表示及定义方式
2013/01/30 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
amazeui页面分析之登录页面的示例代码
2020/08/25 HTML / CSS
最新的大学生找工作自我评价
2013/09/29 职场文书
电工工作职责范本
2014/02/22 职场文书
《火烧云》教学反思
2014/04/12 职场文书
陕西导游词
2015/02/04 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
vue实现移动端div拖动效果
2022/03/03 Vue.js
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript