打字猴:1.700511054e+09
1700511054 tail-3500000 record_15M.txt >> record_15M_3500000.txt
1700511055
1700511056 编辑训练文件train_1.py。
1700511057
1700511058 from keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activationfrom keras.optimizers import SGDimport os,sys,timeimport numpy as npprint “Start to generate network”model=Sequential()model.add(Dense(120, input_dim=63))model.add(Activation(‘sigmoid’))model.add(Dense(80, input_dim=100))model.add(Activation(‘sigmoid’))model.add(Dense(60, input_dim=70))model.add(Activation(‘sigmoid’))model.add(Dense(50, input_dim=120))model.add(Activation(‘sigmoid’))model.add(Dense(40, input_dim=50))model.add(Activation(‘sigmoid’))model.add(Dense(30, input_dim=40))model.add(Activation(‘sigmoid’))model.add(Dense(12, input_dim=30))model.add(Activation(‘softmax’))model.compile(loss=‘categorical_crossentropy’, optimizer=‘rmsprop’, metrics=[‘accuracy’])print “start to load data”records=open(‘./record_15M_3500000.txt’,‘r’)X_train=[]y_train=[]line_pointer=-1for line in records.readlines() line_pointer=line_pointer + 1  X_train.append([])  y_train.append([])  values=line.split(‘,’)  if(line_pointer<=14):    line_length=line_pointer  else:    line_length=14  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)))  X_train[line_pointer].append(float(values[1]))  X_train[line_pointer].append(float(values[2]))  X_train[line_pointer].append(float(values[3]))  X_train[line_pointer].append(float(values[4]))  for j in range(line_length):    X_train[line_pointer].append(X_train[line_pointer-1][j*4+4])    X_train[line_pointer].append(X_train[line_pointer-1][j*4+5])    X_train[line_pointer].append(X_train[line_pointer-1][j*4+6])    X_train[line_pointer].append(X_train[line_pointer-1][j*4+7])  for i in range(63-len(X_train[line_pointer])):    X_train[line_pointer].append(0)  for k in range(12):    y_train[line_pointer].append(0)  y_train[line_pointer][int(values[8])]=1  if line_pointer%10000==0:    print line_pointerprint “start training”#print X_train[0]#print X_train[100]model.fit(X_train, y_train, nb_epoch=20, batch_size=2000, validation_split=0.15)json_string=model.to_json()open(‘./my_model_architecture_1.json’, ‘w’).write(json_string)model.save_weights(‘./my_model_weights_1.h5’)pre=model.predict(X_train)predicted=np.zeros((12,12))for i in range(len(pre)) max_train=0  max_pre=0  for m in range(12):    if(y_train[i][m]==1):      max_train=m  for m in range(12):    if(pre[i][max_pre] < pre[i][m]):      max_pre=m  predicted[max_train][max_pre]=predicted[max_train][max_pre] + 1for i in range(12) for j in range(12):    print predicted[i][j],  print ””
1700511059
1700511060 这段代码只执行了20轮,执行后会输出下面的内容。
1700511061
1700511062 Train on 2975000 samples, validate on 525000 samplesEpoch 1/202975000/2975000 [==============================]-14s-loss: 1.8795-acc: 0.3742-val_loss:1.6941-val_acc: 0.4185Epoch 2/202975000/2975000 [==============================]-14s-loss: 1.8547-acc: 0.3751-val_loss:1.6928-val_acc: 0.4185Epoch 3/202975000/2975000 [==============================]-14s-loss: 1.8531-acc: 0.3751-val_loss:1.6813-val_acc: 0.4185Epoch 4/202975000/2975000 [==============================]-14s-loss: 1.8504-acc: 0.3751-val_loss:1.6750-val_acc: 0.4185Epoch 5/202975000/2975000 [==============================]-14s-loss: 1.8476-acc: 0.3750-val_loss:1.6702-val_acc: 0.4185Epoch 6/202975000/2975000 [==============================]-14s-loss: 1.8458-acc: 0.3750-val_loss:1.6696-val_acc: 0.4180Epoch 7/202975000/2975000 [==============================]-14s-loss: 1.8448-acc: 0.3751-val_loss:1.6637-val_acc: 0.4187Epoch 8/202975000/2975000 [==============================]-14s-loss: 1.8439-acc: 0.3752-val_loss:1.6783-val_acc: 0.4174Epoch 9/202975000/2975000 [==============================]-14s-loss: 1.8428-acc: 0.3752-val_loss:1.6555-val_acc: 0.4186Epoch 10/202975000/2975000 [==============================]-14s-loss: 1.8415-acc: 0.3752-val_loss:1.6528-val_acc: 0.4186Epoch 11/202975000/2975000 [==============================]-14s-loss: 1.8405-acc: 0.3752-val_loss:1.6534-val_acc: 0.4185Epoch 12/202975000/2975000 [==============================]-14s-loss: 1.8398-acc: 0.3753-val_loss:1.6525-val_acc: 0.4185Epoch 13/202975000/2975000 [==============================]-14s-loss: 1.8391-acc: 0.3753-val_loss:1.6504-val_acc: 0.4186Epoch 14/202975000/2975000 [==============================]-14s-loss: 1.8384-acc: 0.3754-val_loss:1.6573-val_acc: 0.4186Epoch 15/202975000/2975000 [==============================]-14s-loss: 1.8376-acc: 0.3754-val_loss:1.6475-val_acc: 0.4185Epoch 16/202975000/2975000 [==============================]-14s-loss: 1.8366-acc: 0.3754-val_loss:1.6498-val_acc: 0.4186Epoch 17/202975000/2975000 [==============================]-14s-loss: 1.8348-acc: 0.3754-val_loss:1.6688-val_acc: 0.4168Epoch 18/202975000/2975000 [==============================]-14s-loss: 1.8321-acc: 0.3756-val_loss:1.6759-val_acc: 0.4167Epoch 19/202975000/2975000 [==============================]-13s-loss: 1.8280-acc: 0.3760-val_loss:1.6991-val_acc: 0.4127Epoch 20/202975000/2975000 [==============================]-13s-loss: 1.8239-acc: 0.3762-val_loss:1.7493-val_acc: 0.407727434.0 144944.0 0.0 0.0 0.0 197.0 0.0 0.0 0.0 0.0 0.0 0.028574.0 1305778.0 0.0 0.0 9.0 1268.0 0.0 0.0 0.0 0.0 0.0 0.01115.0 5092.0 0.0 0.0 0.0 5.0 0.0 0.0 0.0 0.0 0.0 0.01067.0 5173.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.017999.0 533833.0 0.0 0.0 5.0 1337.0 0.0 0.0 0.0 0.0 0.0 0.017493.0 528829.0 0.0 0.0 36.0 1471.0 0.0 0.0 0.0 0.0 0.0 0.013725.0 205288.0 0.0 0.0 0.0 728.0 0.0 0.0 0.0 0.0 0.0 0.013521.0 202727.0 0.0 0.0 10.0 713.0 0.0 0.0 0.0 0.0 0.0 0.015244.0 135881.0 0.0 0.0 0.0 375.0 0.0 0.0 0.0 0.0 0.0 0.014773.0 134573.0 0.0 0.0 0.0 416.0 0.0 0.0 0.0 0.0 0.0 0.08522.0 61368.0 0.0 0.0 0.0 125.0 0.0 0.0 0.0 0.0 0.0 0.08434.0 61777.0 0.0 0.0 0.0 141.0 0.0 0.0 0.0 0.0 0.0 0.0
1700511063
1700511064 为了展示得清晰一些,我们把这个表格放到Excel里面去,如图18-22所示。
1700511065
1700511066
1700511067
1700511068
1700511069 图18-22 20轮训练
1700511070
1700511071 纵轴表示训练集中的类别标示,横轴表示实际预测时得到的类别标识。这样,每个单元格的含义就很明确了。以纵轴为“2”、横轴为“1”的5092这个单元格为例,表示有5092个原本被标记为“2”类在模型做判断的过程中被判断为“1”类的误判情况。而横轴为“1”、纵轴为“1”的“1305778”的含义是,有1305778个样本应为“1”类,并被判断为“1”类,属于正确识别的情况。理论上讲,应该是对角线上深色单元格中的数值越大越好。在这个模型中,经过20轮迭代后,判断正确的样本数量为1334688个,只占约38%。在这个阶段,可以通过增大轮数让算法继续收敛。
1700511072
1700511073 为了让收敛速度加快,可以使用ReLU作为激励函数。修改这个部分。
1700511074
1700511075 model=Sequential()model.add(Dense(120, input_dim=63))model.add(Activation(‘relu’))model.add(Dense(80, input_dim=100))model.add(Activation(‘relu’))model.add(Dense(60, input_dim=70))model.add(Activation(‘relu’))model.add(Dense(50, input_dim=120))model.add(Activation(‘relu’))model.add(Dense(40, input_dim=50))model.add(Activation(‘relu’))model.add(Dense(30, input_dim=40))model.add(Activation(‘relu’))model.add(Dense(12, input_dim=30))model.add(Activation(‘softmax’))
1700511076
1700511077 将训练的轮数变为150轮,并将验证集比例调整到35%。
1700511078
1700511079 model.fit(X_train, y_train, nb_epoch=150, batch_size=2000, validation_split=0.35)
1700511080
1700511081 在训练结束后,处理一下输出数据,如图18-23所示。
1700511082
1700511083
1700511084
1700511085
1700511086 图18-23 150轮训练
1700511087
1700511088 这次训练的数据变化很明显。在这个模型中,从模型标记的角度来看,应该是“0”和“1”以外的类别识别正确率越高越好。尽管结果还是很不理想,但比只进行20轮训练时已经有了进步,熵减的方向没错——让分类结果向对角线集中。
1700511089
1700511090 4.未尽步骤
1700511091
1700511092 在这个实践中仍有一些步骤没有进行,这也是沿着数据科学的试探步骤逐步深入的过程。
1700511093
1700511094 (1)引入更多的维度对这个模型进行改进。如果是基于压力均线的理论,还需要引入更久以前的数据,而不只是前15分钟的数据。此外,可以尝试采取其他分类方式或者引入特征值。例如,可以尝试使用其他分类的分界点,分界点的位置和分类的类别数量一定会影响分类效果,在刚刚的第3次尝试中,我们已经看到了实例。对于特征值的引入,例如我们在第2次尝试中加入的“小时”、“周”、“月”3个特征,虽然没有看到明显的效果,但仍然可以继续尝试,甚至尝试引入其他相关指标。
1700511095
1700511096 (2)尝试调整不同周期的观察尺度。理论上说,建议缩短观察周期,如果能拿到秒级的数据,就可以通过尝试观察1分钟之内的变化及未来1分钟之内的波幅来做分类。交易高频化应该是自动交易的趋势,毕竟高频的交易容易产生快速验证,而且也能发挥短时交易中机器在下单与平仓方面的效率优势。
1700511097
1700511098 (3)在模型训练基本成熟之后,就可以考虑在MT4平台上用MQL语言编写脚本,进行历史数据回测。在历史数据回测基本满足要求之后,就可以考虑在虚拟仓上进行交易。如果仍然没有发现问题,就可以考虑进行实仓交易了。对每一单交易,都要根据历史K线统计数据,设置相对较低的止盈和止损位置。
1700511099
1700511100 (4)为了降低真实交易的风险,还要考虑在多平台、多个货币对上分别训练模型。将大额资金投入分摊到多个平台、多个货币对的交易中去,以降低平台级风险及由单个货币对产生的波动风险。
1700511101
1700511102 在自动交易系统的研究路上,还有很多需要讨论的内容。例如,新闻中的文字和走势的关系也可以通过相应的算法引入模型,对模型分类的准确性进行提升。
1700511103
[ 上一页 ]  [ :1.700511054e+09 ]  [ 下一页 ]