首页 > 编程语言 >【视频讲解】Python用LSTM、Wavenet神经网络、LightGBM预测股价

【视频讲解】Python用LSTM、Wavenet神经网络、LightGBM预测股价

时间:2024-07-31 18:51:01浏览次数:14  
标签:LightGBM Python 股票 模型 Wavenet 因子 选股 数据

原文链接:https://tecdat.cn/?p=37184

原文出处:拓端数据部落公众号 

分析师:Yuyan Ye

在金融科技的浪潮中,量化投资方法以其数据驱动和模型导向的特性,日益成为资本市场分析的重要工具。
特别是,长短期记忆网络(LSTM)、Wavenet以及LightGBM等先进的机器学习算法,因其在时间序列预测中的卓越性能,被广泛应用于股票价格预测领域。LSTM作为一种特殊的循环神经网络,擅长捕捉时间序列数据中的长期依赖关系[1]。而Wavenet,最初设计用于生成原始音频波形[2],其在金融市场的非线性模式识别中也展现出了潜力。此外,LightGBM作为一种基于梯度提升决策树的算法,以其训练速度快、效率高而受到量化投资者的青睐[3]。

本文将通过视频讲解,展示如何基于 LightGBM 的多因子选股策略,并结合一个Python用LSTM、Wavenet、LightGBM预测股价的代码数据,为读者提供一套完整的实践数据分析流程。

基于 LightGBM 的多因子选股策略

在科学技术高速发展及计算机领域重大突破的背景下,金融量化事业蓬勃兴起。本文聚焦国内量化投资环境,以沪深 300 成分股 2014 年 1 月至 2020 年 12 月的 26 个因子数据为基础,构建多因子选股模型。模型构建涵盖数据预处理、因子筛选、模型参数寻优、模型构建与结果分析及优化等环节。该模型基于 LightGBM 算法,以沪深 300 成份股为备选股票池,旨在筛选出具有投资价值的股票。总体而言,此多因子选股模型能够持续获取正收益。

目录

股票作为一种所有权凭证,公司发行股票旨在筹集资金并向股民承诺分红。自股票诞生以来,尽管股票投资风险较大,但相较于债券和基金投资,其灵活性强、门槛低且收益潜力高,深受广大投资者青睐。然而,我国股票市场种类繁多,如何在当前背景下实现股票投资并获取稳定超额收益,成为投资者和学者的重要研究课题。

量化投资与传统定性投资的理论基础相似,均旨在构建能把握市场趋势、获取额外或超额收益的投资组合。二者的核心差异在于选股方式,量化投资凭借算法和模型学习投资经验,借助强大计算能力的计算机选股,而传统投资依赖主观经验。凭借计算机的运算能力和机器学习模型算法优势,量化投资在资本市场上有望大放异彩,成为投资领域的重大创新。

原理

本文选用基于 LightGBM 算法的多因子选股模型。LightGBM 是 boosting集合模型之一,可高效实现 GBDT。它采用损失函数的负梯度作为当前决策树的残差近似值,用以拟合新的决策树。

优点

与原理和功能相近的 XGBoost 相比,LightGBM 具有内存占用低、训练效率高、准确率优、支持并行化学习、可处理大规模数据以及直接支持类别特征等诸多优势。

大多数机器学习工具无法直接支持类别特征,需转化为 one-hotting 特征,影响效率。而 LightGBM 优化了对类别特征的支持,可直接输入,且在决策树算法中增加类别特征决策规则。

在特征并行方面,不同机器在不同特征集合上寻找最优分割点并同步;数据并行则是本地构造直方图后全局合并寻找最优点。LightGBM 针对这两种并行方法均做了优化,特征并行中本地保存全部数据避免通信,数据并行中分散规约降低通信和计算量,利用Histogram 做差进一步减少通信量。

本文通过聚宽平台的数据接口获取沪深 300 指数成份股上市公司 2014 年 1 月至 2020 年 12 月的相关财务数据。聚宽平台是量化交易平台,提供专业清洗的数据及常用因子和第三方数据库,还提供专用数据接口。

本文每月对沪深 300 股票进行如下处理:

  1. 删除上市不足 3 个月的股票数据,因其股价变动大。

  2. 删除截面期停牌的股票数据,停牌期间不交易。

  3. 剔除历史上被特别处理的股票,因其股价变动大且有退市风险。

  4. 对缺失值按聚宽行业分类用行业均值填充。

  5. 进行中性化和标准化处理。

经上述预处理,最终获得 5040 只股票数据。

在资本市场中,股票超额收益由不同因子共同作用产生,因子选取对选股模型至关重要。为充分解释股票超额收益,本文从多维度选取 26 个合理因子,并分为六类:

  1. 成长因子:包括营业收入同比增长率、经营活动中产生的现金流量净额入同比增长率、净利润同比增长率,代表公司实力和发展前景。

  2. 估值因子:包括净利润现金含量/总市值、净利润同比增长率/市盈率、市盈率的倒数、市净率的倒数、市销率的倒数和净资产收益率,反映股票市场价值。

具体因子描述和选择原因见表 1。

表 1 26 因子介绍

分类 具体指标 指标描述
成长因子 净利润同比增长率(Profit_G_q) 净利润增长率指企业当期净利润比上期净利润的增长幅度,指标值越大代表企业盈利能力越强。
营业收入同比增长率(Sales_G_q) 营业收入增长率指企业在一定期间内取得的营业收入与其上年同期营业收入的增长的百分比,以反映企业在此期间内营业收入的增长或下降等情况。  
经营活动中产生的现金流量净额同比增长率(OCF_G_q) 是经营现金毛流量扣除经营营运资本增加后企业可提供的现金流量,是本期经营活动现金净流量减去上期经营活动现金净流量占上期经营活动现金净流量。经营活动现金净流量能够反映出的财务状况,是对经营活动现金净流量进行操纵的手段。  
估值因子 净利润现金含量/总市值(OCFP) 净利润现金含量指生产经营产生的净现金流量占净利润的百分比。净利润现金含量越大,说明销售收集能力越强,成本越低,财务压力越小。
净利润同比增长率/市盈率(G/PE) 净利润指利润总额减所得税后的余额,是当年实现的可供出资人(股东)分配的净收益,也称为税后利润。它是一个企业经营的最终成果  
市盈率的倒数(EP) 市盈率是股票价格除以每股收益的比率。市盈率反映了在每股盈利不变的情况下,当派息率为 100%,并且所得股息没有进行再投资的条件下,经过多少年投资可以通过股息全部收回。  
市净率的倒数(BP) 市净率是指股价除以每股净资产的比率。 市净率可用于股票投资分析,一般来说市净率较低的股票,投资价值较高,相反,则投资价值较低。  
市销率的倒数(SP) 市销率是总市值除以主营业务收入的值,市销率越低,说明该公司股票的投资价值越大。  
净资产收益率(ROE) 净资产收益率是净利润与平均股东权益的百分比,是公司税后利润除以净资产得到的百分比率,该指标可以很好地反映出股东权益的收益水平,体现了自有资本获得净收益的能力,一般用以衡量公司自有资本的使用效率。  
财务质量因子 资产收益率(ROA) 资产收益率是税后净利润占总资产的百分比,是用来衡量每单位资产创造多少净利润的指标。资产收益率是业界应用最为广泛的衡量银行盈利能力的指标之一,该指标越高,表明企业资产利用效果越好,说明企业在增加收入和节约资金使用等方面取得了良好的效果。
扣除非经常损益后的净利润率(profit_margin) 扣除非经常损益后的净利润率是净利润率指标的补充,剔除非经常性损益对净利润带来的影响,能够比较真实客观地反映企业的实际业务盈利能力,是在分析企业业务盈利能力时常用的指标之一。  
总资产周转率(asset_turnover) 资产周转率是企业一定时期的销售收入净额与平均资产总额之比,它是衡量资产投资规模与销售水平之间配比情况的指标,可以很好地体现企业经营期间全部资产从投入到产出的流转速度并反映企业全部资产的管理质量和利用效率。  
净利润现金含量(net_operating_cash_flow) 净利润现金含量指生产经营产生的净现金流量占净利润的百分比。净利润现金含量越大,说明销售收集能力越强,成本越低,财务压力越小。  
净资产(net_assets) 净资产代表公司本身拥有的财产,也是股东们在公司中的权益。因此,又叫作股东权益。在会计计算上,相当于资产负债表中的总资产减去全部债务后的余额。  
杠杆因子 流动比率(current_ratio) 流动比率是指流动资产总额占流动负债总额的百分比。流动比率用来衡量企业流动资产在短期债务到期以前,可以变为现金用于偿还负债的能力。虽然流动比率越高,企业资产的流动性越大,但是比率太大表明流动资产占用较多,会影响经营资金周转效率和获利能力。
财务杠杆比率(financial_leverage) 财务杠杆是指企业利用负债来调节权益资本收益的手段。财务杠杆比率指反映公司通过债务筹资的比率。  
非流动负债/净资产(debt_quity_ratio) 非流动负债是指偿还期在 1 年或超过 1 年的一个营业周期以上的债务,包括长期借款、应付债券、长期应付款等。除以净资产,反映了企业的非流动还债能力。  
现金比率(cash_ratio) 现金比率是在企业因大量赊销而形成大量的应收账款时,考察企业的变现能力时所运用的指标,是货币资金与有价证券之和占流动负债的百分比。现金比率越高,说明变现能力越强  
技术因子 相对强弱指标(RSI) 其原理就是通过计算股价涨跌的幅度来推测市场运动趋势的强弱度,并据此预测趋势的持续或者转向。实际上它显示的是股价向上波动的幅度占总的波动幅度的百分比,如果其数值大,就表示市场处于强势状态,如果数值小,则表示市场处于弱势。
离差值(DIF) 10 日 EMA 数值减去 30 日 EMA 数值。在持续的涨势中,10 日 EMA 在 30 日 EMA 之上。其间的正差离值(+DIF)会愈来愈大。反之在跌势中,差离值可能变负(-DIF)也愈来愈大。  
DEA DIF 的 15 日移动平均  
异同移动平均线(MACD) 利用收盘价的短期指数移动平均线与长期指数移动平均线之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标。  
其他因子 流动性因子(liquidity) 换手率也称“周转率”,指在一定时间内市场中股票转手买卖的频率,是反映股票流通性强弱的指标之一。在技术分析的诸多工具中,换手率指标是反映市场交投活跃程度最重要的技术指标之一。因此,在本模型中,我们也把其作为因子之一。
贝塔因子(beta) 是由个股 60 个月收益与上证综指回归得到的 beta 值。Beta 因子可以用于衡量系统性风险大小,因此有必要将这一因子加入到模型中。  
动量因子(momentum) 是个股过去 N 个时间窗口的收益回报。  

为构建多因子量化模型,需三类数据:预训练数据、模型训练数据和预测数据。前两类为有标签股票数据,预测数据无标签。(见表 2)2014 年 1 月至 2020 年 12 月期间,每月为一截面,获取相应股票的 26 个因子数据。2014 - 2018 年数据中,标签依据各股票下月日度收益率均值评定:若下月日度收益率均值位于所有股票前 30,则设为 1;若位于后 30,设为 -1;其余舍去。如此处理,每个截面期可得 60 条数据。

表 2 数据集分类及用途

数据类型 数据时间 数据作用 数据描述
预训练数据 2014 年 1 月 - 2017 年 12 月 调整模型超参数,完成模型基本设定 两类股票:该月份涨幅前三十的股票取为 1,涨幅后三十的股票取为 -1
模型训练数据 2018 年 1 月 - 2020 年 11 月 取每月调仓前前 4 个月到前 1 个月共三个月的数据,代入模型进行训练  
预测数据 2018 年 1 月 - 2020 年 12 月 取每月调仓前当月数据,代入之前训练好的模型进行预测上涨的股票 沪深 300 只股票,无数据标签

本文先以 2014 年 1 月至 2017 年 12 月的预训练数据调整 LightGBM 模型的最优参数。

参数调优在机器学习领域至关重要,因很多模型算法无解析解,需通过多种方法求解参数。其主要目的是改进模型,调整参数,使模型预测表现更优,以实现选股目标。虽非本文重点,但可提升模型表现,是建模不可或缺的环节。本文对每组超参数进行交叉验证,选取评分最高的超参数用于进一步模型训练。

预训练得到的最优参数设置如表 4 所示,模型最佳得分为 0.605148,精确度尚可。

表 4 预训练数据下的模型最优参数

为进一步检验量化选股模型的实用性和收益率,本文通过历史数据训练模型并选出高收益股票,在模拟炒股平台测试选股收益。具体流程为:每次训练时,滚动取前 4 个月数据,如 2018 年 1 月 31 日选股,选取 2017 年 10 月至 2018 年 1 月数据,用 2017 年 10 月至 12 月训练模型,代入 2018 年 1 月 300 支股票数据预测,选出概率大于 0.8 的股票进行模拟炒股投资。


由上图可知,本策略收益率为 186.49%,年化收益率为 43.40%,超额收益率为 121.60%,基准收益率为 29.29%。策略收益后期高于沪深 300 指数收益率。总体而言,此多因子选股模型能够持续获取正收益。

可观察到,尽管三年策略总收益达 186.49%,但直至 2019 年 10 月 24 日之前,策略效果不显著,且回撤一度达 33.35%。为降低策略下行风险,进行优化并设置不同止损策略。

设置 10%的止损策略:对跌破成本价 10%的股票予以清仓。


可观察到策略回撤从 33%降至 28%。

止盈止损策略采用动态止盈止损:对当前股价低于持股期间最高价的百分之五的股票平仓,以严格控制股票收益回撤。


可观察到策略最大回撤进一步降至 19%,但策略收益大幅下降,因该止损策略可能错过股票池中某些股票的回升期。

LSTM、Wavenet、LightGBM预测苹果公司股价

1. 数据加载与可视化

首先,我们加载并可视化了苹果公司(AAPL)的股票价格数据集。通过使用Pandas库,我们读取了CSV文件,并使用head函数展示了数据集的前几行,以确保数据的完整性和准确性。

 
  1.   df = pd.read_csv("/content/drive/MyDrive/Github/Time-series_price_analysis/dataset/AAPL.csv")
  2.   df.head()
 


接下来,我们使用Matplotlib库绘制了股票收盘价随时间变化的图表,以60%的透明度和自动调整的尺寸,为读者提供了一个直观的视角来理解数据的波动性。

 
  1.   plt.figure(figsize=(20,8))
  2.   plt.plot(date, close)
 

2. 数据预处理

在数据预处理阶段,我们采用了最小-最大归一化方法来缩放数据,确保所有特征值都位于0到1的范围内。这有助于改善模型的性能,特别是在处理具有不同量级的数据时。

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


此外,我们将数据集划分为训练集和测试集,其中训练集占总数据的79.5%,以确保模型在足够多的数据上进行训练,同时保留足够的数据用于评估模型的泛化能力。

train_size = int(len(close)*0.795)

3. 模型评估

在模型评估阶段,我们使用了长短期记忆网络(LSTM)对训练集和验证集进行了预测。预测结果与实际数据的对比,为我们提供了模型性能的初步评估。

 
  1.   lstm_train_predicton = loaded_lstm.predict(lstm_trainx)
  2.   lstm_val_prediction = loaded_lstm.predict(lstm_valx)
 

4. 结果可视化

为了更直观地展示模型的预测结果,我们绘制了LSTM和Wavenet模型的预测值与实际数据的对比图。图表的尺寸和透明度经过调整,以便于读者清晰地观察预测值与实际值之间的差异。

 
  1.   plt.figure(figsize=(20,8))
  2.   plt.plot(date[-len(orig_y_val):], lstm_val_pred, label='LSTM')
  3.   plt.plot(date[-len(orig_y_val):], wave_val_pred, label='Wavenet')
  4.   # plt.plot(date[-len(orig_y_val):], lgbm_val_pred, label='LightGBM')
  5.   plt.plot(date[-len(orig_y_val):], orig_y_val, label='Real data')
 

我们还提供了一个放大的视图,以便读者能够更细致地观察模型预测的精确性。

 
  1.   plt.figure(figsize=(20,8))
  2.   plt.plot(date[-len(orig_y_val):], lstm_val_pred, label='LSTM')
 

参考文献

[1] Hochreiter, S., & Schmidhuber, J. (1997). Long Short-Term Memory. Neural Computation, 9(8), 1735-1780.
[2] Van Den Oord, A., Dieleman, S., Zen, H., Simonyan, K., Vinyals, O., Graves, A., ... & Kavukcuoglu, K. (2016). WaveNet: A Generative Model for Raw Audio. arXiv preprint arXiv:1609.03499.
[3] Ke, G., Meng, Q., Finley, T., Wang, T., Chen, W., Ma, W., ... & Liu, T. Y. (2017). LightGBM: A Highly Efficient Gradient Boosting Decision Tree. Advances in Neural Information Processing Systems, 30.

关于分析师

在此对分析师Yuyan Ye对本文所作的贡献表示诚挚感谢,他在首都经济贸易大学完成了金融与监管科技专业的本科学位,专注人工智能领域。擅长Python、深度学习、机器学习、数据采集、数据可视化。

标签:LightGBM,Python,股票,模型,Wavenet,因子,选股,数据
From: https://www.cnblogs.com/tecdat/p/18335236

相关文章

  • Python写UI自动化--playwright(点击操作)
    本篇介绍playwright点击操作,click()方法的常用参数目录0.selector(必需)1.modifiers(可选)2.position(可选)3.button(可选)4.click_count(可选)5.delay6.timeout(可选)7.force=True(可选)8.trial=True(可选)9.no_wait_after(可选)注意事项0.selecto......
  • 【2024最新版】超详细Python+Pycharm安装保姆级教程,Python+Pycharm环境配置和使用指南
    本文将从Python解释器安装到Pycharm专业版安装和配置汉化等使用都进行了详细介绍,希望能够帮助到大家。Python解释器&Pycharm安装包&Pycharm破姐插件我都打包好了。这份完整版的Python安装包已经上传至CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费获取......
  • python实现jenkins凭据录入
    #新增配置importjenkins.model.*importjenkins.plugins.publish_over_ssh.BapSshHostConfigurationdefinst=Jenkins.getInstance()defpublish_ssh=inst.getDescriptor("jenkins.plugins.publish_over_ssh.BapSshPublisherPlugin")defconfiguration=new......
  • funccache:革命性的Python函数缓存工具,轻松提升代码效率!
    funccacheEnglish|中文如其名,funccache实现函数缓存功能,由GQYLPY团队研发的一个框架,可缓存某个函数或某个类中定义的所有方法的返回值。你的程序中有一个函数会被多次调用,并且返回值不变,你会怎么做?为提高代码效率,你会先调用一次该函数并把返回值存到一个变量,之后就使用......
  • Python - Functional programming
    Functionalprogrammingisaprogrammingparadigminwhichmostoftheworkinaprogramisdoneusingpurefunctions.Apurefunctionisafunctionwithoutanysideeffects;itsreturnvalueisalwaysdeterminedbyitsinputarguments,soitalwaysreturn......
  • Python - Lambda expressions as closures
    Aclosureisanestedfunctionthatcanaccessfreevariablesfromanenclosingfunctionevenafterithasfinisheditsexecution.Weknowthat,likenestedfunctiondefinitions,lambdaexpressionscanreferencevaluesfromtheenclosingscope,solambda......
  • Python - Creating jump tables using lambda functions
    Wecanplacelambdafunctioninsidelistanddictionaryliterals.Thiswaywecanuselambdaexpressionstocreatejumptables.>>>L=[lambdas:s.strip().lower(),... lambdas:s.strip().upper(),... lambdas:s.lstrip().title(),... lambd......
  • exceptionx:灵活便捷的Python异常处理库,让异常处理更高效!
    exceptionxEnglish|中文exceptionx是一个灵活且便捷的Python异常处理库,允许你动态创建异常类,并提供多种异常处理机制。exceptionx的前身是gqylpy-exception。pip3installexceptionx动态创建异常使用exceptionx,你可以在需要时即时创建异常类,而无需提前定义。例如,如......
  • systempath:Python开发者必备的文件与系统路径操作神器!
    systempath-专业级的文件与系统路径操作库English|中文systempath是一个专为Python开发者设计的,高度专业化的文件与系统路径操作库。通过提供一套直观且功能强大的面向对象API,它极大地简化了复杂文件与目录管理的任务,使开发者能够更专注于核心业务逻辑的实现,而非底层文件系......
  • 用Python打造精彩动画与视频,3.3 添加音频和简单效果
     3.3添加音频和简单效果在本节中,我们将学习如何使用MoviePy库为视频添加音频和一些简单的效果。这些操作可以让你的视频更具吸引力和个性化。准备工作首先,确保你已经安装了MoviePy和pydub库。你可以通过以下命令安装:pipinstallmoviepypydub同时,你需要确保系统......