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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM