欢迎大家订阅《教你用 Python 进阶量化交易》专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前推出的扩展篇链接如下:
第一篇《管理概率==理性交易》
第二篇《线性回归拟合股价沉浮》
第三篇《最大回撤评价策略风险》
第四篇《寻找最优化策略参数》
第五篇《标记A股市场涨跌周期》
第六篇《Tushare Pro接口介绍》
第七篇《装饰器计算代码时间》
第八篇《矢量化计算KDJ指标》
第九篇《移植量化交易小工具》
第十篇《统计学预测随机漫步》
第十一篇《TA-Lib库扩展介绍》
第十二篇《股票分笔数据跨周期处理》
第十三篇《TA-Lib库量价指标分析》
第十四篇《ATR在仓位管理的应用》
第十五篇《扒一扒量化回测常见陷阱》
第十六篇《量化回测工具更新版1》
第十七篇《GUI控件在回测工具上的添加》
第十八篇《文本框显示Tushare股票信息》
第十九篇《建立基于TA-Lib的指标库》
第二十篇《爬虫抓取股票论坛帖子》
第二十一篇《欧奈尔RPS指标的计算》
第二十二篇《GUI显示股票RPS-TOP10》
第二十三篇《Markowitz实现股票最优组合》
第二十四篇《详解wxPython之Toolbar的使用》
为了将专栏中分散的知识点贯穿起来,笔者在专栏的末尾小节《制作自己的量化交易工具》中分享了早期制作的一个简易版量化交易小工具,希望大家能够通过调试代码的方式掌握相关的知识。
目前在场外篇第9篇中已经移植到了Python3.7x版本上,接下来我们在这个版本的基础上逐步完善这个工具,使专栏的读者不仅能够通过小工具掌握专栏的相关知识点,也能够把工具用到自己的股票量化交易中去。
在数据分析中少不了会使用到像excel一样的表格来显示和编辑数据。本节我们介绍下wx.grid.Grid的使用。
首先我们跑一个关于wx.grid.Grid测试的例程,看看整体的显示效果。
class GridFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent)
self.grid = wx.grid.Grid(self, -1)
def TestFunction(self):
self.grid.CreateGrid(100, 10)
self.grid.SetRowSize(2, 60)
self.grid.SetColSize(0, 120)
self.grid.SetRowLabelValue(0, "ROW")
self.grid.SetColLabelValue(0, "COL")
self.grid.SetCellValue(0, 0, 'wxGrid is good')
self.grid.SetCellValue(0, 3, 'This is read.only')
self.grid.SetReadOnly(0, 3)
self.grid.SetCellValue(3, 3, 'green on grey')
self.grid.SetCellTextColour(3, 3, wx.GREEN)
self.grid.SetCellBackgroundColour(3, 3, wx.LIGHT_GREY)
self.grid.SetColFormatFloat(5, 6, 2)
self.grid.SetCellValue(0, 6, '3.1415')
self.Show()
我们挑选几个在例程中使用到的,相对常用的方法,进行逐个的介绍。
CreateGrid()方法初始化一个固定行数、列数的Grid界面。
注:行列数创建后仍可以使用以下方法增加行列:
使用AppendCols向右扩展grid更多的列或者AppendRows向下扩展grid更多的行,如下所示:
AppendCols(self, numCols=1, updateLabels=True)
AppendRows(self, numRows=1, updateLabels=True)
使用InsertCols指定位置插入更多的列扩展grid或者使用InsertRows指定位置插入更多的行扩展grid,如下所示:
InsertCols(self, pos=0, numCols=1, updateLabels=True)
InsertRows(self, pos=0, numRows=1, updateLabels=True)
SetColSizes()方法和SetRowSize()方法分别设置指定列、行的宽度、高度
SetCellValue()方法设置指定行列的单元格内的值
SetRowLabelValue()方法和SetColLabelValue()方法用于改变行标签、列标签。
为了更好地结合实际的应用场景,我们把2019年12月31日前每日RPS排名前十的股票用Grid显示出来,只需遍历的方式调用SetCellValue()方法即可。如下所示:
关于Grid有几个关键的事件,这里说明一下。
- 事件EVT_GRID_CELL_CHANGING:单元格内数据发生变化中
- 事件EVT_GRID_CELL_CHANGED:单元格内数据发生变化后
- 事件EVT_GRID_CELL_LEFT_CLICK:左键单击单元格
- 事件EVT_GRID_CELL_LEFT_DCLICK:左键双击单元格
- 事件EVT_GRID_CELL_RIGHT_CLICK:右键单击单元格
- 事件EVT_GRID_CELL_RIGHT_DCLICK:右键双击单元格
- 事件EVT_GRID_SELECT_CELL:选中单元格事件
绑定事件的代码如下所示,第一个参数是事件,第二个参数是响应方法,第三个参数:事件对象。此处我们右键双击单元格后会使该单元格背景色变成黄色。
self.Bind(wx.grid.EVT_GRID_CELL_RIGHT_DCLICK, self.cellChanged, self.grid)
响应方法中必须要有一个event参数,这点需要特别提示。
当处理大型数据展示的时候,可以使用setTable()方法做到数据与界面逻辑分离。接下来我们介绍下这种方法。
首先通过wx.grid.GridTableBase基类创建一个的自定义的子类。wx.grid.GridTableBase类保存了wx.grid.grid类要显示的实际数据,这样一来wx.grid.grid类就充当一个表类的视图。
自定义类中需要重写GetNumberRows、GetNumberCols、GetValue这些方法。
class RpsInfoGridTable(wx.grid.GridTableBase):
def __init__(self, datas, colLabels):
wx.grid.GridTableBase.__init__(self)
self.datas = datas
self.colLabels = colLabels
仍然以显示2019年12月31日前每日RPS排名前十的股票为例介绍这种方式。如下所示:
def TableBaseTest(self):
self.ReadData()
GridTable = RpsInfoGridTable(self.df_data.values, self.list_columns)
self.grid.SetTable(GridTable, True)
self.grid.AutoSize()
self.grid.Refresh()
self.Show()
关于以上内容更多的探讨欢迎大家加入专栏交流群。更多的量化交易内容欢迎大家订阅专栏阅读!!
共同学习,写下你的评论
评论加载中...
作者其他优质文章