今天把回测结果量化并可视化出来。
在wxpython里使用wx.html2浏览器控件显示动态的html,使用bokeh来渲染回测结果。
在wxpython的gui里嵌入浏览器控件是容易的事情。
与普通控件类似,使用wx.html2.WebView.New(当前panel),然后添加到布局器里就可以正常使用了。
self.browser = wx.html2.WebView.New(self) self.vbox.Add(self.browser,proportion=-1,flag=wx.EXPAND|wx.ALL,border=10) self.browser.LoadURL('http://www.ailabx.com')
wxpython的gui编程,在界面部分有两件重要的事情,一是控件本身使用,这个相对简单,初始化组件,然后摆放到特定的问题,获取或者设置控件的值。
布局通常会用到两个sizer,一个是boxsizer,另一个是gridsizer。
boxsize分成垂直与水平,与css的布局类似,然后在局部控件较多时,使用girdsizer分布。
下面来看bokeh的使用,bokeh的安装和入门都非常简单。
from bokeh.plotting import figure, show class BokehMgr: def plot(self): x = [1, 2, 3, 4, 5] y = [6, 7, 2, 4, 5] # create a new plot with a title and axis labels p = figure(title="Simple line example", x_axis_label='x', y_axis_label='y') # add a line renderer with legend and line thickness to the plot p.line(x, y, legend_label="Temp.", line_width=2) # show the results show(p)
创建一个figure对象,然后使用figure.line画拆线图。
接下来,植入机器学习策略。
首先是数据集分割,我们使用sklearn的train_test_split对数据集进行切分。
def split_data(self, df, train_valid_date='2016-01-01'): print(df.tail()) df_train = df.loc[(slice(None, train_valid_date), slice(None)), :] df_valid = df.loc[(slice(train_valid_date, None), slice(None)), :] df_feature = df_train['feature'] df_label = df_train['label']['LABEL_1'] from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(df_feature,df_label, test_size=0.2) return X_train, X_test, y_train, y_test
对于多索引的dataframe进行切分,需要注意一点,还是使用df.loc,但传入slice(None,'2016-01-01')把数据集分成两段,一段用于训练,一段用于回测。这里与传统机器学习直接train,test不同,我们需要单独取出一段用于回测来验证策略。
然后调用lightGBM的fit方法直接训练即可。
def fit( self, dataset: DatasetH, num_boost_round=1000, early_stopping_rounds=50, verbose_eval=20, evals_result=dict(), **kwargs ): dtrain, dvalid = self._prepare_data(dataset) self.model = lgb.train( self.params, dtrain, num_boost_round=num_boost_round, valid_sets=[dtrain, dvalid], valid_names=["train", "valid"], early_stopping_rounds=early_stopping_rounds, verbose_eval=verbose_eval, evals_result=evals_result, **kwargs ) evals_result["train"] = list(evals_result["train"].values())[0] evals_result["valid"] = list(evals_result["valid"].values())[0]
当然这里我们还没有涉及特征工程优化,新的因子挖掘,这些都是机器学习模型的核心,但我们先要把周边这边流程把跑通,固化下来。
决策树的集成学习有个好处就是可以筛选特征,这个非常厉害,所以AI量化投资里大量使用boosting或者bagging来训练模型,毕竟这是金融决策,透明可解释非常重要。
明天继续。
搭建回测系统主框架 | 从零搭建自己的AI量化平台 #1
"积木式"的策略框架 | 从零搭建自己的AI量化平台 #2
机器学习框架sklearn与qlib数据融合 | 从零搭建自己的AI量化平台 #3