XGBoost

极端梯度提升(Extreme Gradient Boosting,XGBoost,有时候也直接叫做XGB)和GBDT类似,也会定义一个损失函数。不同于GBDT的是只会用到一阶导数信息,XGBoost会利用泰勒展开式把损失函数展开到二阶之后求导,利用了二阶导数信息,这样在训练集上的收敛就会更快

参数介绍


主要参数 解释
max_depth 数的最大深度,一般值为【3,4,5】
gamma 学习速率,决定收敛速率以及正确率
subsample 训练每棵树时所选样本占总训练集比例
colsample_bytree 训练每棵树时所选特征占据总体特征比例
n_estimators 迭代次数(树的数量)
min_child_weight 最小叶子节点样本权重和,值越大泛化能力越强

项目实战(股票风险走势预测)

方法讨论

其实针对这个问题我知道的最好办法就是用LSTM循环神经网络去处理(但是毕竟我们在讲XGBoost,所以不要在意这些细节【狗头】)

利用XGBoost处理这类时间序列问题我能想到的有两种方法

  1. 将前几天的数据作为特征集,今天的股票close列作为标签,这种方法的优点就是准确率高,但是缺点也很明显,

    他只能预测未来一天。。。。。。

  1. 用当天的股票数据作为特征,当天的close列作为标签,用来训练模型(就像咱们普通的回归预测一样),然后将所有选取的特征各自建立时间序列模型,预测他们未来几天的数据,然后将该数据作为特征集,用训练好的模型predict,得到的就是咱们要预测的未来几天的数据 ,这个方法的优点就是能够预测未来几天的数据嘿嘿,缺点就是正确率不如前者,往后预测的天数越多,误差越大,而且非常麻烦!(这里有一段非常凄惨的故事)

因为时间有限(其实是懒【狗头】),咱们今天用第一种方法来预测(其实是因为懒【狗头保命】)

利用tushare模块导入股票数据

import tushare as ts
#选取股票代码为600000的股票从2020年1月1日到2021年10月28日的数据
data=ts.get_k_data('600000',start='2020-01-01',end='2021-10-28')
#将数据保存到指定路径(不建议像我这样路径含有中文,血的教训呜呜呜)
#这种带有日期的数据建议储存到csv格式而不是excel格式,因为会乱码
data.to_csv(r'C:\Users\74581\OneDrive - xmu\桌面\600000.csv')

  • 得到以下部分数据


  • 咱们先把数据读取回来

import pandas as pd
#将日期设置为index,并且转化为datatime格式(时间序列里一定要转换!!!!)
data=pd.read_csv(r'C:\Users\74581\OneDrive - xmu\桌面\600000.csv',index_col='date',parse_dates=['date'])
  • 导入数据之后我们会发现有一列没有必要的数据,就是code(不要问我为什么* _*),所以在这里我们先把他删掉

data=data.drop(columns='code')

排除异常值

  • 处理完数据的基本操作之后,我们得检查异常值,看看数据方面是否出了一些问题,如果出现了1000一股的数据我们还fit进了模型里,那可就糟糕了(血的教训嘤嘤嘤)

  • 我们可以先用describe函数直接构造

    排除异常值

  • 处理完数据的基本操作之后,我们得检查异常值,看看数据方面是否出了一些问题,如果出现了1000一股的数据我们还fit进了模型里,那可就糟糕了(血的教训嘤嘤嘤)

  • 我们可以先用describe函数直接构造

  • print(data.describe().loc[['min','max','mean'],:])#其实大概检测只要看这三个数据就行啦(菜鸡看法)
  • 得到了以上的数据,最大值和最小值好像都没有差均值太多,也没有出现负值,说明这个数据还是没有什么问题的

数据特征处理

#数据特征处理
base1=data['close']
base2=data.shift(1)
base2.columns=[f'v{j}-1' for j in range(len(data.columns))]
base3=pd.concat([base1,base2],axis=1)
for i in range(2,7):base4=data.shift(i)base4.columns=[f'v{j}-{i}' for j in range(len(data.columns))]base3=pd.concat([base3,base4],axis=1)
base3.dropna(inplace=True)
x=base3.drop(columns=['close'])
y=base3['close']

测试集,训练集的分割

from sklearn.preprocessing import StandardScaler‘
#数据分割
x_train,x_test=x.iloc[:int(len(x)*0.8),:],x.iloc[int(len(x)*0.8):,:]
y_train,y_test=y[:int(len(x)*0.8)],y[int(len(x)*0.8):]

特征选择

#数据特征处理
model1=XGBRegressor()
rfa=RFECV(model1,cv=5,scoring='neg_mean_absolute_error')
rfa.fit(x_train,y_train)
#特征权重数据可视化
plt.bar(x_train.columns,rfa.grid_scores_)
plt.show()

  • 没有出现过拟合的现象,完美!

  • 接下来选取最优特征就行啦!!

    #特征选择
    col_select=x_train.columns[rfa.support_]
    x_train,x_test=x_train.loc[:,col_select],x_test.loc[:,col_select]

数据标准化

#数据标准化
from sklearn.preprocessing import StandardScaler
std=StandardScaler()
std.fit(x_train)
x_train_std,x_test_std=std.transform(x_train),std.transform(x_test)

模型调参

#模型调参
from sklearn.model_selection import GridSearchCV
params=dict(gamma=[0.1,0.5,0.7,0.05],min_child_weight=[1,3,5],subsample=[0.2,0.4,0.7],colsample_bytree=[0.2,0.4,0.7],n_estimators=[100,200,300],max_depth=[3,4,5])
model=GridSearchCV(XGBRegressor(),params,scoring='neg_mean_squared_error',n_jobs=5,cv=5)

模型拟合

#模型拟合
model.fit(x_train_std,y_train)
print(model.best_params_)

结果预测

#结果预测
from sklearn.metrics import mean_absolute_error
plt.plot(y_test.index,y_test,label='True')
y_pred=(model.predict(x_test_std)*0.7+model_.predict(x_test_std)*0.3)
plt.plot(y_test.index,y_pred,label='pred')
plt.title('mae:%.2f'%(mean_absolute_error(y_test,y_pred)))
gca=plt.gca()
mul=plt.MultipleLocator(45)
gca.xaxis.set_major_locator(mul)
plt.legend()
plt.show()

可以看到,在2021年7月2号左右的时候,股票数据比较平稳,模型预测情况也很理想,但是过了一段时间之后股市出现波动(我查阅了相关资料,据说是那段时间颁布了相关政策打击到了白酒行业,导致股票下跌,所以投资还是有风险呀),出现剧烈波动之后的数据预测情况就没有那么理想了,所以时间序列分析最理想的情况就是稳定的数据,像这种股票之类不太稳定的数据,就得用到我们的LSTM模型(个人觉得ARIMA有点过时,毕竟数据准备的时间成本太高了呜呜呜)。mae大概是0.19左右,对于股票预测分析来说,已经很好了,但是,能不能再降低一点呢,我们这里用Stacking聚合一下,看看能不能把mae再降低一点

#导入模型
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor,StackingRegressor
model1=RandomForestRegressor()
model2=GradientBoostingRegressor()
model3=XGBRegressor()
model4=StackingRegressor([('m1',model1),('m2',model3)],cv=5,n_jobs=10)
model4.fit(x_train_std,y_train)
#结果预测
from sklearn.metrics import mean_absolute_error
plt.plot(y_test.index,y_test,label='True')
y_pred=model4.predict(x_test_std)
plt.plot(y_test.index,y_pred,label='pred')
plt.title('mae:%.2f'%(mean_absolute_error(y_test,y_pred)))
gca=plt.gca()
mul=plt.MultipleLocator(45)
gca.xaxis.set_major_locator(mul)
plt.legend()
#置信区间
import scipy.stats as st
num=np.random.normal(loc=y_test.values,scale=np.ones(len(y_test))*0.1,size=(1000,len(y_test)))
l,u=st.t.interval(0.95,len(y_test)-1,loc=np.mean(num,axis=0),scale=np.std(num,axis=0))
plt.fill_between(y_test.index,l,u,alpha=0.4,color='r')
plt.show()

可以看到,我们这里mae下降了6个百分点,说明Stacking在这里还是挺有效的,其实事实上,我们还可以通过GridSearchCV对各个进行Stacking聚合的模型进行进一步调参,但是今天时间不太够【其实是我太懒,毕竟好麻烦qwq

模型的维护和预测

  • 因为时间序列模型需要与时俱进不断迭代数据,所以建议建立好模型之后每隔一段时间再重新给模型拟合一批数据,这个时间根据自己直觉决定(我一般是半个月重新训练一次)

  • 再者,我们一定要保留建立模型时所选择的特征数据以及标准化数据,当我们需要调用建立的模型去预测的时候,需要先用这些数据去处理(千万不要直接上来就直接fit进模型)

  • 这个模型只适合预测未来一天的数据,所以想多预测几天的话,咱们就要用到第二种方法(有时间我也会分享出来嘿嘿)

  • 股市有风险,投资需谨慎。

结束

股票亏了千万不要来找我呜呜呜

XGBoost股票预测相关推荐

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

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

  2. GAN能进行股票预测吗?

    机器学习是未能完全解决的一个领域是股票预测,因为它可能是最有利可图的研究领域之一所以在这方面的研究仍然在继续.投资者希望能够放心地把钱投在表现优异的公司,随着投资的增加,公司的发展也将会突飞猛进,投资 ...

  3. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、xgboost模型预测推理并使用混淆矩阵评估模型、可视化模型预测的概率分布

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.xgboost模型预测推理并使用混淆矩阵评估模型.可视化模型预测的概率分布 目录

  4. 5.6 matlab曲线拟合案例(股票预测问题、算法的参数优化问题)

    1.股票预测问题 已知一只股票在2016年8月每个交易日的收盘价如下表所示,试预测其后面的大体走势. x = [2 3 4 5 8 9 10 11 12 15 16 17 18 19 22 23 24 ...

  5. 【遗传优化BP网络】基于自适应遗传算法的BP神经网络的股票预测MATLAB仿真

    1.软件版本 MATLAB2021a 2.本算法理论知识 通过MATLAB对BP神经网络,基于遗传优化的BP神经网络,基于改进遗传优化的BP神经网络以及基于改进遗传优化的组合BP神经网络等多种算法的股 ...

  6. 深度学习RNN实现股票预测实战(附数据、代码)

    背景知识 最近再看一些量化交易相关的材料,偶然在网上看到了一个关于用RNN实现股票预测的文章,出于好奇心把文章中介绍的代码在本地跑了一遍,发现可以work.于是就花了两个晚上的时间学习了下代码,顺便把 ...

  7. keras实现简单lstm_四十二.长短期记忆网络(LSTM)过程和keras实现股票预测

    一.概述 传统循环网络RNN可以通过记忆体实现短期记忆进行连续数据的预测,但是,当连续数据的序列边长时,会使展开时间步过长,在反向传播更新参数的过程中,梯度要按时间步连续相乘,会导致梯度消失或者梯度爆 ...

  8. 打造属于自己的量化投资系统9——支持向量机SVM算法在股票预测涨跌中应用

    1.支持向量机即SVM原理 支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于分类的范畴.它的原理就是求出"保证距离最近的点,距离它们最远的线&q ...

  9. 基于线性回归的股票预测案例

    基于线性回归的股票预测案例 本次的案例使用的是股票数据,数据源从www.quandl.com 获取.本次案例主要是为了练习线性回归 pip install quandl 安装quandl库. 在使用的 ...

  10. pytorch股票预测

    #导包 import numpy as np import torch from torch.autograd import Variable from sklearn.preprocessing i ...

最新文章

  1. 区块链有哪些技术特征
  2. QT 中 界面中消息的停留时间解决方案 以及 label 中字体大小和换行设置
  3. python3 url编码 空格 + 简介
  4. 为什么全网 都在说 iOS 开发不行了 ?
  5. 腾讯面试--原来bitmap也可以用来排序
  6. linux下桥接模式设置静态IP实现上网
  7. 工具类--Excel 导出poi
  8. Linux系统TCP内核参数优化总结
  9. GitHub推出包管理服务,npm与Nuget全支持
  10. 谷歌、微软、OpenAI等巨头七大机器学习开源项目 看这篇就够了
  11. execel公式 java工具_PAP-快速开发框架:JAVA 计算器 自定义公式 解决EXCEL计算公式问题...
  12. cognos-rs用下拉列表来控制交叉表的显示内容
  13. Mongo DB教程及SQL与Mongo DB查询的映射
  14. Elasticsearch 数据搜索篇
  15. dll文件懒加载_前端性能优化
  16. modify sql_在SQL Server中使用JSON_MODIFY()修改JSON数据
  17. 使用C#进行数据库增删改查(一)
  18. 鲁大师2022年Q1季度电动车报告:市场不断细分,产品白刃战开启
  19. 自然辩证法与计算机科学与技术,自然辩证法与计算机科学技术的研究.pdf
  20. ArcGis 10.2运行提示“未授权”的解决方法

热门文章

  1. 网站文章采集器-万能文章采集器
  2. 2020_ICML_Neuro-Symbolic Visual Reasoning: Disentangling “Visual” from “Reasoning”
  3. PMI权限(授权)管理基础设施
  4. olcd12864的u8g2库_OLED屏显示功能-U8glib库函数大全。
  5. MATLAB变声器程序
  6. Java设计模式——Command模式(容易,次要)
  7. burp 调试_如何开发一个Burp插件
  8. IKexpression解读三
  9. python内置函数可以返回列表、元组_Python内置函数_________可以返回列表、元组、字典、集合、字符串以及range对象中元素个数。...
  10. 操作系统-文件读写过程