在上篇文章里,我们主要讨论如何使用SVM分类器来抓取出表现最好的技术指标。而我们提到的一个关键点在于我们使用了极端随机树来选择技术指标中的一部分来生成一组模型进行训练。在本文中,我们重点来介绍极端随机树如何来实现这部分功能以及其原理。
极端随机树(Extremely Randomized trees)也叫极限树(Extra-trees)。极端随机树事实上是用Bagging的方法(Bootstrap Aggregating),比一般的随机树多一层随机机制。 那么什么是Bagging方法呢?其实是相对于Boosting方法来说的!Bagging是生成平行的一组模型,而Boosting则是生成一个模型队列,后面的模型会依据前面的模型来进行优化。这么讲通俗易懂吧!对,本文作者不装,写文章的目的就是为了让大家看的懂,所以尽量都用通俗的语言来讲。讲到这里,那么我们知道其实我们用极端随机树的目的其实就是为了找到最优的那一些技术指标。基本的过程就是,我们可以设置极端随机树随机的从100个技术指标里随机的选择30个来,当然并非只选一次,而是很多,这样就生成了一堆选用不同技术指标的模型。最后使用分类器模型进行训练,得出最优的指标组合。
下面给出一份早些年使用sklearn包写的极端随机树的模型代码:
import pandas
from sklearn import model_selection
from sklearn.ensemble import ExtraTreesClassifier
features = pandas.read_csv('technical_indicator.csv')# 使用TA-lib生成的技术指标
array = features .values
X = array[:,0:features.shape[1]-1] # 最后一列为标签
Y = array[:,features.shape[1]-1]
num_trees = 100 # 生成树的数量
max_features = 30 # 选取技术指标的个数
cross_vali= model_selection.KFold(n_splits=10, random_state=13) # 将数据分为10份进行交叉验证,设置随机种子保证每次划分的交叉验证数据集相同
model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)
results = model_selection.cross_val_score(model, X, Y, cv=cross_vali)
接下来讨论一下很多同学比较关注的问题,调参。其实这部分现在已经有很多的方法,包括tensorflow里也已经整合了一些方法,会将一些以前需要自己去写自动调参算法的部分融合到高级模型中去。先从原始的方法来讨论一下这个问题,如果我们仅仅使用一个CNN分类器,我们如何去筛选最优的技术指标呢?有同学可能会使用穷举,或者说Grid search。配合上你可怜的1050TI,训练到山无棱,天地合也没有看到结果。除非你拥有谷歌的云服务器,否则其实最优的方法还是random search,从100个技术指标里随机选择30个指标,然后不断循环训练,并保证每次训练的环境是对齐的,对于股票数据,尤其需要了解这一点。每次返回最优的结果,并且将所有的结果保存。有同学要说了,这和穷举有什么差别?事实证明Random Search的效果是最优的,特别是在你的机器配置不是那么让人开心的前提下。但是整体来说,这种算法显然是不如Bagging方法的效率来的高,也不如Boosting方法的准确率来的高。所以大家可以看到在kaggle上,Boosting算法仍然时不时一览众山小。 同学们可能发现有时候文章里出现的是方法,有时是算法。原因是因为我们从生成一堆模型,他们之间的联系来讲的时候我们说是方法。而实际上,比如adaboost则是一种算法。这个不细表了,以免混淆视听。
总体来说,我们在调参的时候,如果没有合适的选择,或者说不太方便去将一个search算法结合到模型中的时候,我们可以自己去写一个Random Search的算法,实践证明它也是比较高效的。当然,这里有一个点要提醒大家。要选取到一个可以参照的准确率或者loss,这样你就可以及时的知道什么时候其实已经获得了相对最优解。比如股市分类准确率到达了60%,或者loss小于一个你曾经达到的最小值,这都是你可以决定是否从漫长的等待期跳出的信号。做金融市场相关的深度学习或者说机器学习是一件需要无数次实验的事情,而每一次的实验时间都不短,所以记录和总结就显得尤为重要。当然训练的时候也有让你等待的觉得遥遥无期,所以不要太追求特别高配的电脑,多台电脑,或者多张显卡要更为重要!这就是我建议大家如果有两万块花在显卡上的时候,买两块2080TI,配上64个PCIE通道AMD的线程撕裂者1950X即可,并行能力在Bagging方法上尤其有效,可以极大的提高你的寻求最优解之路。
了解更多技巧,请移步我的星球:AI量化(https://t.zsxq.com/RvfY37y) 星球限时免费,如需加入,请私信我获得免费邀请码!
零基础学习Python与深度学习应用请关注星球:Python与深度学习 https://t.zsxq.com/bUFayZ3
微信公众号:QTechAI
网友评论