打字猴:1.70051098e+09
1700510980
1700510981 这次调整把激励函数改成了Sigmoid函数,目的是引入更多的非线性特征。
1700510982
1700510983 the_time=time.strptime(str(values[0]),”%Y-%m-%d %H:%M:%S”)X_train[line_pointer].append(float(time.strftime(“%H”,the_time)))X_train[line_pointer].append(float(time.strftime(“%m”,the_time)))X_train[line_pointer].append(float(time.strftime(“%w”,the_time)))
1700510984
1700510985 这个部分就是加入了月、星期、小时3个维度后再进行训练。
1700510986
1700510987 ……Train on 2975000 samples, validate on 525000 samplesEpoch 1/1002975000/2975000 [==============================]-15s-loss: 1.5305-acc: 0.4356-val_loss:1.4402-val_acc: 0.4623Epoch 2/1002975000/2975000 [==============================]-13s-loss: 1.5071-acc: 0.4377-val_loss:1.4264-val_acc: 0.4623Epoch 3/1002975000/2975000 [==============================]-13s-loss: 1.5047-acc: 0.4377-val_loss:1.4297-val_acc: 0.4623Epoch 4/1002975000/2975000 [==============================]-13s-loss: 1.5030-acc: 0.4377-val_loss:1.4218-val_acc: 0.4623Epoch 5/1002975000/2975000 [==============================]-13s-loss: 1.5014-acc: 0.4377-val_loss:1.4288-val_acc: 0.4623Epoch 6/1002975000/2975000 [==============================]-13s-loss: 1.5001-acc: 0.4377-val_loss:1.4178-val_acc: 0.4623Epoch 7/1002975000/2975000 [==============================]-13s-loss: 1.4991-acc: 0.4377-val_loss:1.4165-val_acc: 0.4623Epoch 8/1002975000/2975000 [==============================]-13s-loss: 1.4983-acc: 0.4377-val_loss:1.4335-val_acc: 0.4623Epoch 9/1002975000/2975000 [==============================]-13s-loss: 1.4976-acc: 0.4377-val_loss:1.4125-val_acc: 0.4623Epoch 10/1002975000/2975000 [==============================]-13s-loss: 1.4969-acc: 0.4377-val_loss:1.4089-val_acc: 0.4623……Epoch 91/1002975000/2975000 [==============================]-13s-loss: 1.4645-acc: 0.4380-val_loss:1.4858-val_acc: 0.4405Epoch 92/1002975000/2975000 [==============================]-13s-loss: 1.4642-acc: 0.4379-val_loss:1.4997-val_acc: 0.4252Epoch 93/1002975000/2975000 [==============================]-13s-loss: 1.4640-acc: 0.4380-val_loss:1.4827-val_acc: 0.4447Epoch 94/1002975000/2975000 [==============================]-13s-loss: 1.4638-acc: 0.4379-val_loss:1.4780-val_acc: 0.4330Epoch 95/1002975000/2975000 [==============================]-13s-loss: 1.4635-acc: 0.4380-val_loss:1.4947-val_acc: 0.4308Epoch 96/1002975000/2975000 [==============================]-13s-loss: 1.4633-acc: 0.4380-val_loss:1.5014-val_acc: 0.4367Epoch 97/1002975000/2975000 [==============================]-13s-loss: 1.4631-acc: 0.4380-val_loss:1.4762-val_acc: 0.4432Epoch 98/1002975000/2975000 [==============================]-13s-loss: 1.4629-acc: 0.4379-val_loss:1.4838-val_acc: 0.4398Epoch 99/1002975000/2975000 [==============================]-13s-loss: 1.4629-acc: 0.4379-val_loss:1.4888-val_acc: 0.4400Epoch 100/100
1700510988
1700510989 损失函数的值比第1次设计的要小,但准确率没有提升。这说明月、星期、小时3个参考值的加入对模型精度的提升没有帮助。
1700510990
1700510991 (3)第3次尝试
1700510992
1700510993 通过前两次尝试我们发现,这个分类过程对熵减没有太多帮助。为什么这么说呢?如果用训练出来的模型进行回测,会发现绝大部分的样本都集中在波幅最小的那一部分,这一点在下面更细的定量分析中就能看出来。所以,如果希望熵减更为明显,就要引入更多的维度,而且尽量不要将分类设置得太“倾斜”,也就是尽量不要让其中个别分类所占的比例太大。
1700510994
1700510995 我们思考一下:既然预测1小时的情况可能会比较复杂,那么是不是可以考虑将这个时间缩短呢?因为时间越长,混沌所产生的影响就越明显;熵越大,预测难度也就越大。这一次我们试试用15分钟内的波幅来分析。
1700510996
1700510997 建立表SLIDEWINDOW_15M。
1700510998
1700510999 CREATE TABLE SLIDEWINDOW_15M(DT DATETIME,RISE_PIP DECIMAL(10,4),FALL_PIP DECIMAL(10,4),PROPORTION DECIMAL(10,4));
1700511000
1700511001 将分析结果插入这个临时表,编写Python文件slidewindow_15m_insert.py。
1700511002
1700511003 #!/usr/bin/pythonimport os,sys,MySQLdbtry 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_15M 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 15 MINUTE)’    cursor1.execute(sql1)    if i%1000==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()
1700511004
1700511005 在这里,我们填充SLIDESHOW_15M表的逻辑和填充SLIDESHOW表的逻辑相同,只是向后看的周期调整到了15分钟,其他逻辑则没有没变化。
1700511006
1700511007 建立表EURUSD_TRAINING_15M。
1700511008
1700511009 CREATE TABLE EURUSD_TRAINING_15MSELECT   EURUSD_1M.DT,   OPEN,   HIGH,   LOW,   CLOSE,   RISE_PIP,   FALL_PIP,   PROPORTION   FROM   EURUSD_1MINNER JOIN   SLIDEWINDOWONEURUSD_1M.DT=SLIDEWINDOW.DT;
1700511010
1700511011 F和R两个字段分别作为跌幅FALL和涨幅RISE的分类标记,后面很快会用到。
1700511012
1700511013 在进行分类标注之前,我们看一下这15分钟内的涨跌数据都在什么范围内集中。
1700511014
1700511015 mysql> SELECT COUNT(*), F, R FROM(SELECT FALL_PIP DIV 0.0010 AS F, RISE_PIP DIV 0.0010 AS R FROMEURUSD_TRAINING_15M)R GROUP BY F, R;+–––-+––+––+| COUNT(*)| F    | R    |+–––-+––+––+|  3920354 |    0 |    0 ||   571240 |    0 |    1 ||   112985 |    0 |    2 ||    30347 |    0 |    3 ||    10061 |    0 |    4 ||     3834 |    0 |    5 ||     1605 |    0 |    6 ||      858 |    0 |    7 ||      411 |    0 |    8 ||      260 |    0 |    9 ||      169 |    0 |   10 ||      ……|        6 |   16 |    0 ||        3 |   16 |    1 ||       14 |   17 |    0 ||        1 |   17 |    1 ||        2 |   18 |    0 ||        2 |   19 |    1 ||        1 |   20 |    0 ||        1 |   20 |    1 ||        1 |   21 |    0 ||        1 |   21 |    1 ||        1 |   22 |    0 ||        1 |   22 |    7 ||        1 |   23 |    2 |+–––-+––+––+179 rows in set(4.14 sec)
1700511016
1700511017 这是用10个点做分割的最小区间来做的,涨跌幅度看后面的F和R就知道了。例如,“| 3920354 | 0 | 0 |”这一条,表示涨跌都在10个点以内的振幅小且方向不确定的数据超过392万条,占全部样本的72%。不得不说,这个比例实在是太大了,相当于其他178个分类总共才占28%——这是一个非常“倾斜”的分类方式。
1700511018
1700511019 我们可以尝试再做一下细分,用5个点作为一个分档。
1700511020
1700511021 mysql> SELECT COUNT(*), F, R FROM(SELECT FALL_PIP DIV 0.0005 AS F, RISE_PIP DIV 0.0005 AS R FROMEURUSD_TRAINING_15M)R GROUP BY F, R;+–––-+––+––+| COUNT(*)| F    | R    |+–––-+––+––+|  1916865 |    0 |    0 ||   895584 |    0 |    1 ||   334411 |    0 |    2 ||   134729 |    0 |    3 ||    60612 |    0 |    4 ||    29028 |    0 |    5 |……|   894166 |    1 |    0 ||   213739 |    1 |    1 ||    71067 |    1 |    2 ||    31033 |    1 |    3 ||    15198 |    1 |    4 |……|        4 |   34 |    0 ||        1 |   34 |    1 ||        1 |   34 |    3 ||        9 |   35 |    0 ||        1 |   37 |    0 ||        1 |   37 |    1 ||        1 |   38 |    2 ||        1 |   38 |    3 ||        1 |   40 |    0 ||        1 |   40 |    2 ||        1 |   42 |    1 ||        1 |   42 |    3 ||        1 |   44 |    0 ||        1 |   44 |   14 ||        1 |   46 |    4 |+–––-+––+––+513 rows in set(4.31 sec)
1700511022
1700511023 在这个划分中,虽然涨跌都在5个点的分类“| 1916865 | 0 | 0 |”仍然有191万条记录,但是占比已经下降到35%左右。
1700511024
1700511025 下面,我们用其他处理技巧作为辅助,继续这个熵减过程。
1700511026
1700511027 ALTER TABLE EURUSD_TRAINING_15M ADD COLUMN(F INT);ALTER TABLE EURUSD_TRAINING_15M ADD COLUMN(R INT);UPDATE EURUSD_TRAINING_15M SET R=RISE_PIP DIV 0.0005, F=FALL_PIP DIV 0.0005;COMMIT;
1700511028
1700511029 要想给EURUSD_TRAINING_15M这个表上加上标签,可以先画一个表,看看它们的分布是什么样子(如图18-21所示)。
[ 上一页 ]  [ :1.70051098e+09 ]  [ 下一页 ]