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

                    

  • 相关阅读:
    正经学C#_循环[do while,while,for]:[c#入门经典]
    Vs 控件错位 右侧资源管理器文件夹点击也不管用,显示异常
    asp.net core 获取当前请求的url
    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be
    用orchard core和asp.net core 3.0 快速搭建博客,解决iis 部署https无法登录后台问题
    System.Data.Entity.Core.EntityCommandExecution The data reader is incompatible with the specified
    初探Java设计模式3:行为型模式(策略,观察者等)
    MySQL教程77-CROSS JOIN 交叉连接
    MySQL教程76-HAVING 过滤分组
    MySQL教程75-使用GROUP BY分组查询
  • 原文地址:https://www.cnblogs.com/fangzehui/p/10182131.html
Copyright © 2011-2022 走看看