python预测股票价格tushare_Python:tushare获取A股指数数据,使用LSTM进行预测,pythontushare,并...

这篇博客介绍了如何利用Python的tushare库获取A股指数历史数据,并使用LSTM神经网络进行股票价格预测。通过获取上证指数、深圳成指等A股指数数据,进行预处理、训练模型,最终实现对未来股票价格的预测并绘制预测图表。
摘要由CSDN通过智能技术生成

根据tushare官网资料(http://tushare.org/)目前仅支持下面A股指数查询。

指数名称    TS指数代码

上证指数    sh

深圳成指    sz

沪深300指数    hs300

上证50    sz50

中小板    zxb

创业板    cyb

get_zs.py

# coding: utf-8

import pandas as pd

import tushare as ts

dh = ts.get_hist_data('sh', start='2018-01-01')

df = dh.sort_values(by='date')

df.to_csv('shzs.csv')

dh = ts.get_hist_data('sz', start='2018-01-01')

df = dh.sort_values(by='date')

df.to_csv('szzs.csv')

dh= ts.get_hist_data('hs300', start='2018-01-01')

df = dh.sort_values(by='date')

df.to_csv('hs300.csv')

dh = ts.get_hist_data('sz50', start='2018-01-01')

df = dh.sort_values(by='date')

df.to_csv('sz50.csv')

dh = ts.get_hist_data('zxb', start='2018-01-01')

df = dh.sort_values(by='date')

df.to_csv('zxb.csv')

dh = ts.get_hist_data('cyb', start='2018-01-01')

df = dh.sort_values(by='date')

df.to_csv('cyb.csv')

运行 python get_zs.py

https://www.lfd.uci.edu/~gohlke/pythonlibs/

在该网址下找到 tensorflow‑1.9.0‑cp37‑cp37m‑win_amd64.whl

pip install tensorflow-1.9.0-cp37-cp37m-win_amd64.whl

python 3.7 只能用 tf 1.9 也就是说: py 3.7+ tf 1.9 + keras 2.2.0

pip install keras==2.2.0

keras_lstm_1.py

# encoding=utf-8

#数据预处理以及绘制图形需要的模块

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

#构建长短时神经网络需要的方法

from sklearn.preprocessing import MinMaxScaler

from keras.models import Sequential

from keras.layers import Dense, LSTM, BatchNormalization

#需要之前60次的数据来预测下一次的数据

need_num = 60

#训练数据的大小

training_num = 500

#迭代10次

epoch = 10

batch_size = 32

#训练数据的处理,我们选取整个数据集的前500个数据作为训练数据,后面的数据为测试数据

#从csv读取指数 数据

zs = 'hs300'

dataset = pd.read_csv(zs+'.csv')

#我们需要预测收盘价

data = dataset.iloc[:, 3:4].values

print(zs,':',data.shape)

#训练数据就是上面已经读取数据的前500行

training_data = data[:training_num]

#因为数据跨度几年,随着时间增长,数字也随之增长,因此需要对数据进行归一化处理

#将所有数据归一化为0-1的范围

sc = MinMaxScaler(feature_range=(0, 1))

'''

fit_transform()对部分数据先拟合fit,

找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),

然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。

'''

training_data_scaled = sc.fit_transform(X=training_data)

x_train = []

y_train = []

#每60个数据为一组,作为测试数据,下一个数据为标签

for i in range(need_num, training_data_scaled.shape[0]):

x_train.append(training_data_scaled[i-need_num: i])

y_train.append(training_data_scaled[i, 0])

#将数据转化为数组

x_train, y_train = np.array(x_train), np.array(y_train)

#因为LSTM要求输入的数据格式为三维的,[training_number, time_steps, 1],因此对数据进行相应转化

x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))

#构建网络,使用的是序贯模型

model = Sequential()

#return_sequences=True返回的是全部输出,LSTM做第一层时,需要指定输入shape

model.add(LSTM(units=128, return_sequences=True, input_shape=[x_train.shape[1], 1]))

model.add(BatchNormalization())

model.add(LSTM(units=128))

model.add(BatchNormalization())

model.add(Dense(units=1))

#进行配置

model.compile(optimizer='adam', loss='mean_squared_error')

model.fit(x=x_train, y=y_train, epochs=epoch, batch_size=batch_size)

#进行测试数据的处理

#前500个为测试数据,但是将500-60个数据作为输入数据,因为这样可以获取

#测试数据的潜在规律

inputs = data[training_num - need_num:]

inputs = inputs.reshape(-1, 1)

#这里使用的是transform而不是fit_transform,因为我们已经在训练数据找到了

#数据的内在规律,因此,仅使用transform来进行转化即可

inputs = sc.transform(X=inputs)

x_validation = []

for i in range(need_num, inputs.shape[0]):

x_validation.append(inputs[i - need_num:i, 0])

x_validation = np.array(x_validation)

x_validation = np.reshape(x_validation, (x_validation.shape[0], x_validation.shape[1], 1))

#这是真实的股票价格,是源数据的[500:]即剩下的数据的价格

real_stock_price = data[training_num:]

#进行预测

predictes_stock_price = model.predict(x=x_validation)

#使用 sc.inverse_transform()将归一化的数据转换回原始的数据,以便我们在图上进行查看

predictes_stock_price = sc.inverse_transform(X=predictes_stock_price)

#绘制数据图表,红色是真实数据,蓝色是预测数据

plt.plot(real_stock_price, color='red', label=zs+' Stock Price')

plt.plot(predictes_stock_price, color='blue', label='Predicted Stock Price')

plt.title(zs+' Stock Price Prediction')

plt.xlabel('date')

plt.ylabel('Stock Price')

plt.legend()

plt.grid()

plt.show()

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值