这个算是一个小坑,因为我也还在学习过程中,代码慢慢完善。一开始在python 2.7,vnpy 1.9.2环境中实现。后面在python 3.7也基本实现,增加支持了xgboost。代码写的繁杂,多多抱歉。
首先说说Scikit-learn是Python语言中专门针对机器学习应用而发展起来的一款开源框架,相对于现在深度学习库tensorflow,由于Scikit-learn本身不支持深度学习,也不支持GPU加速,但是相对于tensorflow那种近乎黑箱的多层神经网络,还是比较好从数学来解释分析。
分类是指识别给定对象的所属类别,属于监督学习的范畴,最常见的应用场景包括垃圾邮件检测和图像识别等。目前Scikit-learn已经实现的算法包括:支持向量机(SVM),最近邻,逻辑回归,随机森林,决策树以及多层感知器(MLP)神经网络等等。这里会使用逻辑回归,决策数, MLP神经网络和SVM向量机,其实都是两句代码事情。
不考虑内部的复杂数学逻辑,这里功能性的使用Scikit-learn特征分类的功能。
1) 选取的特征值,为了避免数据值非逻辑化,这里不直接使用点位最高点这些,而使用那些和具体点位无关的指标,比如atr,cci,rsi,std和bar的涨跌百分比。
2) 利用这些特征值进行分类,这里对于期货走势就是三类,1 是之后上涨,0是之后无规律,-1是之后下跌,这里使用线性回归分析当前时点之后6根K线的走势,如果斜度下,那么当前时点归为-1下跌类,斜度上,为1上涨,如果取信p值不够,或者上下斜率不大,为0。
那么特征值就是atr,cci,rsi,std和bar的涨跌百分比,当然你可以加入KDJ,MACD更多;类别就是三类1,0,-1,利用机器学习,找出特征值和类别的隐含逻辑,进而指导交易,非常粗糙。
整体代码逻辑如下,这里大量借鉴这个
1. 期货K线数据, 导入k线数据,并整理加入特性和类属性
• 利用之前做的DataAnalyzer,读取Mongodb或者csv的1分钟k数据, 放入Dataframe来处理,按照定义合并出n分钟k线,这里n为10
• 还是利用DataAnalyzer,利用ta-lib方法。给Dataframe加入atr,cci,rsi,std,macd和涨跌百分比。
• 使用新方法addTrend,利用scipy.stats的线性回归求出当前时点之后的斜率,给与分类值-1,0,1.
2. 数据处理,为了后面机器学习,把特征数组和类数组划分出来,并且划分训练机和测试集。
(1)划分出特征数组 X,和类别数组y
(2)划分训练集和测试集
• model_selection.train_test_split()
3. 特征工程,之前需求很多特征,其实有些并没有体现规律,或者完全随机,那么没有意义,可以删除
• 根据P值选:feature_selection.SelectFpr()
• 按照百分比选出最高分特征:feature_selection.SelectPercentile()
这里使用SelectPercentile,
4. 模型定义调参/选择
这里使用下面模式进行分析,然后利用网格调参
1)LogisticRegression 逻辑回归
2)DecisionTreeClassifier 决策树
3)SVC 支持向量分类
4)MLP 神经网络
• 交叉验证+网格搜索:model_selection.GridSearchCV()
5. 模型测试和评价,使用选取最好的模型,进行测试看看拼接
• 模型预测:model.predict()
• Accuracy:metrics.accuracy_score()
• Presicion:metrics.precision_score()
• Recall:metrics.recall_score()
6. 模型保存和调用
• 模型保存:joblib.dump()
• 模型调用:joblib.load(),这里就可以在vnpy中使用了,其实放在其他交易平台也差不多。
后面代码整理放在后面帖子,最后,只做参考,我发现虽然准确率有差不多70%,但是都是要你空仓,大智慧。。。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22259926/viewspace-3137182/ ,如需转载,请注明出处,否则将追究法律责任。