经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
使用PyQtGraph绘制精美的股票行情K线图的示例代码
来源:jb51  时间:2019/3/15 8:35:16  对本文有异议

pyqtgraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于其在内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架,因此它在大数据量的处理及快速显示方面有着天然的优势,非常适合于需要快速绘图更新、视频或实时交互性的操作场合,在数学、科学和工程领域都有着广泛的应用。

K线图介绍

对于股票交易者来讲,K线图是弄清股票一段时间走势的一种最基本的图形工具,K线分为阳线和阴线,阳线和阴线都包含了开盘价、收盘价、最高价和最低价,一般K线如下图所示:

当收盘价大于开盘价时,称为阳线,在图形上一般用红色表示,反之,当收盘价低于开盘价时,称为阴线,在图形上一般用绿色表示。由于其形状颇似一根根蜡烛,K线图有时也叫做蜡烛图。

  1. # -*- coding: utf-8 -*-
  2.  
  3. # Form implementation generated from reading ui file 'QWidget_plot.ui'
  4. #
  5. # Created by: PyQt4 UI code generator 4.11.4
  6. #
  7. # WARNING! All changes made in this file will be lost!
  8.  
  9. import sys
  10. reload(sys)
  11. sys.setdefaultencoding('utf-8')
  12. from PyQt4 import QtCore, QtGui
  13. import datetime
  14. import pyqtgraph as pg
  15. import tushare as ts
  16.  
  17. try:
  18. _fromUtf8 = QtCore.QString.fromUtf8
  19. except AttributeError:
  20. def _fromUtf8(s):
  21. return s
  22.  
  23. try:
  24. _encoding = QtGui.QApplication.UnicodeUTF8
  25. def _translate(context, text, disambig):
  26. return QtGui.QApplication.translate(context, text, disambig, _encoding)
  27. except AttributeError:
  28. def _translate(context, text, disambig):
  29. return QtGui.QApplication.translate(context, text, disambig)
  30.  
  31. class Ui_MainWindow(object):
  32. def setupUi(self, MainWindow):
  33. MainWindow.setObjectName(_fromUtf8("MainWindow"))
  34. MainWindow.resize(800, 600)
  35. self.centralwidget = QtGui.QWidget(MainWindow)
  36. self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
  37. self.verticalLayout_2 = QtGui.QVBoxLayout(self.centralwidget)
  38. self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout"))
  39. self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
  40. self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
  41. MainWindow.setCentralWidget(self.centralwidget)
  42. self.menubar = QtGui.QMenuBar(MainWindow)
  43. self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 31))
  44. self.menubar.setObjectName(_fromUtf8("menubar"))
  45. MainWindow.setMenuBar(self.menubar)
  46.  
  47. self.drawChart = DrawChart(ktype='D')
  48. self.verticalLayout_2.addWidget(self.drawChart.pyqtgraphDrawChart())
  49.  
  50. self.retranslateUi(MainWindow)
  51. QtCore.QMetaObject.connectSlotsByName(MainWindow)
  52.  
  53. def retranslateUi(self, MainWindow):
  54. MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
  55.  
  56. class DrawChart():
  57. 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'):
  58. self.code = code
  59. self.start = start
  60. self.end = end
  61. self.ktype = ktype
  62. self.data_list, self.t = self.getData()
  63.  
  64. def pyqtgraphDrawChart(self):
  65. try:
  66. self.item = CandlestickItem(self.data_list)
  67. 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('-', '/')}
  68. self.stringaxis = pg.AxisItem(orientation='bottom')
  69. self.stringaxis.setTicks([self.xdict.items()])
  70. self.plt = pg.PlotWidget(axisItems={'bottom': self.stringaxis}, enableMenu=False)
  71.  
  72. self.plt.addItem(self.item)
  73. # self.plt.showGrid(x=True, y=True)
  74.  
  75. return self.plt
  76. except:
  77. return pg.PlotWidget()
  78.  
  79. def getData(self):
  80. self.start = str(datetime.date.today() - datetime.timedelta(days=150))
  81. self.end = str(datetime.date.today() + datetime.timedelta(days=1))
  82. self.hist_data = ts.get_hist_data(self.code, self.start, self.end, self.ktype).sort_index()[-300:-1]
  83. data_list = []
  84. t = 0
  85. for dates, row in self.hist_data.iterrows():
  86. open, high, close, low, volume, price_change, p_change, ma5, ma10, ma20 = row[:10]
  87. datas = (t, open, close, low, high, volume, price_change, p_change, ma5, ma10, ma20)
  88. data_list.append(datas)
  89. t += 1
  90. return data_list, t
  91.  
  92. class CandlestickItem(pg.GraphicsObject):
  93. def __init__(self, data):
  94. pg.GraphicsObject.__init__(self)
  95. self.data = data
  96. self.generatePicture()
  97.  
  98. def generatePicture(self):
  99. self.picture = QtGui.QPicture()
  100. p = QtGui.QPainter(self.picture)
  101. p.setPen(pg.mkPen('w'))
  102. w = (self.data[1][0] - self.data[0][0]) / 3.
  103. prema5 = 0
  104. prema10 = 0
  105. prema20 = 0
  106. for (t, open, close, min, max, volume, price_change, p_change, ma5, ma10, ma20) in self.data:
  107. if open > close:
  108. p.setPen(pg.mkPen('g'))
  109. p.setBrush(pg.mkBrush('g'))
  110. else:
  111. p.setPen(pg.mkPen('r'))
  112. p.setBrush(pg.mkBrush('r'))
  113. p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max))
  114. p.drawRect(QtCore.QRectF(t - w, open, w * 2, close - open))
  115. if prema5 != 0:
  116. p.setPen(pg.mkPen('w'))
  117. p.setBrush(pg.mkBrush('w'))
  118. p.drawLine(QtCore.QPointF(t-1, prema5), QtCore.QPointF(t, ma5))
  119. prema5 = ma5
  120. if prema10 != 0:
  121. p.setPen(pg.mkPen('c'))
  122. p.setBrush(pg.mkBrush('c'))
  123. p.drawLine(QtCore.QPointF(t-1, prema10), QtCore.QPointF(t, ma10))
  124. prema10 = ma10
  125. if prema20 != 0:
  126. p.setPen(pg.mkPen('m'))
  127. p.setBrush(pg.mkBrush('m'))
  128. p.drawLine(QtCore.QPointF(t-1, prema20), QtCore.QPointF(t, ma20))
  129. prema20 = ma20
  130. p.end()
  131.  
  132. def paint(self, p, *args):
  133. p.drawPicture(0, 0, self.picture)
  134.  
  135. def boundingRect(self):
  136. return QtCore.QRectF(self.picture.boundingRect())
  137.  
  138. if __name__ == "__main__":
  139. import sys
  140. app = QtGui.QApplication(sys.argv)
  141. MainWindow = QtGui.QMainWindow()
  142. ui = Ui_MainWindow()
  143. ui.setupUi(MainWindow)
  144. MainWindow.show()
  145. sys.exit(app.exec_())
  146.  

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号