前言

最近调研了一下我做的项目受欢迎程度,大数据分析方向竟然排第一,尤其是这两年受疫情影响,大家都非常担心自家公司裁员或倒闭,都想着有没有其他副业搞搞或者炒炒股、投资点理财产品,未雨绸缪,所以不少小伙伴要求我这边分享下关于股票预测分析的技巧。

基于股票数据是一个和时间序列相关的大数据,所以我打算给大家分享时下最受欢迎的时序模型:LSTM、XGBoost两大经典模型

@


一、模型简介

1.1 LSTM神经网络模型

根据百度百科定义:长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络模块的链式形式。在标准RNN中,这个重复的结构模块只有一个非常简单的结构,例如一个tanh层。

LSTM 能够进行一次多步预测,对于时间序列预测有一定的参考价值。LSTM的难点在于配置不方便。



1.2 XGBoost机器学习模型

XGBoost全称是eXtreme Gradient Boosting,根据百度百科定义:XGBoost是一个优化的分布式梯度增强库,旨在实现高效,灵活和便携。它在 Gradient Boosting 框架下实现机器学习算法。XGBoost提供并行树提升(也称为GBDT,GBM),可以快速准确地解决许多数据科学问题。相同的代码在主要的分布式环境(Hadoop,SGE,MPI)上运行,并且可以解决数十亿个示例之外的问题。

可能大家光看定义,不能太理解XGBoost的牛逼之处,了解过Kaggle竞赛的小伙伴应该知道,由于XGBoost 库专注于计算速度和模型性能,因此几乎没有多余的装饰,算法的实现也旨在提高计算时间和内存资源的效率,所以它目前已经在 Kaggle 竞赛数据科学平台上成为竞赛获胜者的首选算法。

例如,有一个不完整的一、二、三等奖获奖名单,标题为: XGBoost: Machine Learning Challenge Winning Solutions。

为了使这一点更加具体,以下是 Kaggle 竞赛获胜者的一些有见地的引述:

作为越来越多的 Kaggle 比赛的获胜者,XGBoost 再次向我们展示了它是一种出色的全能算法。

——拿督优胜者访谈:第一名,疯狂教授

如有疑问,请使用 xgboost。

— Avito 优胜者访谈:第一名,Owen Zhang

我喜欢表现良好的单个模型,我最好的单个模型是 XGBoost,它可以单独获得第 10 名。

—卡特彼勒获奖者访谈:第一名

我只用过 XGBoost。

— Liberty Mutual Property Inspection,优胜者访谈:第一名,王清臣

我使用的唯一监督学习方法是梯度提升,在优秀的 xgboost 中实现。

— Recruit Coupon Purchase 优胜者访谈:第二名,Halla Yang

同时XGBoost 是免费的开源软件,可在 Apache-2 许可下使用,尤其是支持多种接口,如命令行界面 (CLI)、C++(编写库的语言)、Python 接口以及 scikit-learn 中的模型、R 接口以及 caret 包中的模型、Julia、Java 和 JVM 语言(如 Scala)和平台(如 Hadoop)。所以它应用得也越来越广泛,它也是我学习监督机器学习的最重要算法。

关于它的原理实现,我这就不详细介绍了,这篇主要是讲其应用,感兴趣的小伙伴们可以自己搜索学习下,当然你也可以登录它的github地址来详细学习。

二、项目详细介绍

任何一个大数据分析项目,我觉得都应该先了解清楚项目目的,在做分析,所以我们先来简单明确下本次项目的主要目的:

项目目的

本次项目是使用LSTM神经网络模型、XGBoost模型,来对股票数据中的某个关键价格,进行预测分析。数据来源,搜狐财经中的某个可转债Zclose相关数据。

下面我就按照大数据分析的一般步骤给大家演示下具体项目实现过程,该分析步骤基本适用于大部分数据分析流程,觉得有用的小伙伴们可以收藏关注哈。

2.1 导入数据

主要使用Pandas库进行数据导入

import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

all_data_set_path = r'csv_export\csv_data_1m_begin_40d_博22转债_SHSE.113650_SHSE.603916.csv'
all_data_set = pd.read_csv(all_data_set_path)
print(all_data_set.head())
print(all_data_set.info()) #查看有多少数据及特征
print(all_data_set.isnull().sum()) #检查是否有空数据

2.2 研究数据

主要使用matplotlib库对数据进行初步特征研究分析

import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight') # 特征热力图 相关性分析
list_columns = all_data_set.columns
plt.figure(figsize=(15,10))
sns.heatmap(all_data_set[list_columns].corr(), annot=True, fmt=".2f")
plt.show()

从热力图可以大概看出,与zclose相关性比较高的几个特征,接下来就是对特征重要性进行排序,选择出相关性较高的特征。可以看出zlow、zhigh、zopen与zclose特征的相关性最高,都达到了98%左右,所以我们可以优先选取这3个特征,进行分析。

# 对特征重要性进行排序
corr_1 = all_data_set.corr()
corr_1["zclose"].sort_values(ascending=False)

2.3 数据预处理

数据预处理是整个数据分析过程中最重要的一个步骤,都说"数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已"。如果数据和关键特征处理的好,使用不同的模型和算法,都可以取得比较好的效果。

而且数据预处理往往要占整个数据分析的大部分时间,有些甚至占到80%-90%的时间。所以想深入学习大数据分析的小伙伴们,要熟练掌握各种数据预处理的方法哈,比如常用的空值、缺失值、异常值处理、数据不平衡处理、特征组合等等。

由于未来股票受近期股票价格波动的影响较大,所以为了能充分利用近期的股票数据,博主编写了一个预处理函数,组合历史前几次的数据生成更多的特征来进行预测。这也是时序特征数据的常用方法,大概可以理解为滑动窗口取值吧,具体如下:

len_ = len(['zopen','zhigh','zlow','zclose'])*3
col_numbers_drop = []
for i in range(3):
col_numbers_drop.append(len_+i)
print(col_numbers_drop) # 依据特征重要性,选择zlow zhigh zopen来进行预测zclose
# 数据选择t-n, ...., t-2 t-1 与 t 来预测未来 t+1
# 转换原始数据为新的特征列来进行预测,time_window可以用来调试用前几次的数据来预测
def series_to_supervised(data,time_window=3):
data_columns = ['zopen','zhigh','zlow','zclose']
data = data[data_columns] # Note this is important to the important feature choice
cols, names = list(), list()
for i in range(time_window, -1, -1):
# get the data
cols.append(data.shift(i)) #数据偏移量 # get the column name
if ((i-1)<=0):
suffix = '(t+%d)'%abs(i-1)
else:
suffix = '(t-%d)'%(i-1)
names += [(colname + suffix) for colname in data_columns] # concat the cols into one dataframe
agg = pd.concat(cols,axis=1)
agg.columns = names
agg.index = data.index.copy()
# remove the nan value which is caused by pandas.shift
agg = agg.dropna(inplace=False) # remove unused col (only keep the "close" fied for the t+1 period)
# Note col "close" place in the columns len_ = len(data_columns)*time_window
col_numbers_drop = []
for i in range(len(data_columns)-1):
col_numbers_drop.append(len_+i) agg.drop(agg.columns[col_numbers_drop],axis=1,inplace = True) return agg all_data_set2 = all_data_set.copy()
all_data_set2["index"] = pd.to_datetime(all_data_set2["index"]) # 日期object: to datetime
all_data_set2.set_index("index", inplace=True, drop=True) # 把index设为索引 all_data_set2 = all_data_set2[116:] # 这里把7月28日的数据全部删掉了,主要是数据缺失较多 data_set_process = series_to_supervised(all_data_set2,10) #取近10分钟的数据
print(data_set_process.columns.values) print(data_set_process.info())

到此,我们数据集就生成了,接下来就可以搭建模型,训练模型和预测数据了。

2.4 搭建模型

2.4.1 LSTM神经网络模型

我们可以直接使用Tensorflow 和 Keras中封装好的LSTM模型来进行模型搭建,这里要告诉大家的是,之所以很多小伙伴都用python来做数据分析,是因为很多开发者已经用python搭建了各种各样的wheel/package方便大家直接使用。

所以我们就可以直接站在巨人的肩膀上,快速搭建我们需要的各种模型,同时也可以自己对模型进行调参,获取最优参数组合,从而生成一个高精度的数据模型。

这里要注意:LSTM要求数据格式为numpy格式的数组,所以要将pandas的Dataframe数据转换一下,同时LSTM模型对于不同数据范围的特征较为敏感,一般都要进行相同的范围内数据缩放避免预测错误,所以使用了MinMaxScaler进行缩放数据。(也可以使用StandardScaler)。后面数据预测后,再进行数据逆缩放就可以获得最后结果了。

具体模型搭建如下:

# 注意这里要安装Tensorflow 和 Keras才能使用
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data_set_process) # split the train and test data
train_size = int(len(data_set_process) * 0.8)
test_size = len(data_set_process) - train_size
train_LSTM, test_LSTM = scaled_data[0:train_size, :], scaled_data[train_size:len(data_set_process), :] train_LSTM_X, train_LSTM_Y = train_LSTM[:, :(len(data_set_process.columns) - 1)], train_LSTM[:,
(len(data_set_process.columns) - 1)]
test_LSTM_X, test_LSTM_Y = test_LSTM[:, :(len(data_set_process.columns) - 1)], test_LSTM[:,
(len(data_set_process.columns) - 1)] # reshape input to be [samples, time steps, features]
train_LSTM_X2 = np.reshape(train_LSTM_X, (train_LSTM_X.shape[0], 1, train_LSTM_X.shape[1]))
test_LSTM_X2 = np.reshape(test_LSTM_X, (test_LSTM_X.shape[0], 1, test_LSTM_X.shape[1])) print(train_LSTM_X.shape, train_LSTM_Y.shape, test_LSTM_X.shape, test_LSTM_Y.shape)
print(train_LSTM_X2.shape, test_LSTM_X2.shape) # creat and fit the LSTM network
model = Sequential()
model.add(LSTM(50, input_shape=(train_LSTM_X2.shape[1], train_LSTM_X2.shape[2])))
# model.add(LSTM(50))
model.add(Dense(1))
model.compile(loss="mae", optimizer="Adam")
print(model.summary()) #这里是打印模型基本信息 print("start to fit the model")
history = model.fit(train_LSTM_X2, train_LSTM_Y, epochs=50, batch_size=50, validation_data=(test_LSTM_X2, test_LSTM_Y),
verbose=2, shuffle=False) plt.plot(history.history['loss'], label='train') #可视化模型训练的损失函数
plt.plot(history.history['val_loss'], label='test')
plt.legend()
plt.show() model.save('LSTM_model.h5') # 这里保存模型,以便以后可以不用再训练,直接使用 # model的使用
# from tensorflow.keras.models import load_model
# del model # 删除已存在的model
# model = load_model('LSTM_model.h5') # make prediction
yPredict = model.predict(test_LSTM_X2) #进行模型预测,注意这里要进行数据逆缩放,获取最后结果,同时注意逆缩放数据时必须与scaler的数据维度保持一致
print(yPredict.shape)
testPredict = scaler.inverse_transform(np.concatenate((test_LSTM_X, yPredict), axis=1))[:, -1:]



2.4.2 XGBoost模型搭建

XGBoost的模型可以说是非常成熟了,我们可以直接安装xgboost库来搭建模型,博主选了一组初始参数进行模型训练,小伙伴们也可以使用网格搜索GridSearchCV()或者随机搜索RandomizedSearchCV()来进行参数调优操作,具体如下:

import xgboost as xgb
from xgboost import plot_importance, plot_tree train_size = int(len(data_set_process)*0.8)
test_size = len(data_set_process) - train_size
train_XGB, test_XGB = scaled_data[0:train_size,:],scaled_data[train_size:len(data_set_process),:] train_XGB_X, train_XGB_Y = train_XGB[:,:(len(data_set_process.columns)-1)],train_XGB[:,(len(data_set_process.columns)-1)]
test_XGB_X, test_XGB_Y = test_XGB[:,:(len(data_set_process.columns)-1)],test_XGB[:,(len(data_set_process.columns)-1)] # 算法参数
params = {
'booster':'gbtree',
'objective':'binary:logistic', # 此处为回归预测,这里如果改成multi:softmax 则可以进行多分类
'gamma':0.1,
'max_depth':5,
'lambda':3,
'subsample':0.7,
'colsample_bytree':0.7,
'min_child_weight':3,
'slient':1,
'eta':0.1,
'seed':1000,
'nthread':4,
} #生成数据集格式
xgb_train = xgb.DMatrix(train_XGB_X,label = train_XGB_Y)
xgb_test = xgb.DMatrix(test_XGB_X,label = test_XGB_Y)
num_rounds = 300
watchlist = [(xgb_test,'eval'),(xgb_train,'train')] #xgboost模型训练
model_xgb = xgb.train(params,xgb_train,num_rounds,watchlist) #对测试集进行预测
y_pred_xgb = model_xgb.predict(xgb_test)

2.5 数据可视化及评估

数据可视化就相对简单了,类似于我们用excel来生成各种图表,直观地来看数据分布情况。

除了对数据直观展示外,我们也常使用MAPE、MAE、RMSE、R2对数据预测结果准确性进行评估,这里我就简单使用了MAPE(平均绝对误差率)给大家演示,其中LSTM模型下的测试集、训练集的MAPE都在0.07%之内,也就是说准确率在99.9%以上,可以说效果很好了。XGBoost模型的测试集MAPE在1.2%之内,也就是说准确率在98.8%左右,也可以说效果不错。

具体LSTM模型结果可视化及评估如下:

# make prediction
yPredict = model.predict(test_LSTM_X2)
print(yPredict.shape) testPredict = scaler.inverse_transform(np.concatenate((test_LSTM_X, yPredict), axis=1))[:, -1:]
test_LSTM_Y2 = scaler.inverse_transform(np.concatenate((test_LSTM_X, test_LSTM_Y.reshape(len(test_LSTM_Y),1)), axis=1))[:, -1:]
print(testPredict.shape)
# print(testPredict) print("start calculate the mape") mape = np.mean(np.abs(test_LSTM_Y2.flatten()-testPredict.flatten())/test_LSTM_Y2.flatten())*100 # 这里计算测试集预测结果与真实结果的误差率
print('Test LSTM for test set Score:%.6f MAPE' %(mape)) #0.027897%的误差 yPredict_train = model.predict(train_LSTM_X2)
print(yPredict_train.shape)
print(train_LSTM_X2.shape)
trainPredict = scaler.inverse_transform(np.concatenate((train_LSTM_X, yPredict_train), axis=1))[:, -1:]
train_LSTM_Y2 = scaler.inverse_transform(np.concatenate((train_LSTM_X, train_LSTM_Y.reshape(len(train_LSTM_Y),1)), axis=1))[:, -1:] print("start calculate the mape2") mape2 = np.mean(np.abs(train_LSTM_Y2.flatten()-trainPredict.flatten())/train_LSTM_Y2.flatten())*100 # 这里计算训练集预测结果与真实结果的误差率
print('Test LSTM for train set Score:%.6f MAPE' %(mape2)) #0.068852%的误差 plt.plot(train_LSTM_Y2, color = 'red', label = 'Real Price for Train set')
plt.plot(trainPredict, color = 'blue', label = 'Predicted Price for Train set')
plt.title('Zclose Price Prediction for Train set')
plt.xlabel('Time')
plt.ylabel('Sohu Zclose Price')
plt.legend()
plt.show() plt.plot(test_LSTM_Y2, color = 'red', label = 'Real Price for Test set')
plt.plot(testPredict, color = 'blue', label = 'Predicted Price for Test set')
plt.title('Zclose Price Prediction for Test set')
plt.xlabel('Time')
plt.ylabel('Sohu Zclose Price')
plt.legend()
plt.show()

具体XGBoost模型结果可视化及评估如下:

plt.plot(test_XGB_Y, color = 'red', label = 'Real Price for Test set')
plt.plot(y_pred_xgb, color = 'blue', label = 'Predicted Price for Test set')
plt.title('Zclose Price Prediction for Test set')
plt.xlabel('Time')
plt.ylabel('Sohu Zclose Price')
plt.legend()
plt.show() mape_xgb = np.mean(np.abs(y_pred_xgb-test_XGB_Y)/test_XGB_Y)*100
print('XGBoost平均误差率为:{}%'.format(mape_xgb)) #平均误差率为1.1974%

代码

所有数据集、代码都已经上传到我的github,欢迎大家前往fork、下载。

建议

博主有位朋友在大的金融公司专门做量化投资的,他尝试过加入各种相关因子、特征,使用不同的模型,调参来获取最高的准确度,但由于股票、债券、基金这些金融产品都受各种政治、经济、社会等综合因素的影响,经常会有突发情况导致预测出现较大波动。最后他发现,最好的方法是在每天晚上利用当天的数据重新来训练下,往往能获取到最好的模型。

所以说想尝试往量化投资、机器学习大数据分析这块发展的话,一定要根据实际情况,不断地根据最新的数据,去实时更新自己的模型,才能获取到最好的效果。当然也奉劝大家常年不变的真理:金融有风险,投资需谨慎

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》

这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了的更多相关文章

  1. 极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    原文:极限挑战-C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码) 实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方 ...

  2. C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    作者: Aicken(李鸣)  来源: 博客园  发布时间: 2010-09-08 15:00  阅读: 4520 次  推荐: 0                   原文链接   [收藏] 摘要: ...

  3. 今天抠图,Python实现一键换底片!想换什么换什么(附源码)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 生活中我们会拍很多的证件照,有的要求红底,有的是白底,有的是蓝底,今天不通 ...

  4. leaflet 结合 d3.js 实现 geojson 数据地形剖面分析(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  5. PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)

    说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...

  6. 用Python浅析股票数据

    用Python浅析股票数据 本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投资策略. 数据导入 这里将股票数据存储在stockData ...

  7. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  8. 13行代码实现:Python实时视频采集(附源码)

    一.前言 本文是<人脸识别完整项目实战>系列博文第3部分:程序设计篇(Python版),第1节<Python实时视频采集程序设计>,本章内容系统介绍:基于Python+open ...

  9. Python的开源人脸识别库:离线识别率高达99.38%(附源码)

    Python的开源人脸识别库:离线识别率高达99.38%(附源码) 转https://cloud.tencent.com/developer/article/1359073   11.11 智慧上云 ...

  10. 关于js渲染网页时爬取数据的思路和全过程(附源码)

    于js渲染网页时爬取数据的思路 首先可以先去用requests库访问url来测试一下能不能拿到数据,如果能拿到那么就是一个普通的网页,如果出现403类的错误代码可以在requests.get()方法里 ...

随机推荐

  1. OpenGL_Extension_Viewer

    使用OpenGL,查验一下我电脑显卡的相关配置

  2. scala的运算符

    1.算数运算符 与java基本一样,只有个别细节不一样 (1).除法的区别:整数/整数 结果为整数(小数部分直接舍掉了):小数/整数 结果为小数: 例如:val result = 10.0 / 3 p ...

  3. 从xml读取gps数据获取经纬高

    #!/usr/bin/python # -*- coding: UTF-8 -*- from xml.dom.minidom import parse import xml.dom.minidom & ...

  4. layui相关问题总结

    1.layui table回显选中 1) radio: done:function(res, curr, count){ for(var i = 0; i < res.data.length; ...

  5. aop的一些方注释介绍

    //定义切入点 @Pointcut("execution(void com.itheima.dao.BookDao.update())") private void pt2(){} ...

  6. STM32任意引脚模拟IIC

    关于模拟I2C,任意接口都可模拟(未全部测试,可能存在特殊情况). 关于SDA_IN与SDAOUT:如下定义: 举例:#define MPU_SDA_IN() {GPIOA->CRL&= ...

  7. Upload上传组件,上传之后,再次预览下载按钮不见问题

    如图所示红色部分不见了. 解决方式: fileList 代表的是上传后当前文件内容的具体信息名称,该数据决定了上传之后页面展示的内容 this.fileList.push({ uid:remark.i ...

  8. JVM-创建一个对象的详细过程

    Person person=new Person(): 1.现在栈中申请一个自己的栈空间 2.类加载检查 每当使用new操作符创建一个对象时,类加载器都会从常量池中寻找该对象的符号引用,如果找到,则根 ...

  9. python C# DES 加密转换

    import time import base64 import pyDes import binascii def DESEncrypt(desKey, target): key = desKey[ ...

  10. linux命令基本操作

    chmod 命令 : chmod -R 755 tools_command/ 解释 : -R 为递归遍历tools_command文件夹, chmod 755修改权限: 查看所有用户 1.cat /e ...