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

日元對人民幣匯率的大資料分析與預測

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()