使用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 cookielib 登录人人网的实现代码
Dec 19 Python
python中私有函数调用方法解密
Apr 29 Python
Python 调用Java实例详解
Jun 02 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
Python中对数组集进行按行打乱shuffle的方法
Nov 08 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
Python 把序列转换为元组的函数tuple方法
Jun 27 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
设置jupyter中DataFrame的显示限制方式
Apr 12 Python
tensorflow模型转ncnn的操作方式
May 25 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
Python-openCV开运算实例
Jul 05 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修改NetBeans默认字体的大小
2013/07/02 PHP
php生成QRcode实例
2014/09/22 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
分享PHP守护进程类
2015/12/30 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
读jQuery之五(取DOM元素)
2011/06/20 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
Bootstrap modal 多弹窗之叠加关闭阴影遮罩问题的解决方法
2017/02/27 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
基于JavaScript实现百度搜索框效果
2020/06/28 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
2018/08/19 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
CSS3的resize属性使用初探
2015/09/27 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
感恩母亲节活动方案
2014/03/04 职场文书
yy生日主持词
2014/03/20 职场文书
2015年企业新年寄语
2014/12/08 职场文书
2015年调度员工作总结
2015/04/30 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL