日元对人民币汇率的大数据分析与预测
发布时间:2020-12-14 05:17:35 所属栏目:大数据 来源:网络整理
导读:import numpy as np import tensorflow as tf from tensorflow.contrib import rnn import matplotlib.pyplot as plt from tensorflow.contrib.learn.python.learn.estimators.estimator import SKCompat from matplotlib import style import pandas as pd
import numpy as np import tensorflow as tf from tensorflow.contrib import rnn import matplotlib.pyplot as plt from tensorflow.contrib.learn.python.learn.estimators.estimator import SKCompat from matplotlib import style import pandas as pd #数据预处理 #导入数据并查看前五行数据 data = pd.read_excel(‘日元-人民币.xlsx‘,header = 0,sheetname=‘‘日元-人民币‘) data.head() #获取时间及收盘价,这里收盘价可以用其他价格替换,本文预测收盘价。 # time = data.iloc[:,0].tolist() data = data.iloc[:,4].tolist() #观察原数据基本特征。 # style.use(‘ggplot‘) plt.figure(figsize=(16,9)) plt.rcParams[‘font.sans-serif‘] = ‘SimHei‘ ##设置字体为SimHei显示中文 plt.rcParams[‘axes.unicode_minus‘] = False ##设置正常显示符号 plt.title(‘原始数据‘) plt.plot(time,data) plt.show() #标准化 # def data_processing(raw_data,scale=True): if scale == True: return (raw_data-np.mean(raw_data))/np.std(raw_data)#标准化 else: return (raw_data-np.min(raw_data))/(np.max(raw_data)-np.min(raw_data))#极差规格化 #设置基本参数 # ‘‘‘设置隐层神经元个数‘‘‘ HIDDEN_SIZE = 32 ‘‘‘设置隐层层数‘‘‘ NUM_LAYERS = 1 ‘‘‘设置一个时间步中折叠的递归步数‘‘‘ TIMESTEPS = 12 ‘‘‘设置训练轮数‘‘‘ TRAINING_STEPS = 2000 ‘‘‘设置训练批尺寸‘‘‘ BATCH_SIZE = 64#样本生成函数 # def generate_data(seq): X = []#初始化输入序列X Y= []#初始化输出序列Y ‘‘‘生成连贯的时间序列类型样本集,每一个X内的一行对应指定步长的输入序列,Y内的每一行对应比X滞后一期的目标数值‘‘‘ for i in range(len(seq) - TIMESTEPS - 1): X.append([seq[i:i + TIMESTEPS]])#从输入序列第一期出发,等步长连续不间断采样 Y.append([seq[i + TIMESTEPS]])#对应每个X序列的滞后一期序列值 return np.array(X,dtype=np.float32),np.array(Y,dtype=np.float32) #构建lstm模型主体 # ‘‘‘定义LSTM cell组件,该组件将在训练过程中被不断更新参数‘‘‘ def LstmCell(): lstm_cell = rnn.BasicLSTMCell(HIDDEN_SIZE,state_is_tuple=True)# return lstm_cell ‘‘‘定义LSTM模型‘‘‘ def lstm_model(X,y): ‘‘‘以前面定义的LSTM cell为基础定义多层堆叠的LSTM,这里只有1层‘‘‘ cell = rnn.MultiRNNCell([LstmCell() for _ in range(NUM_LAYERS)]) ‘‘‘将已经堆叠起的LSTM单元转化成动态的可在训练过程中更新的LSTM单元‘‘‘ output,_ = tf.nn.dynamic_rnn(cell,X,dtype=tf.float32) ‘‘‘根据预定义的每层神经元个数来生成隐层每个单元‘‘‘ output = tf.reshape(output,[-1,HIDDEN_SIZE]) ‘‘‘通过无激活函数的全连接层计算线性回归,并将数据压缩成一维数组结构‘‘‘ predictions = tf.contrib.layers.fully_connected(output,1,None) ‘‘‘统一预测值与真实值的形状‘‘‘ labels = tf.reshape(y,[-1]) predictions = tf.reshape(predictions,[-1]) ‘‘‘定义损失函数,这里为正常的均方误差‘‘‘ loss = tf.losses.mean_squared_error(predictions,labels) ‘‘‘定义优化器各参数‘‘‘ train_op = tf.contrib.layers.optimize_loss(loss,tf.contrib.framework.get_global_step(),optimizer=‘Adagrad‘,learning_rate=0.6) ‘‘‘返回预测值、损失函数及优化器‘‘‘ return predictions,loss,train_op ‘‘‘载入tf中仿sklearn训练方式的模块‘‘‘ learn = tf.contrib.learn #模型保存 # ‘‘‘初始化LSTM模型,并保存到工作目录下以方便进行增量学习‘‘‘ regressor = SKCompat(learn.Estimator(model_fn=lstm_model,model_dir=‘Models/model_1‘)) #数据处理 # ‘‘‘对原数据进行尺度缩放‘‘‘ data = data_processing(data) ‘‘‘将6900个数据来作为训练样本‘‘‘ train_X,train_y = generate_data(data[0:6900]) ‘‘‘将剩余数据作为测试样本‘‘‘ test_X,test_y = generate_data(data[6889:-1]) #训练数据 regressor.fit(train_X,train_y,batch_size=BATCH_SIZE,steps=TRAINING_STEPS) #预测测试样本 # ‘‘‘利用已训练好的lstm模型,来生成对应测试集的所有预测值‘‘‘ predicted = np.array([pred for pred in regressor.predict(test_X)]) ‘‘‘绘制反标准化之前的真实值与预测值对比图‘‘‘ plt.plot(predicted,label=‘预测值‘) plt.plot(test_y,label=‘真实值‘) plt.title(‘反标准化之前‘) plt.legend() plt.show()#反标准化函数 # ‘‘‘自定义反标准化函数‘‘‘ def scale_inv(raw_data,scale=True): ‘‘‘读入原始数据并转为list‘‘‘ data = pd.read_excel(‘美元-人民币.xlsx‘,sheetname=‘Sheet1‘) data = data.iloc[:,4].tolist() if scale == True: return raw_data*np.std(data)+np.mean(data) else: return raw_data*(np.max(data)-np.min(data))+np.min(data) #反标准化 # sp = scale_inv(predicted) sy = scale_inv(test_y) ‘‘‘绘制反标准化之后的真实值与预测值对比图‘‘‘ plt.figure(figsize=(12,8)) plt.plot(sp,label=‘预测值‘) plt.plot(sy,label=‘真实值‘) plt.title(‘反标准化之后‘) plt.legend() plt.show() #对比图 # p = plt.figure(figsize=(16,9)) ax = p.add_subplot(1,2,1) plt.plot(time[6901:-1],sp) plt.plot(time[0:6900],scale_inv(data[0:6900])) plt.title(‘预测图‘) ax = p.add_subplot(1,2) plt.plot(time,scale_inv(data)) plt.title(‘原图‘) plt.show() #计算准确率 # acc_num = 0 for i in range(len(sy)): if (abs(sp[i]-st[i])) < 0.05: acc_num += 1 print(‘准确率为:‘,acc_num/len(sp)) #预测未来20天的值 # day=20 l=len(data) for i in range(day): P=[] P.append([data[l-TIMESTEPS-1+i:l-1+i]]) P=np.array(P,dtype=np.float32) pre=regressor.predict(P) data=np.append(data,pre) pre=data[len(data)-day:len(data)+1] print(pre) #反标准化的值 print(scale_inv(pre)) #预测图 p = plt.figure() plt.plot(scale_inv(pre)) plt.show() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |