原创文章第283篇,专注“个人成长与财富自由、世界运作的逻辑与投资"。
今天把gui的架子重新搭建了一个,还是确定使用xwpython。前面的文章有做过比较,就不细说了。
大致的框架如下:
从选股到模型到回测,到每日选股,到因子挖掘,都实现界面可操作,方便一些没有代码基础的同学。
功能没开放完成,周末赶赶进度,但大家可以先下载去看。
别上上述界面还不完整,代码量不小的。
import pandas as pd
import wx
import wx.adv
import wx.grid
from gui.widgets.datatable import DataTable
from gui.logic import g_logic
from .panel_backtest import PanelBacktest
from .panel_pickstock import PanelPickStock
class PanelAnalysis(wx.Panel):
def __init__(self, parent):
super(PanelAnalysis, self).__init__(parent, id=wx.ID_ANY)
self._init_ui()
self._init_data()
def _init_data(self):
return
df = Logic().load_data_by_day('20230717')
table = DataTable(df)
self.grid_datas.SetTable(table, takeOwnership=True)
self.grid_datas.AutoSizeColumns()
def _init_ui(self):
# 左右结构
self.sizer = wx.BoxSizer(wx.HORIZONTAL)
self.SetSizer(self.sizer)
self._init_left_panel()
self._init_right_panel()
g_logic.reg_pickstock_panel(self.panel_pickstock)
g_logic.reg_backtest_panel(self.panel_backtest)
g_logic.init_data()
def _init_left_panel(self):
self.note_left = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
self.sizer.Add(self.note_left, 1, wx.ALL | wx.EXPAND, 10)
self.panel_pickstock = PanelPickStock(self.note_left, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.TAB_TRAVERSAL)
self.note_left.AddPage(self.panel_pickstock, "择投设置", True)
self.panel_model = wx.Panel(self.note_left, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.TAB_TRAVERSAL)
self.note_left.AddPage(self.panel_model, "交易模型", False)
self.panel_picktime = wx.Panel(self.note_left, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.TAB_TRAVERSAL)
self.note_left.AddPage(self.panel_picktime, "大盘择时", False)
def _init_right_panel(self):
self.note_right = wx.Notebook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
# self.note_right.SetBackgroundColour(wx.RED)
self.sizer.Add(self.note_right, 3, wx.ALL | wx.EXPAND, 10)
self.panel_backtest = PanelBacktest(self.note_right, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.TAB_TRAVERSAL)
self.note_right.AddPage(self.panel_backtest, "策略回测", True)
self.panel_pick_day = wx.Panel(self.note_right, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.TAB_TRAVERSAL)
self.note_right.AddPage(self.panel_pick_day, "每日选股", False)
self.panel_rank = wx.Panel(self.note_right, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
wx.TAB_TRAVERSAL)
self.note_right.AddPage(self.panel_rank, "排名分析", False)
def _init_pickstock(self):
vbox = wx.BoxSizer(wx.VERTICAL)
self.panel_pick_day.SetSizer(vbox)
self.label_text = wx.StaticText(self.panel_pick_day, wx.ID_ANY, u"根据以上模型的选股设置, 在历史上任何一天选股。", wx.DefaultPosition,
wx.DefaultSize, 0)
self.label_text.Wrap(-1)
vbox.Add(self.label_text, 0, wx.ALL, 5)
row_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.label_time = wx.StaticText(self.panel_pick_day, wx.ID_ANY, u"选股日期", wx.DefaultPosition, wx.DefaultSize, 0)
self.label_time.Wrap(-1)
row_sizer.Add(self.label_time, 0, wx.ALL, 5)
self.date_pick = wx.adv.DatePickerCtrl(self.panel_pick_day, wx.ID_ANY, wx.DefaultDateTime, wx.DefaultPosition,
wx.DefaultSize, wx.adv.DP_DEFAULT)
row_sizer.Add(self.date_pick, 0, wx.ALL, 5)
vbox.Add(row_sizer, 1, wx.EXPAND, 5)
self.btn_pickstock = wx.Button(self.panel_pick_day, wx.ID_ANY, u"开始选股", wx.DefaultPosition, wx.DefaultSize, 0)
vbox.Add(self.btn_pickstock, 0, wx.ALL, 5)
# Grid
self.grid_datas = wx.grid.Grid(self.panel_pick_day, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0)
self.grid_datas.CreateGrid(5, 5)
self.grid_datas.EnableEditing(False)
self.grid_datas.EnableGridLines(True)
self.grid_datas.EnableDragGridSize(False)
self.grid_datas.SetMargins(0, 0)
# Columns
self.grid_datas.EnableDragColMove(False)
self.grid_datas.EnableDragColSize(True)
self.grid_datas.SetColLabelAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
# Rows
self.grid_datas.EnableDragRowSize(True)
self.grid_datas.SetRowLabelAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
# Label Appearance
# Cell Defaults
self.grid_datas.SetDefaultCellAlignment(wx.ALIGN_LEFT, wx.ALIGN_TOP)
vbox.Add(self.grid_datas, 8, wx.ALL | wx.EXPAND, 5)
# Virtual event handlers, override them in your derived class
def on_btn_pickstock_clicked(self, event):
wx.MessageBox('每日选股!')
event.Skip()
对于gui开发感兴趣,以及对于AI量化系统如何运作的同学,可以先下载看下来了。
联系客服