1700510800
1700510801
1700510802
1700510803
图18-12 波幅统计图
1700510804
1700510805
下面我们分析这些波幅值时,就可以考虑围绕这些已经考察明确的数据来设置范围参数了。在一个点差为2的平台上,如果我们只能捕捉到极低波幅的涨势/跌势,例如只有4个点,那么下单和平仓的正确率要接近100%才行。但是,如果我们能捕捉到波幅在10个点以上的情况,就允许存在一定概率的错误。在这里,由于没有具体的策略,所以无法得出这个概率是多少。盈利大小是指每次下单时的点和平仓时的点的差值与方向的乘积的总和。
1700510806
1700510807
3.统计分析
1700510808
1700510809
如果我们手里只有这些K线图的m1数据,并坚信一个涨势/跌势在此前市场酝酿情绪的阶段能够看出端倪,就可以尝试把这个过程描述为一个由前面的数据影响后面数据的非线性的预测过程。
1700510810
1700510811
这里对数据进行统计分析和建模的过程,实际上和其他数据分析过程没有本质区别,都是遵循这样的步骤:观察数据→建立假说→训练模型→验证模型→调整模型。
1700510812
1700510813
如果建立的假说是刚刚这种前面的数据影响后面的数据的时序相关模型,可以写作:
1700510814
1700510815
1700510816
1700510817
1700510818
其中,j表示当前的时间节点,n表示一个超参数——表示应该向前看多远的一个滑动窗口的大小。n的值可以人为调整。
1700510819
1700510820
对于涨幅和跌幅的大小,可以尝试用回归模型来做,也可以考虑用分类模型来做。这两种方式的精度要求不太一样。回归模型期望得到一个具体的幅度值(多少点),而分类模型期望得到一个涨幅的分类(暴涨、大涨、小涨、持平、小跌、大跌、暴跌,以及更粗略或者更细致的分类值)。
1700510821
1700510822
如果是回归模型,就需要使用线性回归、逻辑回归等进行建模、假设并训练。如果是分类模型,就需要使用决策树、随机森林、SVM等进行建模拟合。如果使用线性回归、决策树等逻辑上相对简单、有明确参数计算解释的模型进行拟合,在将来把这些条件转化为MT4平台上可以使用的MQL语言时就会比较方便;如果想使用神经网络进行学习,除了要注意过拟合这种问题以外,还要注意策略很可能无法方便地转化成MQL语言,在这种情况下,恐怕除了把这个模型当成一个“黑盒子”一样的“外挂”以外别无他法。
1700510823
1700510824
在这里我们只尝试使用一种模型进行分析,主要目的是演示分析和建模的过程,以及给出评价模型质量的思路。其他的方式希望读者能触类旁通,自己尝试。
1700510825
1700510826
建立滑动窗口
1700510827
1700510828
建立一个滑动窗口,用这个窗口来捕捉那些在一定时间内涨幅或跌幅达到一定幅值的时间段。在这个环节,首先可以尝试找出在1小时内涨幅超过10点的“小涨”,涨幅超过20点的“大涨”,以及涨幅超过40点的“暴涨”,看看所有的数据中有多少能够满足这样的条件。重复一下:这种假说只是一种假设,肯定还有其他分类方法。
1700510829
1700510830
在字段DT上添加一个索引,以加快检索速度。
1700510831
1700510832
ALTER TABLE EURUSD_1M ADD INDEX IDX_DT(DT);
1700510833
1700510834
编写Python代码,实现滑动窗口。
1700510835
1700510836
#!/usr/bin/pythonimport os,sys,MySQLdb try
: db=MySQLdb.connect(host=‘localhost’, user=‘root’, passwd=‘111111’, db=‘FOREX’) cursor=db.cursor() input_file=open(‘/ml/EURUSD.txt’,‘r’) 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=‘SELECT 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) result1=cursor1.fetchall() if result1[0][0]>=0.0040
: output=‘RISE3’ elif result1[0][0]>=0.0020
: output=‘RISE2’ elif result1[0][0]>=0.0010
: output=‘RISE1’ elif result1[0][1]>-0.0010
: output=‘NONE’ elif result1[0][1]<=-0.0010
: output=‘FALL1’ elif result1[0][1]<=-0.0020
: output=‘FALL2’ elif result1[0][1]<=-0.0040
: output=‘FALL3’ output=startdt + ‘,’ + str(result1[0][0])+ ‘,’ + str(result1[0][1])+ ‘,’ + output + ‘,’ + str(result1[0][2]) print output cursor1.close()except MySQLdb.Error,e
: print “Error %s” %(str(e.args[0])+’
:’+str(e.args[1])) exit(1)cursor.close()db.close()
1700510837
1700510838
这个滑动窗口实现的是:从数据中的第1分钟开始滑动,窗口大小为60分钟,每次滑动1分钟,每次滑动都要看向这一分钟后窗口内的波动情况,查看其中的HIGH和LOW与当前收盘价CLOSE的关系。这种关系大致上分3种情况。
1700510839
1700510840
第1种情况是CLOSE在HIGH与LOW之下,这是一种比较明显的涨势,如图18-13所示。
1700510841
1700510842
1700510843
1700510844
1700510845
图18-13 CLOSE在HIGH与LOW之下
1700510846
1700510847
第2种情况是CLOSE在HIGH与LOW之间,这是一种“震荡”的态势,如图18-14所示。
1700510848
1700510849
[
上一页 ]
[ :1.7005108e+09 ]
[
下一页 ]