本文所涉及代码已全部打包上传,需要可以到文章末尾查看获取方式,免费,仅做学习交流!!!
股票客户端软件
2024/05,本文主要内容如下:
- 使用python requests爬取东方财富官网数据。
- 将爬取的数据通过sqlalchemy写入sqlite数据库。
- 使用pyqt5写界面进行显示所有爬取的数据列表,以及历史K线信息。
- 如果本地数据库存在,则检查是否是最新数据,进行更新追加数据,否则直接显示本地数据。
- 可以根据时间段,查询显示K线组合。
- 后续计划:会不断完善,最终目标是做出一个简单的股票查看客户端,并能够根据条件查询选股。
- 本系列所有源码均无偿分享,仅作交流无其他,供大家参考。
python依赖环境如下:
conda create --name xuan_gu python=3.9 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda remove --name xuan_gu --all
conda activate xuan_gu
pip install PyQt5==5.15.10 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pyqtgraph==0.13.6 -i https://pypi.tuna.tsinghua.edu.cn/simple
#python -m pyqtgraph.examples 查看图形化的pyqtgraph示例
pip install requests==2.31.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pandas==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install jsonpath==0.8.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sqlalchemy==2.0.30 -i https://pypi.tuna.tsinghua.edu.cn/simple
1. 爬取数据并入库
可参考我之前写的文章,目前爬取的数据包括:
- 获取所有的股票基本名称、市值等
- 获取股票的历史k线
【爬虫】爬取A股数据写入数据库(一)
【爬虫】爬取A股数据写入数据库(二)
【爬虫】爬取股票历史K线数据写入数据库(三)
2. 界面逻辑
- 读取数据库填充左侧列表
- 点击左侧列表,查询本地数据库中的日期,如果不是最新日期,则爬取最新的K线入库并显示
- 时间可筛选K线显示
- 光标定位,会将信息提取到右上角显示
主K线逻辑如下所示:
"""
股票软件用到的 股票K线图画板
class CandlestickItem: K线图绘制的封装类: 绘制K线图
"""
from PyQt5 import QtWidgets, QtCore
import pyqtgraph as pg
from pyqtgraph.Qt import QtGui
from K_UI.base_widget import CandlestickItem
class K_Widget(QtWidgets.QWidget):
signal_TextShow = QtCore.pyqtSignal(str) # 定义信号
def __init__(self):
super().__init__()
self.init_data()
self.init_ui()
def init_data(self):
self.cur_code = 0
self.cur_name = ''
self.cur_candle_data = []
pass
def init_ui(self):
self.pw = pg.PlotWidget()
self.x_axis = self.pw.getAxis('bottom')
self.x_axis.setHeight(50) # 设置X轴的高度
self.x_axis.setStyle(tickFont=QtGui.QFont("Arial", 10))
self.pw.setMouseEnabled(x=True, y=False)
self.pw.setAutoVisible(x=False, y=True)
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.pw)
self.setLayout(layout)
self.pw.scene().sigMouseMoved.connect(self.mouseMoved)
def caculate_and_show_data(self, code, name, candle_data):
'''
candle_data =
[(1/2/3, '2024-05-09', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)]
1/2/3是编号, 从0开始
1 2 3 4 5 6 7 8 9 10
开盘, 收盘, 最高, 最低, 成交量, 成交额, 振幅, 涨跌幅, 涨跌额, 换手率
'''
self.pw.clear()
self.cur_code = code
self.cur_name = name
self.cur_candle_data = candle_data
# 自定义X轴标签
x_labels, x_show_labels = [],[] # 格式为 (位置, 标签字符串), 例如: [(0, 2025-05-10), (1, 2025-05-11)]
for (t, time, open, close, max, min, cjl, cje, zf, zdf, zde, hsl) in candle_data:
x_labels.append((t, time))
# 获取自定义的X轴实例 并设置自定义标签 每间隔6个x轴的单位,显示x轴的时间串
for i, label in enumerate(x_labels):
if i % 6 == 0:
lab_x = f'{label[1][:4]}\n{label[1][-5:]}'
x_show_labels.append((i, lab_x))
# x_show_labels.append((i, label[1]))
self.x_axis.setTicks([x_show_labels])
self.vLine = pg.InfiniteLine(angle=90, movable=False)
self.hLine = pg.InfiniteLine(angle=0, movable=False)
# self.label_tip = pg.TextItem()
self.pw.addItem(self.vLine, ignoreBounds=True)
self.pw.addItem(self.hLine, ignoreBounds=True)
# self.pw.addItem(self.label_tip, ignoreBounds=True)
self.vb = self.pw.getViewBox()
candle_fixed_target = CandlestickItem(candle_data)
self.pw.addItem(candle_fixed_target)
def mouseMoved(self, evt):
'''
self.cur_candle_data =
[(0/1(编号0开始), '2024-05-09', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)]
1 2 3 4 5 6 7 8 9 10
开盘, 收盘, 最高, 最低, 成交量, 成交额, 振幅, 涨跌幅, 涨跌额, 换手率
'''
pos = evt
if self.pw.sceneBoundingRect().contains(pos):
if hasattr(self, 'vb'):
mousePoint = self.vb.mapSceneToView(pos)
index = int(mousePoint.x())
# print('mouse x=', mousePoint.x(), 'mouse y=', mousePoint.y())
# mouse x= 83.73188814580678 mouse y= 12.14799677228214
if index > 0 and index < len(self.cur_candle_data):
zdf = self.cur_candle_data[index][9]
y = f"{mousePoint.y():.2f}"
html_str = f"<span style='font-size: 12pt'>【{self.cur_name}】 " \
f"<span style='font-size: 12pt'>({self.cur_candle_data[index][1]})</span> " \
f"<span style='font-size: 12pt'>价格: {y}</span> "
if int(zdf) > 0:
html_str += f"<span style='color: red'>涨跌幅: {zdf}%</span> "
else:
html_str += f"<span style='color: green'>涨跌幅: {zdf}%</span> "
self.signal_TextShow.emit(html_str)
# self.label_text.setHtml(html_str)
# self.label_tip.setPos(mousePoint.x(), mousePoint.y())
pass
self.vLine.setPos(mousePoint.x())
self.hLine.setPos(mousePoint.y())
pass
结束语
由于本人能力有限,难免有疏漏之处。
文中源码文件【获取方式】:关注公众号:利哥AI实例探险
给公众号发送 爬虫股票客户端 获取下载方式,免费,无套路,只要关注!!!
原文链接如下:
【爬虫】爬取股票数据写入数据库并显示(四)