1. 程式人生 > >日元對人民幣匯率的大數據分析與預測

日元對人民幣匯率的大數據分析與預測

dynamic layers std adagrad roc cal pyplot 將在 read

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,header = 0, 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,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()

日元對人民幣匯率的大數據分析與預測