zoukankan      html  css  js  c++  java
  • 人民币对美元汇率的大数据分析与预测【完整代码】

    ## 导入所需的包

    import pandas as pd

    import numpy as np

    import matplotlib.pyplot as plt

    import tensorflow as tf

    tf.reset_default_graph()

    plt.rcParams['font.sans-serif'] = 'SimHei' ##设置字体为SimHei显示中文

    plt.rcParams['axes.unicode_minus'] = False ##设置正常显示符号

    ## 导入所需数据

    df = pd.read_csv('美元-人民币.csv',encoding='gbk',engine='python')

    df['时间'] = pd.to_datetime(df['时间'],format='%Y/%m/%d')

    df = df.sort_values(by='时间')

    df.head()

    ## 用折线图展示数据

    plt.figure(figsize=(12,8))

    plt.title('1999年1月1日到2018年8月21日最高价数据曲线')

    plt.plot(df['时间'],df['高'])

    plt.show()

    ### 提取测试数据

    data = df.loc[:,['时间','高']]

    ## 标准化数据

    data['高'] = (data['高']-np.mean(data['高']))/np.std(data['高'])

    data['高(预)'] = data['高'].shift(-1)

    data = data.iloc[:data.shape[0]-1]

    data.columns = ['time','x','y']

    data.head()

    #获取最高价序列

    data=np.array(df['高'])

    normalize_data=(data-np.mean(data))/np.std(data)  #标准化

    normalize_data=normalize_data[:,np.newaxis]  #增加维度

    #———————————————形成训练集——————————————————

    #设置常量

    time_step=20       #时间步

    rnn_unit=10        #hidden layer units

    batch_size=60      #每一批次训练多少个样例

    input_size=1       #输入层维度

    output_size=1       #输出层维度

    lr=0.0006           #学习率

    train_x,train_y=[],[]   #训练集

    for i in range(len(normalize_data)-time_step-1):

        x=normalize_data[i:i+time_step]

        y=normalize_data[i+1:i+time_step+1]

        train_x.append(x.tolist())

        train_y.append(y.tolist())

    test_x = train_x[len(train_x)-31:len(train_x)-1]

    test_y = train_y[len(train_y)-31:len(train_y)-1]

    X=tf.placeholder(tf.float32, [None,time_step,input_size])    #每批次输入网络的tensor

    Y=tf.placeholder(tf.float32, [None,time_step,output_size])   #每批次tensor对应的标签

    #输入层、输出层权重、偏置

    weights={

             'in':tf.Variable(tf.random_normal([input_size,rnn_unit])),

             'out':tf.Variable(tf.random_normal([rnn_unit,1]))

             }

    biases={

            'in':tf.Variable(tf.constant(0.1,shape=[rnn_unit,])),

            'out':tf.Variable(tf.constant(0.1,shape=[1,]))

            }

    def lstm(batch):  #参数:输入网络批次数目

        w_in=weights['in']

        b_in=biases['in']

        input=tf.reshape(X,[-1,input_size])  #需要将tensor转成2维进行计算,计算后的结果作为隐藏层的输入

        input_rnn=tf.matmul(input,w_in)+b_in

        input_rnn=tf.reshape(input_rnn,[-1,time_step,rnn_unit])  #将tensor转成3维,作为lstm cell的输入

        cell=tf.nn.rnn_cell.BasicLSTMCell(rnn_unit)

        init_state=cell.zero_state(batch,dtype=tf.float32)

    output_rnn,final_states=tf.nn.dynamic_rnn(cell,input_rnn,initial_state=init_state, dtype=tf.float32)  #output_rnn是记录lstm每个输出节点的结果,final_states是最后一个cell的结果

    output=tf.reshape(output_rnn,[-1,rnn_unit]) #作为输出层的输入

        w_out=weights['out']

        b_out=biases['out']

        pred=tf.matmul(output,w_out)+b_out

       

        return pred,final_states

    def train_lstm():

        global batch_size

    pred,_=lstm(batch_size)

    #损失函数

        loss=tf.reduce_mean(tf.square(tf.reshape(pred,[-1])-tf.reshape(Y, [-1])))

        train_op=tf.train.AdamOptimizer(lr).minimize(loss)

        saver=tf.train.Saver(tf.global_variables())

        with tf.Session() as sess:

            sess.run(tf.global_variables_initializer())

            #重复训练100次

            for i in range(100):

                step=0

                start=0

                end=start+batch_size

                  while(end<len(train_x)):                _,loss_=sess.run([train_op,loss],feed_dict={X:train_x[start:end],Y:train_y[start:end]})

                    start+=batch_size

                    end=start+batch_size

                    #每10步保存一次参数

                    if step%10==0:

                        print(i,step,loss_)

                        print("保存模型:",saver.save(sess,'.stock.model'))

                    step+=1

    def prediction():

        pred,_=lstm(1)    #预测时只输入[1,time_step,input_size]的测试数据

        saver=tf.train.Saver(tf.global_variables())

        with tf.Session() as sess:

            #参数恢复

            module_file = tf.train.latest_checkpoint('./')

            saver.restore(sess, module_file)

            #取训练集最后一行为测试样本。shape=[1,time_step,input_size]

            prev_seq=train_x[-31]

            predict=[]

            #得到之后100个预测结果

            for i in range(100):

                next_seq=sess.run(pred,feed_dict={X:[prev_seq]})

                predict.append(next_seq[-1])

          #每次得到最后一个时间步的预测结果,与之前的数据加在一起,形成新的测试样本

                prev_seq=np.vstack((prev_seq[1:],next_seq[-1]))

            #以折线图表示结果

            plt.figure()

            plt.plot(list(range(len(normalize_data))), normalize_data, color='b')

            plt.plot(list(range(len(normalize_data), len(normalize_data) + len(predict))), predict, color='r')

            plt.show()

    with tf.variable_scope('train'):

        train_lstm()

    with tf.variable_scope('train',reuse=True):

        prediction()

                    

  • 相关阅读:
    P3919 【模板】可持久化线段树 1(可持久化数组)
    P3384 【模板】轻重链剖分
    P2680_运输计划
    CSP-S2 T4/P7078 贪吃蛇_set 70pts/100pts(O2)
    SPFA判负环
    P6394 樱花,还有你
    CSP-S2T4/P7078 贪吃蛇
    【模板】单源最短路径(标准版)
    U135649 皇室战争
    【离散数学】实验三 偏序关系中盖住关系的求取及格论中有补格的判定
  • 原文地址:https://www.cnblogs.com/fangzehui/p/10182131.html
Copyright © 2011-2022 走看看