zoukankan      html  css  js  c++  java
  • 日元对人民币汇率的大数据分析与预测

    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()
  • 相关阅读:
    uni-app 版本更新控制
    Chrome为什么打开一个页面,会有4个进程?
    vue 导航栏滚动吸顶
    vue 运行后, sass 报错
    HAProxy——HAProxy、Nginx、LVS优势劣势 (转)
    HAProxy——关于配置的备份
    RabbitMQ——用HAProxy实现负载均衡
    docker——Docker常见问题总结 (转)
    docker——docker容器内存和CPU使用限制
    docker——用docker-compose安装redis
  • 原文地址:https://www.cnblogs.com/axho/p/10201663.html
Copyright © 2011-2022 走看看