摘要:可视化分析是做金融量化必备的技能,今天给大家分享一篇文章,使用Python,在PyQt5中借助PyQtGtaph绘制一个带有十字光标的股票价格走势K线图原文来源:州的先生。

2019年开年以来,A股行情不断走高,去年跌跌不休的日子总算看着像是过去了。不少股民纷纷解套走人,不少外场人士则被新闻媒体渲染的“A股大牛市来了”刺激得兴奋不已,生怕错过这一轮造富时机,恨不得马上卖房入场。

(截图来自于同花顺实时行情)

俗话说得好,股市秘笈千万条,看懂K线第一条。想研究股票,似乎总要研究K线。但是今天我们不研究K线,看K线那是股中人士的活儿。

对于刚刚解套的我来说,还是画画K线比较自在。

今天,我们将使用Python,在PyQt5中借助PyQtGtaph绘制一个带有十字光标的股票历史走势K线图。

一、创建图形界面窗口骨架

首先,我们来创建一个基础的图形界面。里面包含了:

  • 一个文本输入框,用于输入股票代码;
  • 一个下拉选择框,用于选择时间段;
  • 一个按钮,用于点击查询数据和生成K线图;
  • 一个空白图形,用于放置K线图;

通过如下代码进行创建:

  1. # 主窗口类
  2. class MainUi(QtWidgets.QMainWindow):
  3. def __init__(self):
  4. super().__init__()
  5. self.setWindowTitle("州的先生zmister.com A股股票历史走势K线图")
  6. self.main_widget = QtWidgets.QWidget() # 创建一个主部件
  7. self.main_layout = QtWidgets.QGridLayout() # 创建一个网格布局
  8. self.main_widget.setLayout(self.main_layout) # 设置主部件的布局为网格
  9. self.setCentralWidget(self.main_widget) # 设置窗口默认部件
  10. self.stock_code = QtWidgets.QLineEdit() # 创建一个文本输入框部件
  11. self.option_sel = QtWidgets.QComboBox() # 创建一个下拉框部件
  12. self.option_sel.addItem("近7天")
  13. self.option_sel.addItem("近30天")
  14. self.option_sel.addItem("近60天")
  15. self.option_sel.addItem("近180天")
  16. self.option_sel.addItem("近360天")
  17. self.que_btn = QtWidgets.QPushButton("查询") # 创建一个按钮部件
  18. self.k_widget = QtWidgets.QWidget() # 实例化一个widget部件作为K线图部件
  19. self.k_layout = QtWidgets.QGridLayout() # 实例化一个网格布局层
  20. self.k_widget.setLayout(self.k_layout) # 设置K线图部件的布局层
  21. self.k_plt = pg.PlotWidget() # 实例化一个绘图部件
  22. self.k_layout.addWidget(self.k_plt) # 添加绘图部件到K线图部件的网格布局层
  23. # 将上述部件添加到布局层中
  24. self.main_layout.addWidget(self.stock_code,0,0,1,1)
  25. self.main_layout.addWidget(self.option_sel,0,1,1,1)
  26. self.main_layout.addWidget(self.que_btn,0,2,1,1)
  27. self.main_layout.addWidget(self.k_widget,1,0,3,3)

运行程序,我们可以得到一个如下图所示的图形界面窗口:

接下来,我们创建一个K线图的图形绘制类,通过PyQt和PyQtGraph的绘图组件绘制K线图。

二、创建K线图绘制类

接着创建一个名为CandlestickItem()的类,其继承于pyqtgraph的GraphicsObject类。

通过QPicture和QPainter进行绘图操作实现K线图的绘制。具体代码如下所示:

  1. # K线图绘制类
  2. class CandlestickItem(pg.GraphicsObject):
  3. # 州的先生zmister.com
  4. def __init__(self, data):
  5. pg.GraphicsObject.__init__(self)
  6. self.data = data # data里面必须有以下字段: 时间, 开盘价, 收盘价, 最低价, 最高价
  7. self.generatePicture()
  8. def generatePicture(self):
  9. self.picture = QtGui.QPicture() # 实例化一个绘图设备
  10. p = QtGui.QPainter(self.picture) # 在picture上实例化QPainter用于绘图
  11. p.setPen(pg.mkPen('w')) # 设置画笔颜色
  12. w = (self.data[1][0] - self.data[0][0]) / 3.
  13. for (t, open, close, min, max) in self.data:
  14. print(t, open, close, min, max)
  15. p.drawLine(QtCore.QPointF(t, min), QtCore.QPointF(t, max)) # 绘制线条
  16. if open > close: # 开盘价大于收盘价
  17. p.setBrush(pg.mkBrush('g')) # 设置画刷颜色为绿
  18. else:
  19. p.setBrush(pg.mkBrush('r')) # 设置画刷颜色为红
  20. p.drawRect(QtCore.QRectF(t - w, open, w * 2, close - open)) # 绘制箱子
  21. p.end()
  22. def paint(self, p, *args):
  23. p.drawPicture(0, 0, self.picture)
  24. def boundingRect(self):
  25. return QtCore.QRectF(self.picture.boundingRect())

这个类用于生成K线图的图形,其接收一个数组其中包含时间、开盘价、收盘价、最低价和最高价的列表,我们只需要将其添加到PyQtGraph的绘图方法中,就可以生成具体的K线图图形。

下面,我们来完善具体的K线图绘制方法。

三、生成K线图

在创建好K线图绘制类之后,我们来实现K线图的具体绘制工作。我们的数据来源于tushare这个第三方库提供的A股个股历史数据。获取数据之后,我们对数据进行加工,处理成CandlestickItem()类接受的数据格式,传入给CandlestickItem()。

在得到K线图之后,我们将其添加到之前实例化好的PlotWidget()部件self.k_plt中,并对图形添加设置其他属性,其代码如下所示:

  1. def plot_k_line(self,code=None,start=None,end=None):
  2. self.data = ts.get_hist_data(code=code, start=start, end=end).sort_index()
  3. y_min = self.data['low'].min()
  4. y_max = self.data['high'].max()
  5. data_list = []
  6. d = 0
  7. for dates, row in self.data.iterrows():
  8. # 将时间转换为数字
  9. date_time = datetime.datetime.strptime(dates, '%Y-%m-%d')
  10. # t = date2num(date_time)
  11. open, high, close, low = row[:4]
  12. datas = (d, open, close, low, high)
  13. data_list.append(datas)
  14. print(datas)
  15. d += 1
  16. self.axis_dict = dict(enumerate(self.data.index))
  17. # 州的先生 zmister.com
  18. axis_1 = [(i, list(self.data.index)[i]) for i in range(0, len(self.data.index), 3)] # 获取日期值
  19. axis_2 = [(i, list(self.data.index)[i]) for i in range(0, len(self.data.index), 5)]
  20. axis_3 = [(i, list(self.data.index)[i]) for i in range(0, len(self.data.index), 8)]
  21. axis_4 = [(i, list(self.data.index)[i]) for i in range(0, len(self.data.index), 10)]
  22. axis_5 = [(i, list(self.data.index)[i]) for i in range(0, len(self.data.index), 30)]
  23. stringaxis = pg.AxisItem(orientation='bottom') # 创建一个刻度项
  24. stringaxis.setTicks([axis_5, axis_4, axis_3, axis_2, axis_1, self.axis_dict.items()]) # 设置X轴刻度值
  25. self.k_plt.getAxis("bottom").setTicks([axis_5, axis_4, axis_3, axis_2, axis_1, self.axis_dict.items()])
  26. self.k_plt.plotItem.clear() # 清空绘图部件中的项
  27. item = CandlestickItem(data_list) # 生成蜡烛图数据
  28. self.k_plt.addItem(item, ) # 在绘图部件中添加蜡烛图项目
  29. self.k_plt.showGrid(x=True, y=True) # 设置绘图部件显示网格线
  30. self.k_plt.setYRange(y_min,y_max)
  31. self.k_plt.setLabel(axis='left', text='指数') # 设置Y轴标签
  32. self.k_plt.setLabel(axis='bottom', text='日期') # 设置X轴标签
  33. self.label = pg.TextItem() # 创建一个文本项
  34. self.k_plt.addItem(self.label) # 在图形部件中添加文本项
  35. self.vLine = pg.InfiniteLine(angle=90, movable=False, ) # 创建一个垂直线条
  36. self.hLine = pg.InfiniteLine(angle=0, movable=False, ) # 创建一个水平线条
  37. self.k_plt.addItem(self.vLine, ignoreBounds=True) # 在图形部件中添加垂直线条
  38. self.k_plt.addItem(self.hLine, ignoreBounds=True) # 在图形部件中添加水平线条

这个方法将是我们点击【查询】按钮,对点击信号进行处理时需要调用的方法,它是在图形界面窗口中显示K线图的关键。

我们继续创建一个方法,用来调用plotkline()方法,并将其连接到【查询】按钮的点击信号上:

  1. # 查询按钮信号槽
  2. def query_slot(self):
  3. try:
  4. self.que_btn.setEnabled(False)
  5. self.que_btn.setText("查询中…")
  6. code = self.stock_code.text()
  7. date_sel = self.option_sel.currentText()[1:-1]
  8. start_date = datetime.datetime.today()-datetime.timedelta(days=int(date_sel)+1)
  9. start_date_str = datetime.datetime.strftime(start_date,"%Y-%m-%d")
  10. end_date = datetime.datetime.today()-datetime.timedelta(days=1)
  11. end_date_str = datetime.datetime.strftime(end_date,"%Y-%m-%d")
  12. print(code,start_date_str,end_date_str)
  13. self.plot_k_line(code=code,start=start_date_str,end=end_date_str)
  14. self.que_btn.setEnabled(True)
  15. self.que_btn.setText("查询")
  16. except Exception as e:
  17. print(traceback.print_exc())

【查询】按钮点击信号绑定:

  1. self.que_btn.clicked.connect(self.query_slot) # 绑定按钮点击信号

这样,我们运行代码,就可以通过输入股票代码和选择时间间隔来查看对应股票的动态历史K线图了,如下动图所示:

四、绘制十字光标

上面的图形界面程序生成了股票的K线图,但是我们却不能方便地查看到具体一天的价格变动,一个十字光标的鼠标指示必需的,我们接着来实现它。

  1. # 响应鼠标移动绘制十字光标
  2. def print_slot(self, event=None):
  3. if event is None:
  4. print("事件为空")
  5. else:
  6. pos = event[0] # 获取事件的鼠标位置
  7. try:
  8. # 如果鼠标位置在绘图部件中
  9. if self.k_plt.sceneBoundingRect().contains(pos):
  10. mousePoint = self.k_plt.plotItem.vb.mapSceneToView(pos) # 转换鼠标坐标
  11. index = int(mousePoint.x()) # 鼠标所处的X轴坐标
  12. pos_y = int(mousePoint.y()) # 鼠标所处的Y轴坐标
  13. if -1 < index < len(self.data.index):
  14. # 在label中写入HTML
  15. self.label.setHtml(
  16. "<p style='color:white'><strong>日期:{0}</strong></p><p style='color:white'>开盘:{1}</p><p style='color:white'>收盘:{2}</p><p style='color:white'>最高价:<span style='color:red;'>{3}</span></p><p style='color:white'>最低价:<span style='color:green;'>{4}</span></p>".format(
  17. self.axis_dict[index], self.data['open'][index], self.data['close'][index],
  18. self.data['high'][index], self.data['low'][index]))
  19. self.label.setPos(mousePoint.x(), mousePoint.y()) # 设置label的位置
  20. # 设置垂直线条和水平线条的位置组成十字光标
  21. self.vLine.setPos(mousePoint.x())
  22. self.hLine.setPos(mousePoint.y())
  23. except Exception as e:
  24. print(traceback.print_exc())

这个方法将为我们的图形实时绘制生成一个十字光标和一个显示鼠标所在坐标日期的数据指标。

我们需要将其连接到self.k_plt这个图形部件的信号事件上,使得鼠标移动时可以实时响应:

  1. # 州的先生 https://zmister.com
  2. self.move_slot = pg.SignalProxy(self.k_plt.scene().sigMouseMoved, rateLimit=60, slot=self.print_slot)

现在运行代码,我们就可以看到生成的K线图有十字光标实时显示鼠标所在坐标日期的股票数据了。如下动图所示:

java实现k线图自动化_Python秒绘交互式股票K线图!这就是Python的优势!相关推荐

  1. python画k线图_使用Matplotlib轻松绘制股票K线图

    K线图是看懂股票走势的最基本知识,K线分为阴线和阳线,阴线和阳线都包含了最低价.开盘价.最高价和收盘价,一般的K线如下图所示: 度娘说:K线图源于日本德川幕府时代(1603-1867年),被当时日本米 ...

  2. python识图自动化_Python自动化测试-验证识别

    一.准备 1.环境基础:Python3 + pycharm + selenium + request + Pillow,chrome浏览器的驱动程序 1)python:这里用的是Python3.7的, ...

  3. python从tushare获取数据_python调用tushare获取股票月线数据

    接口:monthly 描述:获取A股月线数据 限量:单次最大3700,总量不限制 积分:用户需要至少300积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare库下载和初始化教程,请查阅 ...

  4. C#+WPF 股票K线制作(包含时间/ 开盘价/ 最高价/最低价/ 收盘价 / 成交量)

    C#+WPF 股票K线制作 股票对象 ViewModel XAML前端 项目最终效果展示 此项目安全,主要是涉及 AmCharts.Windows.Stock控件的使用,核心代码如下 股票对象 usi ...

  5. 符号说明表怎么做_电气新手搞不定电气识图怎么办?别慌!8套电气识图教程,秒上手...

    一个电气新手来说第一次看电气图,普遍会存在看不懂,搞不清设计图怎么看这样的一个问题!那么要怎么进行解决呢?第一次看图电气图需要做哪些准备工作呢? 要做到会看图和看懂图,首先应掌握识图的基本知识,即应当 ...

  6. java绘制均线图_利用JFreeChart绘制股票K线图完整解决方案

    因为工作的需要,接触了一些股票图形绘制类的工作,其中最主要的还是股票K线图的绘制了,如果利用编程语言最底层的图形绘制方法去绘制这类图形,如果对编程语言不是特别熟悉的话,一般是有很大的困难的,通过在网上 ...

  7. python蜡烛图预测_python tushare股票K线蜡烛图绘制

    序言:学着学着就学到股票图形绘制了,尝试了下,入门蛮简单的,后面就不知道了,现在好像mplfinance更换了新版本,老版本不支持了.以下代码能实现单个股票K线蜡烛图图形输出,不过我用的是tushar ...

  8. python能画k线图吗_python画k线图(一天的k线图怎么画)

    1.大智慧软件在日线窗口的左上角标有主图的公式名称,(如ma sar bbi )等, 如果不是ma指标,请输入ma,回车.2.如果输入ma后还是没有均线,请按 f7 键,弹出 最好能举个例子的.非常感 ...

  9. java+web+股票图表_基于Echarts的股票K线图展示

    一.概述 这是一个简单的股票K线图展示,利用echarts第三方进行配置,用户可以进行放大缩小查看K线图,还可进行拖拽. 二.演示效果 三.目录结构 其中dist文件夹是echart插件,jquery ...

  10. python画k线图_Python+pyqtgraph:跟我学如何绘制股票K线图

    引言 pyqtgraph是Python平台上一种功能强大的2D/3D绘图库,相对于matplotlib库,由于其在内部实现方式上,使用了高速计算的numpy信号处理库以及Qt的GraphicsView ...

最新文章

  1. 99%的用户都选择用它来恢复丢失的照片
  2. python生成柱状图 不显示_python – Matplotlib图表不显示在PyCharm中
  3. 三思笔记_使用反射前先三思
  4. 在Finder标题栏上显示完整路径
  5. 将M进制的数转换为N进制的数(java)
  6. 二叉搜索树,和红黑树,
  7. java多线程优秀开源项目_github比较热门的Java开源项目
  8. JavaScript实现在线Cron表达式生成器、预览工具 -toolfk程序员在线工具网
  9. java中继承applet类_Java - 33 Java Applet基础
  10. 【华人学者风采】聂建云 蒙特利尔大学
  11. 计算机网络和智能家居,智能家居与传统智能家居到底有什么区别
  12. 寒江独钓:键盘的过滤 学习笔记
  13. 使用xmarks同步 chrome ie firefox safari书签
  14. 一个点击率10万+的恶搞程序送给大家!
  15. 360浏览器打开html不能正常显示图片,“网页图片显示异常,网页图片、验证码显示不正常,经常显示不全或根本不显示”的解决方案...
  16. swagger换新UI
  17. chmod的使用 czy:czy 文件名
  18. 外卖项目05---套餐管理业务开发
  19. 如何用微信编辑器排版出美观的图文消息
  20. 2016年,续航新能量

热门文章

  1. 命令行方式登录PostgreSQL、创建用户和数据库并赋权
  2. 用户空间缺页异常pte_handle_fault()分析--(下)--写时复制
  3. 北京市土壤侵蚀强度空间分布数据
  4. java中的T extends Comparable ? super T
  5. hadoop SequenceFile详解
  6. mllib线性回归GeneralizedLinearModel GeneralizedLinearAlgorithm源码解析
  7. css文本行高是哪个属性_CSS-常用文本属性
  8. 软件页面安全性测试,软件Web安全性测试—SQL注入
  9. patran如何看屈曲因子_如何真正有效地改善驼背?
  10. 解决方案:如何防止数据重复插入