前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[量化投资]你的机器学习算法真的能准确预测股价吗?

[量化投资]你的机器学习算法真的能准确预测股价吗?

原创
作者头像
核桃量化
发布2023-01-17 10:32:08
1.6K0
发布2023-01-17 10:32:08
举报

我确信Alpha存在的空间非常小,而且很难长期驻留不变,导致金融市场数据的性质几乎就是被设计成用随机性来欺骗我们。

我也不相信一个人通过下载一些Python软件包并对公开可用的数据进行简单的分析就能在市场上取得成功。

有很多文章展示如何使用机器学习算法来预测股票价格,其中很多工作都表现出了共同的错误,这些错误表明作者在追求alpha方面并没有太多经验。其中有两个错误特别突出:

  1. 使用机器学习算法预测股票价格而不是累计收益回报;
  2. 使用未复权价格来计算这些回报。

第一个错误非常复杂,通常作者在文章中使用机器学习的度量指标评估算法的性能,而不是将其与一些合理的基准进行对比,这是非常不合理的。下面我们以天气预报的例子来解释其不合理性,假设我预测我家附近明天的温度将是 25度(事实上,25度是我家的年平均平均温度),在其他条件不变的情况下,这种预测是合理的。但是当气象局预测明天的温度是15度时,我的预测可能就是不合理的。因此如果没有参考基准,是不能判断我的预测误差(可能大约 10度)的有用性和精度。

在金融市场是一样的,一些机器学习算法用历史价格预测延后一天的价格,在这种情况下使用机器学习指标进行度量往往会导致过高估计自己模型的表现。下图是一个示例,使用前一天的收盘价在预测今天的收盘价,我们可以看到曲线几乎完全拟合上,我们使用的机器学习指标会告诉我们模型非常好,但是我们又会觉得好像存在不合理的地方。

图片
图片

在文章的下面部分,我会展示如何按照预测中常用的几个指标来衡量一个模型的性能。算法非常简单,只是使用纳斯达克100指数中每只股票的最后价格。我希望这将能成为一个有用的工具以筛选那些声称自己可以在预测股票方面表现的非常不错的算法。

在我们继续之前,有几个注意事项:

调整后的收盘价

在比较不同时间记录的价格时,我们应该使用 "复权价格",因为这些价格完全包含了公司的任何拆分、股息、分拆和其他分配。如果没有这一点,2:1的股票拆分将在一夜之间产生-50%的回报,而实际上任何交易者都不会经历这种情况。它仅仅是对每股面值的重新编号(从技术上讲,它是向所有注册持有人发行额外的股票,而没有任何相关的资本转移)。类似的现象更频繁地发生在红利的分配上。当一家公司支付股息时,例如向注册持有人支付每股25美分,它的股票价格在除息日将减去这一数额,但是这并不代表真正的损失,因为股票持有人将以现金形式收到这笔款项。所以他们因分配股息而获得的总收益为零。

百分比误差

在任何情况下,我们在评估股票在一个较长时期内的表现时都应该使用百分比误差,而不是简单的误差。这是因为不同的股票具有不同的价格,使用价格误差是没有办法对比算法在多支股票上的表现。股票市场的一个 "典型事实 "是,从长远来看,价格会增加价值。这背后的主要驱动因素,即股票风险溢价,是由于风险投资产生的回报超过了无风险利率的平均水平,其方式与超额风险成正比。这是它们成为比无风险利率更具吸引力的投资的必要条件。一个次要的因素是随着生产力的增长,公司可以随着时间以滚雪球的方式进行成长。

马丁格尔模型是一个明智的基准,但不是一种投资策略

在时间序列分析中,马丁格尔模型是一个拥有预期未来价值等于当前价值这一特性的序列。下面是其公式化的表示:

图片
图片

公式理解为 "考虑到先前时间s已知的信息,X在时间t的预期价值等于X在时间s的价值。

请注意,我绝不是在暗示这个股票价格的基准模型是一个可以作为有用的投资策略的模型。该模型指出,预期的区间回报率为零!这是不可能的。如果我预期回报率为零,那么在市场上投资就没有任何意义。我不仅积极地投资于市场,多年来,我一直作为自营交易员操作,既为摩根士丹利等机构,也为自己的账户。事实上,我把我职业生涯的大部分时间都献给了以下公式:

图片
图片

其中增长率g是先验数据的一个确定性函数,其值并不一致。我想说的是,你应该为遇到的任何模型都选择至少一个正确的基准进行对比。

如果作者提出的模型的性能表现还不如简单地使用最新的价格,那么无论模型看起来多么复杂或先进,该模型实际上在预测股票价格时根本没有用。

获取纳斯达克100指数的数据

我使用数据是来自纳斯达克100指数包含的股票,它们是在纳斯达克证券交易所上市的市值最大的公司,里面包含了很多科技股,有许多关于预测股票的文章的作者和评论者都提到了这些股票。最方便的获得数据的方法是安装yfinance Python软件包。

代码语言:javascript
复制
!pip install yfinance

获得纳斯达克100指数包含的股票价格数据:

代码语言:javascript
复制
import pandas as pd
import numpy as np
from yfinance import download
# this list created 2021-12-26, you must use Adjusted Close 
# not simple Close to account for splits/dividends etc
prices=download(["AAPL", "ABNB", "ADBE", "ADI", "ADP", "ADSK", "AEP", "ALGN", "AMAT", "AMD", "AMGN", "AMZN", "ANSS", "ASML", "ATVI", "AVGO", "BIDU", "BIIB", "BKNG", "CDNS","CHTR", "CMCSA", "COST", "CPRT", "CRWD", "CSCO", "CSX", "CTAS", "CTSH", "DDOG", "DLTR", "DOCU", "DXCM", "EA", "EBAY", "EXC", "FAST", "FB", "FISV", "FTNT","GILD", "GOOG", "GOOGL", "HON", "IDXX", "ILMN", "INTC", "INTU", "ISRG", "JD", "KDP", "KHC", "KLAC", "LCID", "LRCX", "LULU", "MAR", "MCHP", "MDLZ", "MELI","MNST", "MRNA", "MRVL", "MSFT", "MTCH", "MU", "NFLX", "NTES", "NVDA", "NXPI", "OKTA", "ORLY", "PANW", "PAYX", "PCAR", "PDD", "PEP", "PTON", "PYPL", "QCOM","REGN", "ROST", "SBUX", "SGEN", "SIRI", "SNPS", "SPLK", "SWKS", "TEAM", "TMUS", "TSLA", "TXN", "VRSK", "VRSN", "VRTX", "WBA", "WDAY", "XEL", "XLNX", "ZM","ZS"])["Adj Close"] 
prices

下面的代码比较复杂,我提供了一个完整的Google Colab脚本供参考。

计算马丁格尔法的预测指标

上面的代码片段提供给你一个Pandas Dataframe,其中包含纳斯达克100指数中每只股票的价格历史。为了计算每只股票的马丁格尔效应,我们所要做的就是循环计算相关指标。我选择了三个指标,它们都是定义简单,且被许多对股票价格预测感兴趣的人普遍使用的。

  1. 平均绝对百分比误差,或MAPE:MAPE仅仅是一个系列的预测值和实现值之间的绝对误差的平均值,在每种情况下除以实现值,并以百分比表示。。
图片
图片
  1. 均方根百分比误差,或 RMSPE,由于在数学上更容易处理,因此在统计分析中更常用的是 rms 百分比误差,它与误差的方差有关。
图片
图片
  1. 确定系数,或 R²。从线性回归的框架中,我们得到了著名的R²值。这给出了模型解释的方差百分比。
图片
图片

用 Python 计算这些指标

以下代码将计算纳斯达克100指数每只股票的所有三个指标。

代码语言:javascript
复制
areturn,correl=pd.DataFrame(),{}

for ticker in prices:
    p,q=prices[ticker],prices[ticker].shift()
    areturn[ticker]=abs((p-q)/p)*1e2
    correl[ticker]=pd.DataFrame({0:p,1:q}).corr().loc[0,1]*1e2
scores=pd.DataFrame({
    "MAPE":areturn.mean(axis=0),
    "RMSPE":areturn.apply(lambda x:x*x).mean(axis=0).apply(np.sqrt),
    "R²":pd.DataFrame(
        {"Correlation":correl.values()},
        index=correl.keys()
    )["Correlation"].apply(lambda x:x*x/1e2)
})
scores

下图是计算出的三个指标展示:

图片
图片

马丁格尔模型的现象学

在粒子物理学中,现象学指的是某物的一般统计特性,而不涉及理论。对某物是什么的简单陈述。它有点类似于探索性数据分析,尽管这种做法一般是由发现数据中存在的 "东西 "的假设来定义的,而我对测量已经定义的东西更感兴趣。

下面我们看到了所有三个指标的直方图。

图片
图片

img

我们还可以使用describe函数生成相应的汇总统计信息。

代码语言:javascript
复制
score.describe()
图片
图片

从上面的结果我们可以看到,对于这101只股票,马丁格尔模型几乎可以非常简单解释价格的所有方差。R²的平均值是99.735%,因此只剩下0.265%被Alpha模型和简单不可预测的噪音所共享。这在直觉上是非常不合理的。当人们专注于预测价格时,很容易忽视这种不合理性! 这种不合理是由于数据中存在长尾分布导致的。在现实场景中,长尾分布的存在是非常普遍的。

因此当使用机器学习算法进行股价预测时,仅仅关注预测指标是不够的,其需要能战胜合理的比较基准。

这项研究的目的只有一个:如何正确分析一个预测价格的算法的性能。本文提到的错误,在量化金融方面受过正规训练或稍有经验的人都不会这么做。然而,这是机器学习算法经常被训练的指标,所以这也是我们需要的。

原文链接: [核桃量化]你的机器学习算法真的能准确预测股价吗? 转载请申请。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档