python股票量化交易(11)---使用pyqt5构建股票交易软件主页

简介: python股票量化交易(11)---使用pyqt5构建股票交易软件主页

前言


在前面10篇博文中,我们详细介绍了各种股票图形的绘制以及股票的预测算法,但是有一点非常的不方便,就是每次查看某个股票的数据,我们还需要将代码替换或者更改,这样势必造成额外的时间浪费,那么怎么办呢?


答案很简单,我们直接自己开发一个股票行情软件,自己获取数据自己查看。这样,每次只要更改股票的代码就能统一的刷新数据并展示出来,这样就非常便捷方便了。而构建界面博主推荐使用pyqt5,毕竟底层用的就是Qt技术,目前桌面的开发中,性能上还是Qt最好。


构建界面的整体框架


首先,我们需要构建股票交易软件的整体框架,代码如下所示:

import sys
import qdarkstyle
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyFrom(QMainWindow):
    def __init__(self, parent=None):
        super(MyFrom, self).__init__(parent=parent)
        self.setWindowTitle('星辰股票行情软件')
        self.resize(1100, 100)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    myUI = MyFrom()
    myUI.setWindowFlag(Qt.WindowMinimizeButtonHint)  # 禁止放大界面
    myUI.setFixedSize(myUI.width(), myUI.height())  # 静止拖拽放大界面
    myUI.show()
    sys.exit(app.exec_())


这里,我们设置了股票软件的名称、主题以及软件界面的大小。、但是我们都知道,按照前面的各种股票走势图,单个界面肯定是容不下这么多图形的,那么怎么办?


其实,pyqt5给我们提供了标签页,通过上面标签的切换,就能完整的切换界面而不必跳转界面,下面我们来实现整体的标签。

class MyFrom(QMainWindow):
    def __init__(self, parent=None):
        //...代码在上面
        self.init()
    def init(self):
        self.qTableWidget = QTabWidget()
        self.homeTab = QWidget()
        self.kTab2 = QWidget()
        self.otherTab = QWidget()
        self.qTableWidget.addTab(self.homeTab, "主页")
        self.qTableWidget.addTab(self.kTab2, "K线图")
        self.qTableWidget.addTab(self.otherTab, "龙虎榜")
        self.setCentralWidget(self.qTableWidget)


这里,我们创建了QTabWidget标签页,同时设置了子标签页的名称,并将标签页设置到主界面之上。运行之后,显示的效果如下图所示:



主页顶部


整体框架雏形用上面的代码就基本就完成了。下面,我们就需要依次来填充这些子标签的页面。


首先,我们需要实现我们的主页。对于一般的股票软件来说,都有各种大盘的指数,比如上证,沪深,创业板块的指数显示,也有单个股票的走势图,还有该股票的交易详情数据等等等等。所以,这里我们先来布局模型,这里使用QGridView将界面划分成网格进行布局。

class MyFrom(QMainWindow):
    def init(self):
      //...上面的代码
        self.init_hometab()
    def init_hometab(self):
        self.grid = QGridLayout()
        self.grid.setSpacing(5)
        ft = QFont()
        ft.setPointSize(26)
        ft.setBold(True)
        self.share_params = [QLabel() for x in range(10)]
        self.grid.addWidget(self.share_params[0], 0, 0, 2, 3)
        self.share_params[0].setFont(ft)
        self.share_params[0].setStyleSheet("color:yellow")
        self.grid.addWidget(self.share_params[1], 0, 3, 1, 2)
        self.share_params[1].setFont(ft)
        self.grid.addWidget(self.share_params[2], 0, 5)
        self.grid.addWidget(self.share_params[3], 0, 6)
        self.grid.addWidget(self.share_params[4], 0, 7)
        self.grid.addWidget(self.share_params[5], 1, 3)
        self.grid.addWidget(self.share_params[6], 1, 4)
        self.grid.addWidget(self.share_params[7], 1, 5)
        self.grid.addWidget(self.share_params[8], 1, 6)
        self.grid.addWidget(self.share_params[9], 1, 7)
        self.shareThread = ShareThread()
        self.shareThread.setValue("sh600690")
        self.shareThread._signal.connect(self.shareThread_callbacklog)
        self.shareThread.start()
        self.qListOne = ['上证指数', '深证成指', '创业板指', '科创50', '上证50', '中证500', '沪深300']  # 添加的数组数据
        self.plateThread = plateThread()
        self.plateThread._signal.connect(self.plateThread_callbacklog)
        self.plateThread.start()
        self.homeTab.setLayout(self.grid)
    def shareThread_callbacklog(self, shareList):
        isloss = float(shareList[5])
        i = 0
        for share_label, qlist in zip(self.share_params, shareList):
            if i == 1:
                share_label.setText(str(qlist))
                if isloss >= 0:
                    share_label.setStyleSheet("color:red")
                else:zh
                    share_label.setStyleSheet("color:rgb(0, 255, 0)")
            else:
                share_label.setText(str(qlist))
            i += 1
    def plateThread_callbacklog(self, urlList):
        i = 0
        one_QLabel = [QLabel() for x in range(7)]
        two_QLabel = [QLabel() for x in range(7)]
        for o_label, t_label, qlist, m_name in zip(one_QLabel, two_QLabel, urlList, self.qListOne):
            temp = qlist.split('"')[1].split(',')
            isloss = float(str(round(float(temp[2]), 2)))
            if isloss >= 0:
                o_label.setStyleSheet("color:red;font-size:14px")
                t_label.setStyleSheet("color:red;font-size:14px")
            else:
                o_label.setStyleSheet("color:rgb(0, 255, 0);font-size:14px")
                t_label.setStyleSheet("color:rgb(0, 255, 0);font-size:14px")
            o_label.setText(m_name)
            self.grid.addWidget(o_label, 0, 8 + i, 1, 1)
            t_label.setText(str(round(float(temp[1]), 2)))
            self.grid.addWidget(t_label, 1, 8 + i, 1, 1)
            i += 1


至于界面的元素,博主就不多说了。这里有2个线程,一个用户获取股票的基本数据,一个用户获取板块的指数,获取股票数据的线程类如下:

import time
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
import requests
from utils import LYJutils
#股票详细数据获取线程
class ShareThread(QtCore.QThread):
    _signal = pyqtSignal(list)
    def __init__(self):
        super(ShareThread, self).__init__()
    def setValue(self, shareNumber):
        self.share_num = shareNumber
    def run(self):
        list = []
        while True:
            list.clear()
            baseUrl = 'http://hq.sinajs.cn/list=' + self.share_num
            temp = requests.get(baseUrl).text.split('"')[1].split(',')
            list.append(temp[0])# 股票的名称
            list.append(round(float(temp[3]), 2))# 当前股票价格
            list.append("高 " + str(round(float(temp[4]), 2)))# 当前股票最高价格
            list.append("开 " + str(round(float(temp[1]), 2)))# 股票开盘价格
            list.append("量比 " + LYJutils.str_of_num(float(temp[8])))# 当前股票量比
            list.append(str(round(float(temp[3]) - float(temp[2]), 2))) # 当前股票涨跌幅
            m_flo = (float(temp[3]) - float(temp[2])) / float(temp[2]) * 100.0
            list.append(str(round(m_flo, 2)) + "%") # 当前股票涨跌幅百分比
            list.append("低 " + str(round(float(temp[5]), 2)))# 当前股票最低价格
            list.append(temp[30])#交易日期
            list.append("金额 " + LYJutils.str_of_num(float(temp[9]))) # 股票成交金额
            self._signal.emit(list)
            time.sleep(10)


这里返回了股票详情数据list列表,然后通过shareThread_callbacklog回调函数赋值给QLabel文本。同时,这里是一个永久循环的线程,目的就是实时交易数据每10秒获取一次。


接着,是我们的板块线程类:

import time
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
import requests
#板块指数详细数据线程
class plateThread(QtCore.QThread):
    _signal = pyqtSignal(list)
    def __init__(self):
        super(plateThread, self).__init__()
    def run(self):
        list = []
        qListName = ['s_sh000001', 's_sz399001', 's_sz399006', 's_sh000688', 's_sh000016', 's_sh000905',
                     's_sh000300', ]  # 添加的数组数据
        while True:
            list.clear()
            baseUrl = 'http://hq.sinajs.cn/list='
            for index in qListName:
                url = baseUrl + index
                temp = requests.get(url).text
                list.append(temp)
            self._signal.emit(list)
            time.sleep(10)


板块线程类很简单,也是无线循环获取板块指数,毕竟主页我们要放置的实时股票交易数据,如果你想更快的更新,可以自己更改秒数。


特别注意,板块获取指数的接口为:“http://hq.sinajs.cn/list={板块代码}”。股票获取接口为:“http://hq.sinajs.cn/list={股票代码}”,与前面博文一样,需要在股票代码前面加上sz或者sh等。不过,板块代码是独立的,可以自己看看上面的板块代码规律。


运行之后,效果如下图所示:


忘记说了,所有的网络股票数据实时获取都需要创建线程,有过开发经验的程序员都应该知道,主线程中(也就是界面),不能执行耗时的任务,不然会卡顿崩掉。


软件资源代码下载地址:点击下载

相关文章
|
1月前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
15天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
15天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
42 3
|
1月前
|
弹性计算 数据管理 数据库
从零开始构建员工管理系统:Python与SQLite3的完美结合
本文介绍如何使用Python和Tkinter构建一个图形界面的员工管理系统(EMS)。系统包括数据库设计、核心功能实现和图形用户界面创建。主要功能有查询、添加、删除员工信息及统计员工数量。通过本文,你将学会如何结合SQLite数据库进行数据管理,并使用Tkinter创建友好的用户界面。
57 2
从零开始构建员工管理系统:Python与SQLite3的完美结合
|
22天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
27天前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
|
27天前
|
存储 API 数据库
使用Python和Flask构建简单的RESTful API
使用Python和Flask构建简单的RESTful API
|
27天前
|
JSON 关系型数据库 测试技术
使用Python和Flask构建RESTful API服务
使用Python和Flask构建RESTful API服务
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
56 3