打字猴:1.700510904e+09
1700510904
1700510905 下面我们找出这些点前面的1M K线图数据,并尝试设计一个分类模型。
1700510906
1700510907 构造训练样本
1700510908
1700510909 为了方便训练,我们先构建一个便于生成训练样本的表或者文件。在Keras里,训练样本和验证集是以如下这种文本形式出现的。
1700510910
1700510911 [[ 0.48797666  0.49515848  0.96743517 …,  0.34333791  0.01071582   0.55347333] [ 0.18182799  0.52856064  0.7593987  …,  0.93302057  0.96330937   0.36177566] [ 0.29722546  0.69625588  0.02873254 …,  0.48557884  0.73657364   0.32492677] …, [ 0.13549382  0.00378319  0.06903272 …,  0.27581255  0.00568914   0.32686159] [ 0.24844718  0.8345029   0.63331516 …,  0.15998351  0.56751348   0.09996194] [ 0.33877344  0.37488438  0.42507674 …,  0.44084842  0.18272158   0.70054914]][[0 0 0 …, 0 0 0] [0 0 0 …, 0 0 0] [0 0 0 …, 0 0 0] …, [0 0 0 …, 0 0 0] [0 0 0 …, 0 0 0] [0 0 0 …, 0 0 0]]
1700510912
1700510913 前半部分最外层的方括号中是一个个输入向量,用方括号括起来,中间的维度用空格分开。后半部分的分类向量信息,最外层用方括号括起来,每一个分类向量也用方括号隔离。在这里,由于使用Softmax作为输出层,所以每一个输出向量的每一个维度都是一个分类概率。
1700510914
1700510915 使用SQL语句建造一个训练表,这个表中既要包含刚刚所有的EURUSD表中的信息,也要包括SLIDEWINDOW表中的信息。
1700510916
1700510917 CREATE TABLE EURUSD_TRAININGSELECT   EURUSD_1M.DT,   OPEN,   HIGH,   LOW,   CLOSE,   RISE_PIP,   FALL_PIP,   PROPORTIONFROM   EURUSDINNER JOIN   SLIDEWINDOWON   EURUSD_1M.DT=SLIDEWINDOW.DT;
1700510918
1700510919 此外,还要给每条训练记录加上一个分类,就是我们前面提到的RISE3、RISE2、RISE1、NONE、FALL1、FALL2、FALL3这几个分类。为了方便起见,最后在向量构成时会把它们对应地改写成1、2、3、4、5、6、7这样7个分类。在此之前,改造一下EURUSD_TRAINING表,给它加上一个CLASSIFICATION字段。
1700510920
1700510921 ALTER TABLE EURUSD_TRAINING ADD COLUMN(CLASSIFICATION INT);
1700510922
1700510923 在表构造环节的最后,要加上分类条件。
1700510924
1700510925 UPDATE EURUSD_TRAININGSET CLASSIFICATION=1WHERE RISE_PIP>=0.0040 AND PROPORTION>=1.5;UPDATE EURUSD_TRAININGSET CLASSIFICATION=2WHERE RISE_PIP>=0.0020 AND RISE_PIP<0.0040 AND PROPORTION>=1.5;UPDATE EURUSD_TRAININGSET CLASSIFICATION=3WHERE RISE_PIP>=0.0010 AND RISE_PIP<0.0020 AND PROPORTION>=1.5;UPDATE EURUSD_TRAININGSET CLASSIFICATION=5WHERE FALL_PIP>=0.0010 AND FALL_PIP<0.0020 AND PROPORTION<0.67;UPDATE EURUSD_TRAININGSET CLASSIFICATION=6WHERE FALL_PIP>=0.0020 AND FALL_PIP<0.0040 AND PROPORTION<0.67;UPDATE EURUSD_TRAININGSET CLASSIFICATION=7WHERE FALL_PIP>=0.0040 AND PROPORTION>=1.5 AND PROPORTION<0.67;UPDATE EURUSD_TRAININGSETCLASSIFICATION=4WHERE CLASSIFICATION IS NULL;COMMIT;
1700510926
1700510927 这里要注意最后一个分类,其他几个分类的定义都比较清晰。最后一个分类其实并不仅仅是波动小的分类,还包括一些情况,例如上下波幅可能很大但涨跌幅度相当。这两种分类合起来作为分类“4”,我们将它们统称为“不适合入场”就好了。
1700510928
1700510929 编写训练脚本
1700510930
1700510931 在滑动窗口捕捉到涨跌信息后,可以对应输出数据分类。由于数据量比较充足,可以考虑用70%的数据作为训练数据,留下30%的数据作为验证数据。
1700510932
1700510933 使用Keras和Theano搭建一个训练环境,并选择相应的数据项作为训练集和验证集。在这个训练过程中,我们假设从当前的时间点向前观察60分钟,结合当前时间点的“蜡烛”位置来判断是否产生了“突破”形态,并使之向着自己想定的方向移动,即今后1小时的涨势信息蕴含在之前60分钟K线图每根“蜡烛”所表示的价位之中。
1700510934
1700510935 在做这部分工作之前,我们处理一下EURUSD_TRAINING表,为其添加一个索引。
1700510936
1700510937 ALTER TABLE EURUSD_TRAINING ADD INDEX(DT);
1700510938
1700510939 在这里请注意,可以直接在数据库里用游标做滑动窗口构造训练样本集。这种情况下,时间复杂度在O(n)上。但是,不推荐在遍历中嵌套一个60分钟的请求——尽管时间复杂度理论上还是O(n),不过由于每次都要再请求数据库,所以消耗的时间很长。在这里我使用的方法是将数据输出到文本文件,然后用遍历文本文件的方式进行构造。
1700510940
1700510941 编写Python文件make_file.py。
1700510942
1700510943 import os,sys,MySQLdbimport numpy as npdb=MySQLdb.connect(host=‘localhost’, user=‘root’, passwd=‘111111’, db=‘FOREX’)cursor=db.cursor()cursor.execute(‘USE FOREX;’)sql=‘SELECT * FROM EURUSD_TRAINING;’cursor.execute(sql)result=cursor.fetchall()for i in range(cursor.rowcount) printstr(result[i][0])+’,’+str(result[i][1])+’,’+str(result[i][2])+’,’+str(result[i][3])+’,’+str(r esult[i][4])+’,’+str(result[i][5])+’,’+str(result[i][6])+’,’+str(result[i][7])+’,’+str(result [i][8])cursor.close()db.close()
1700510944
1700510945 调用该文件,并把文件输出到record.txt。
1700510946
1700510947 python make_file.py >> record.txt
1700510948
1700510949 (1)第1次尝试
1700510950
1700510951 在这个文件中,我们设计了一个有8个维度的向量,但这8个维度在训练中并非都用得上。
1700510952
1700510953 编写训练文件train.py。
[ 上一页 ]  [ :1.700510904e+09 ]  [ 下一页 ]