1700510870
1700510871
1700510872
图18-16 sIidewindow.csv文件内容
1700510873
1700510874
第1个字段是当前时间;第2个字段是未来60分钟内的高点减去当前这一分钟收盘价的值,也就是涨幅;第3个字段是当前这一分钟的收盘价的值减去未来60分钟内的低点值;第4个字段是第2个字段值和第3个字段值的商,这个值可以粗略地分为正值较大(如图18-17所示)、正值较小(如图18-18所示)、负值较大(如图18-19所示)和负值较小(如图18-20所示)4种情况。
1700510875
1700510876
1700510877
1700510878
1700510879
1700510880
图18-17 正值较大 图18-18 正值较小 图18-19 负值较大 图18-20 负值较小 从形态上来看,我们肯定希望找到那些涨势/跌势明显的点。正值很大,表示明显的涨势;正值为1以内非常小的值,表示非常明显的跌势。在负值较小的情况下越接近1,说明涨势越明显;在负值较大的情况下越接近1(最大就是1),说明跌势越明显。正值且接近1的情况就不太好了,说明涨跌幅度相近,这非常不利于交易。所以,显然是幅度越大且涨跌态势越明确(不震荡)的情形是最好的下单入场点。
1700510881
1700510882
通过分析这个文件就会发现,只有正值较大和正值较小两种情况,也就是说,CLOSE一直都在HIGH和LOW之间。这种情况下就要看波动向哪边偏斜了,那些偏斜大的是我们比较喜欢的。在1小时内升幅最大的是386个点,跌幅最大的是266个点。我们试着找出那些波动幅度明显属于向高方向偏斜的(这里可以考虑大于1.5的),以及波动幅度明显属于向低方向偏斜的(这里可以考虑小于0.66的),看看数量分别有多少。
1700510883
1700510884
建立一个临时表SLIDEWINDOW。
1700510885
1700510886
CREATE TABLE SLIDEWINDOW( DT DATETIME, RISE_PIP DECIMAL(10,4), FALL_PIP DECIMAL(10,4), PROPORTION DECIMAL(10,4));
1700510887
1700510888
将分析结果插入这个临时表,编写Python文件slidewindow_insert.py。
1700510889
1700510890
#!/usr/bin/pythonimport os,sys,MySQLdb try
: db=MySQLdb.connect(host=‘localhost’, user=‘root’, passwd=‘111111’, db=‘FOREX’) cursor=db.cursor() counter=0 cursor.execute(‘USE FOREX;’) sql=‘SELECT * FROM EURUSD_1M’ cursor.execute(sql); result=cursor.fetchall() for i in range(0, cursor.rowcount)
: startdt=str(result[i][0]) startpip=str(result[i][4]) cursor1=db.cursor() cursor1.execute(‘USE FOREX;’) sql1=‘INSERT INTO SLIDEWINDOW SELECT DT, MAX(HIGH)-‘ + startpip + ‘ AS RISE_PIP, ‘ + startpip + ‘-MIN(LOW)AS FALL_PIP, CASE WHEN ‘+ startpip + ‘<>MIN(LOW)THEN(MAX(HIGH)-‘ + startpip + ‘)/(‘ + startpip + ‘-MIN(LOW))ELSE(MAX(HIGH)-‘ + startpip + ‘)/0.0001 END FROM EURUSD_1M WHERE DT BETWEEN ”’ + startdt + ’” AND DATE_ADD(”’ + startdt + ’”, INTERVAL 60 MINUTE)’ cursor1.execute(sql1) if i%2000==0
: db.commit() db.commit()except MySQLdb.Error,e
: print “Error %s” %(str(e.args[0])+’
:’+str(e.args[1])) exit(1)cursor1.close()cursor.close()db.close()
1700510891
1700510892
使用SQL语句,计算涨幅与跌幅波动比大于1.5且涨幅大于10个点的分钟数。
1700510893
1700510894
SELECT COUNT(*)FROM SLIDEWINDOWWHERE PROPORTION>=1.5 AND RISE_PIP>=0.0010;
1700510895
1700510896
1700510897
共找到1606759分钟的数据,占5447760分钟记录的29.5%,说起来不算太差。在这种情况下,理论上有超过的时间可以下单买涨。
1700510898
1700510899
下面计算一下涨幅与跌幅波动比小于0.66且跌幅大于10个点的分钟数。
1700510900
1700510901
SELECT COUNT(*)FROM SLIDEWINDOWWHERE PROPORTION<=0.66 AND FALL_PIP>=0.0010;
1700510902
1700510903
共找到1576827分钟的数据,占5447760分钟记录的28.9%,与涨势的情况相差无几。
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字段。
[
上一页 ]
[ :1.70051087e+09 ]
[
下一页 ]