洛阳证券公司联盟

量化交易系统界面之pyqt5

AI量化实验室2020-11-19 13:24:14

量化交易系统,需要配置各种各样的参数,对历史数据进行回测。从使用的角度,肯定需要界面。现在很多quant平台,使用web的方式,在云端有方便性,但策略安全,性能都存在问题。对于c端的散户,没有策略能力,也没有太强的付费动机。像ricequant,joinquant都纷纷进入b端市场。这时候,产品的形态,更偏向gui桌面形态。


和python的强大生态相结合,界面的不二选择就是pyqt5。前文我们分享过使用qt designer+eric6快速原型化。但这里也带来一个问题,就是一个大界面是完全耦合到一块的,修改也麻烦。另外,界面本身的工作量,其实也是一次性的,所以,繁琐一点也还好,主要是维护要方便。


做一个简单的股票池选择功能:

界面与代码分析:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets,QtCore

from logic_stock_pool import *

class WidgetStockPool(QWidget):
def __init__(self):
super(WidgetStockPool, self).__init__()
self.mgr = LogicStockPool(self)
self.initUI()
self.mgr.init_data()

def initUI(self):
self.groupBox = QtWidgets.QGroupBox('股票池:',self)
self.groupBox.setGeometry(QtCore.QRect(20, 20, 401, 151))
self.groupBox.setObjectName("groupBox")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox)
self.horizontalLayout.setObjectName("horizontalLayout")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.label = QtWidgets.QLabel('选择股票池:',self.groupBox)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
self.comboBox_pool = QtWidgets.QComboBox(self.groupBox)
self.comboBox_pool.setObjectName("comboBox_pool")
self.comboBox_pool.addItem("沪深300")
self.comboBox_pool.addItem("中证500")
self.comboBox_pool.addItem("中证50")
self.comboBox_pool.addItem("全市场")
self.gridLayout.addWidget(self.comboBox_pool, 0, 1, 1, 1)
self.label_2 = QtWidgets.QLabel('板块:',self.groupBox)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1)
self.comboBox_plate = QtWidgets.QComboBox(self.groupBox)
self.comboBox_plate.setObjectName("comboBox_plate")
self.comboBox_plate.addItem("全部")
self.comboBox_plate.addItem("主板")
self.comboBox_plate.addItem("中小板")
self.comboBox_plate.addItem("创业板")

self.gridLayout.addWidget(self.comboBox_plate, 0, 3, 1, 1)
self.label_3 = QtWidgets.QLabel('行业:',self.groupBox)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
self.comboBox_indu = QtWidgets.QComboBox(self.groupBox)
self.comboBox_indu.setObjectName("comboBox_indu")
self.comboBox_indu.addItem("全部")
self.gridLayout.addWidget(self.comboBox_indu, 1, 1, 1, 1)
self.checkBox_ST = QtWidgets.QCheckBox('是否包含ST',self.groupBox)
self.checkBox_ST.setObjectName("checkBox_ST")

self.btn = QtWidgets.QPushButton('点击查看',self.groupBox)
self.gridLayout.addWidget(self.btn, 2, 1, 1, 1)

self.gridLayout.addWidget(self.checkBox_ST, 2, 0, 1, 1)
self.horizontalLayout.addLayout(self.gridLayout)

self.btn.clicked.connect(self.mgr.on_btn_clicked)


if __name__ == '__main__':
app = QApplication(sys.argv)
demo = WidgetStockPool()
demo.show()
sys.exit(app.exec_())


from PyQt5.QtWidgets import QComboBox,QMessageBox,QCheckBox
import requests

class LogicStockPool(object):
def __init__(self,widget):
self.widget = widget

def init_data(self):
self.init_indus(self.widget.comboBox_indu)

def init_indus(self,combobox):
data = requests.get('http://127.0.0.1:8000/appstock/indus').json()
items = []
for item in data['indus']:
text = item['name'] + ':' + str(item['code'])
items.append(text)
combobox.addItems(items)

def on_btn_clicked(self):
ret = self.get_data()
print(ret)
reply = QMessageBox.information(self.widget, # 使用infomation信息框
                                       "标题",
str(ret),
QMessageBox.Yes | QMessageBox.No)

def get_data(self):
indu = self.widget.comboBox_indu.currentText()
plate = self.widget.comboBox_plate.currentText()
pool = self.widget.comboBox_pool.currentText()
b_includeST = self.widget.checkBox_ST.isChecked()

dict = {'indu':indu,'pool':pool,'plate':plate,'bST':b_includeST}

return dict


关于作者:魏佳斌,互联网产品/技术总监,北京大学光华管理学院(MBA),特许金融分析师(CFA),资深产品经理/码农。偏爱python,深度关注互联网趋势,人工智能,AI金融量化。致力于使用最前沿的认知技术去理解这个复杂的世界。

扫描下方二维码,关注:AI量化实验室(ailabx),了解AI量化最前沿技术、资讯。