tushare实战LSTM实现黄金价格预测

文章目录

  • tushare实战LSTM实现黄金价格预测
  • 拉取数据
  • 数据预处理
  • 训练模型
  • 模型预测及查看效果
    • 先看整体情况
    • 选取特定的一小段查看
  • 结果分析

拉取数据

老样子,之前tushare实战分析黄金与美元收益率关系的时候也是这样,注意: pro_api中的东西是tushare的token

# 导入tushare
import tushare as ts
# 初始化pro接口
pro = ts.pro_api('xxx')# 拉取数据
df = pro.fx_daily(**{"ts_code": "XAUUSD.FXCM","trade_date": "","start_date": 20160910,"end_date": 20210910,"exchange": "FXCM","limit": "","offset": ""
}, fields=["ts_code","trade_date","bid_open","bid_close","bid_high","bid_low","ask_open","ask_close","ask_high","ask_low","tick_qty"
])
print(df)
df.set_index('trade_date',inplace=True)
df.to_csv('黄金数据2016-9-10至2021-9-10.csv')

数据预处理

LSTM模型的核心是用一个序列数据去预测未来的数据,序列数据的构造思路: 构造一个队列,将每日的数据视为一个个体,当后一个个体进入队列的时候,就会挤出队首的个体,然后在每个时刻都‘拍照’记录下队列的情况,就可以得到一个三维数据(len, men_day, attribute)其中len是序列的个数,假设数据集中有100条数据,我们将5天作为一个序列,那么就会有100-5+1=96个序列,men_day就是那个5天的5,表示序列的长度,attribute则是原数据的协变量(就是数据的特征);

了解了输入数据后,我们就要处理输出数据,假设我们想用截止到今天的数据去预测未来五天的价格,那么构造训练集的时候,就要将价格数据作为标签,向前shift5天;也就是在一条数据中,除了那些他原本就有的数据,还会多一个5天之后的价格。按照这个思路,写出数据预处理函数,其中deque表示的就是那个队列

mem_his_days就是序列的长度,pre_days就是预测未来几天的价格

def Stock_Price_LSTM_Data_Precesing(df,mem_his_days,pre_days):df.dropna(inplace=True)df.sort_index(inplace=True)df.drop(columns='ts_code',inplace=True)# 将ask_open向前移动了pre_days天df['label'] = df['ask_open'].shift(-pre_days)from sklearn.preprocessing import StandardScalerscaler = StandardScaler()sca_X = scaler.fit_transform(df.iloc[:,:-1])from collections import dequedeq = deque(maxlen=mem_his_days)X = []for i in sca_X:deq.append(list(i))if len(deq)==mem_his_days:X.append(list(deq))X_lately = X[-pre_days:]X = X[:-pre_days]y = df['label'].values[mem_his_days-1:-pre_days]import numpy as npX = np.array(X)y = np.array(y)return X,y,X_lately

训练模型

终于到我们熟悉的调参环节,我调了好一会儿,最终选定的是mem_days、Lstm层数、隐藏层数、隐层神经元个数分别是5、3、2、64,朋友们也可以自己取调一调

pre_days = 5
# mem_days = [5,10,15]
# lstm_layers = [1,2]
# dense_layers = [1,2,3]
# units = [16,32]
mem_days = [5]
lstm_layers = [3]
dense_layers = [2]
units = [64]
from tensorflow.keras.callbacks import ModelCheckpoint
for the_mem_days in mem_days:for the_lstm_layers in lstm_layers:for the_dense_layers in dense_layers:for the_units in units:filepath = './models_only_problem/{val_mape:.2f}_{epoch:02d}_'+f'men_{the_mem_days}_lstm_{the_lstm_layers}_dense_{the_dense_layers}_unit_{the_units}'checkpoint = ModelCheckpoint(filepath=filepath,save_weights_only=False,monitor='val_mape',mode='min',save_best_only=True)X,y,X_lately = Stock_Price_LSTM_Data_Precesing(golden,the_mem_days,pre_days)from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X,y,shuffle=False,test_size=0.1)from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import LSTM, Dense, Dropoutmodel = Sequential()model.add(LSTM(the_units,input_shape=X.shape[1:],activation='relu',return_sequences=True))model.add(Dropout(0.1))for i in range(the_lstm_layers):model.add(LSTM(the_units,activation='relu',return_sequences=True))model.add(Dropout(0.1))model.add(LSTM(the_units,activation='relu'))model.add(Dropout(0.1))for i in range(the_dense_layers):model.add(Dense(the_units,activation='relu'))model.add(Dropout(0.1))model.add(Dense(1))model.compile(optimizer='adam',loss='mse',metrics=['mape'])model.fit(X_train,y_train,batch_size=32,epochs=50,validation_data=(X_test,y_test),callbacks=[checkpoint])

模型会被保存在models_only_problem文件夹下,第一个数值表示的就是预测的精度,越小越好,后面跟的就是那些超参数的值,只要找到前面数值最小的那些超参数的值,固定这些超参数即可,我的mape数值最小是1.66

模型预测及查看效果

将刚才训练好的最好的模型拿下来,加载模型,把需要预测的数据扔进去

先看整体情况

from tensorflow.keras.models import load_model
import matplotlib.pyplot as plt
best_model = load_model('./models_only_problem/1.66_28_men_5_lstm_3_dense_2_unit_64')pre = best_model.predict(X)
print(len(pre))
plt.plot(y,color='red',label='price')
plt.plot(pre,color='green',label='predict')
plt.show()

选取特定的一小段查看

x_time1 = y[200:300]
pre_time1 = pre[200:300]
plt.plot(x_time1,color='red',label='price')
plt.plot(pre_time1,color='green',label='predict')
plt.legend()
plt.show()

结果分析

从总体上看,LSTM的拟合效果还是不错的,可是在一个较短的时间内,预测数据竟然滞后于实际价格,这有可能带来投资的偏差,一种可行的办法就是,在数据中加入更多的属性,数据的质量决定了最终神经网络预测的质量

tushare实战LSTM实现黄金价格预测相关推荐

  1. tushare实战分析美元黄金与美债收益率、利率的关系

    tushare实战分析美元黄金与美债收益率.利率的关系 提示:如果还不知道tushare的小伙伴,我悄悄告诉你们tushare网址 文章目录 tushare实战分析美元黄金与美债收益率.利率的关系 数 ...

  2. 黄金价格预测:如何将时序数据处理成监督学习数据

    背景概述 今天介绍下如何将时序数据处理成监督学习可用的训练样本.比较典型的场景是黄金的原始数据,一般黄金走势数据是由两个字段组成,分别是时间字段和价格字段. 走势图如下: 顺便安利一个黄金数据的下载网 ...

  3. 数据挖掘实战:二手车交易价格预测

    赛题数据 数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量.从中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B,同时会对name.mod ...

  4. LSTM预测黄金价格

    LSTM预测黄金价格 数据代码下载地址见文末 数据说明 Date-日期 Close/Last-收盘价 Volume-成交量 Open-开盘价 High-最高价 Low-最低价 导入数据 import ...

  5. 美元兑人民币汇率对黄金价格的预测

    1. 数据介绍 1.1数据来源 美元兑换人民币的汇率是来自凤凰网财经版块的从2008年1月1日至2013年5月31日的数据,而黄金价格是来自investing.com的从2008年1月1日至2013年 ...

  6. 机器学习项目实战(五) 住房价格预测

    机器学习项目实战系列   住房价格预测 目录 机器学习项目实战系列   住房价格预测 一.概述 二.分析数据 1.数据导入 2.基础统计运算 3.特征观察 4.建立模型 5.分析模型表现 (1)学习曲 ...

  7. 用 Python 机器学习预测黄金价格

    读取黄金 ETF 数据 本文使用机器学习方法来预测最重要的贵金属之一黄金的价格.我们将创建一个线性回归模型,该模型从过去的黄金 ETF (GLD) 价格中获取信息,并返回对第二天黄金 ETF 价格的预 ...

  8. 股票大跌了,只能靠黄金稳住收入了丨用 Python 机器学习预测黄金价格

    读取黄金 ETF 数据 本文使用机器学习方法来预测最重要的贵金属之一黄金的价格.我们将创建一个线性回归模型,该模型从过去的黄金 ETF (GLD) 价格中获取信息,并返回对第二天黄金 ETF 价格的预 ...

  9. 《机器学习实战》8.4 线性回归之乐高玩具套件二手交易价格预测

    <机器学习实战>8.4 线性回归之乐高玩具套件二手交易价格预测 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https: ...

最新文章

  1. 删除隐藏的旧网卡信息的解决办法
  2. [YTU]_2769( 结构体--成绩统计)
  3. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题
  4. 复制类中的属性值到另一个类的相同属性中
  5. Device eth0 does not seem to be present,delaying initialization.
  6. java gnu_GNU/Linux下Java开发环境的安装和配置 | 学步园
  7. Flutter 一个电话样式小控件
  8. 金蝶kis商贸采购单商品代码_金蝶KIS商贸高级版操作常见问题解答
  9. 【数学建模笔记 22】数学建模的模糊数学模型
  10. c语言 库仑计_bq27520电量计的量产设计
  11. 域名ssl证书下载及部署
  12. mysql卸载不干净时,如何干净利索的卸载mysql数据库(完整版)
  13. java企业级进销存管理系统源码
  14. Sublime Text 比较2个文件不同
  15. 火车头采集html5游戏,火车头采集网站内页URL(图文)教程!
  16. 快速在服务器上搭建Halo个人博客
  17. 走向.NET架构设计—第三章—分层设计,初涉架构(后篇)
  18. ERROR: Failed to open zip file. Gradle‘s dependency cache may be corrupt (this sometimes occurs afte
  19. Android JNI 中文字符传递
  20. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.lxw

热门文章

  1. ubuntu18.04 opencv 获取摄像头 (C++/python) 双目摄像头
  2. python长度单位换算用def_计算字段示范
  3. 移动端如何解决video层级最高的问题
  4. 微星GE62 NVIDIA960m 双系统ubuntu16.04 配置caffe-ssd
  5. MSRA前端实习面经
  6. python dns管理平台_python dns服务器
  7. 想要用Python写爬虫但是BeautifulSoup库出锅肿么办?
  8. 如何创建 Ping app 中的 UIViewController 转换动画?
  9. SD卡家族纵览(SD miniSD microSD SDIO)
  10. java 电话号码 打号_java电话号码怎么匹配?