机器学习中的股票市场预测

2025年8月11日 | 阅读9分钟

股票交易所这个词指的是一些交易,在其中公开上市公司的股份进行交易。这些金融活动通过传统的交易所和场外(OTC)市场进行,这些市场在规定的规则下运作。“股票交易所”和“股票交易”经常被互换使用。金融交易所的经纪人在一个或多个股票交易所交易股票,这些交易所是整个股票市场的重要组成部分。

金融交易所允许证券的买卖双方进行会面、交流和交易。市场为公司股份的价格发现提供了可能,并作为整体经济的晴雨表。买卖双方可以确保获得公平的价格、可观的流动性以及透明度,因为市场参与者在公开市场上竞争。第一个股票交易所是伦敦证券交易所,于1773年在一家咖啡馆开始,经纪人在此聚会交易股票。美国第一个股票交易所于1790年在费城成立。梧桐协议(Buttonwood Agreement),之所以得名是因为它是签署在一棵梧桐树下,标志着纽约华尔街在1792年的开始。该协议由24名经纪人签署,是美国第一个股票交易组织。经纪人于1817年将其事业重命名为纽约证券交易委员会。股票交易所是一个受到监管和控制的环境。在美国,主要监管机构包括证券交易委员会(SEC)和金融业监管局(FINRA)。

使用的库

NumPy

NumPy(Numerical Python)是一个开源的Python库,在科学和工程的几乎所有领域都有应用。它是Python中处理数学数据的标准,也是科学Python和PyData生态系统的核心。

Pandas

Pandas被定义为一个开源库,提供Python中高性能的数据操作。Pandas的名称源自“panel data”这个词,意思是计量经济学中的复杂数据。它用于Python中的数据分析,由Wes McKinney于2008年开发。

Matplotlib

Matplotlib是一个用于在Python中创建静态、动画和交互式可视化的综合库。Matplotlib使简单的事情变得容易,复杂的事情成为可能。创建出版质量的图表。创建可缩放、平移、更新的交互式图形。

Scikit-learn

Scikit-learn是一个开源的数据分析库,也是Python生态系统中机器学习(ML)的标准。关键概念和功能包括:算法动态策略,包括:分类:基于模式识别和分类数据。

XG Boost

这包含了Extreme Gradient Boosting机器学习算法,它是帮助我们实现高预测精度的算法之一。

代码

导入数据集

任何命名的文件集合称为数据集。数据集可以包含数据,例如医疗记录或保险记录,供系统上运行的程序使用。数据集也用于存储应用程序或操作系统本身所需的信息,例如源程序、宏库或系统变量或参数。对于包含可显示文本的数据集,您可以打印它们或在控制台上显示它们(许多数据集包含加载模块或其他二进制数据,这些数据并非完全可打印)。数据集可以被命名,允许通过名称引用数据集而不指定其存储位置。

本文使用的数据集或CSV文件可以通过此链接下载

点击这里

输出

Date             Open               High                   Low                  Close          Adj             Volume
         Opening         Highest              Lowest	            Closing      		   Trading
          price	        price                  price	            price			   volume
                                that day            that day
2010-07-07     16.4000            16.629999           14.980000          15.8000         15.8000              6921700
2010-07-08     16.1399            17.520000           15.570000          17.4599         17.4599              7711400
2010-07-09     17.5800            17.900000           16.549999          17.4000         17.4000             4050600
2010-07-12     17.9500            18.070000           17.000000          17.0499         17.0499             2202500
2010-07-13     17.3899            18.639999           16.900000          18.1399         18.1399            2680100

这是CSV文件的前五行。我们可以看到部分日期的交易数据缺失,原因是周末和节假日股市休市,因此这些日期没有交易。

输出

(1705, 7)

从上面的输出中,我们可以清楚地看到,数据集或CSV文件中的可用列数为7,可用行数为1705。

输出

                      Open               High                   Low                  Close          Adj             Volume
         Opening         Highest              Lowest	            Closing      		   Trading
          price	        price                  price	            price			   volume
                                that day            that day
count        1705.0000         1705.0000           1705.0000          1705.000            1705.000         1.7050e+03
mean       130.13992          132.520000         128.57000          130.4599           133.4599          4.2707e+06    
std            94.58002            95.900000           92.549999          94.4000             95.4000            4.2707e+06
min          16.9500             16.070000           14.000000          15.04990           15.0499            1.1850e+05
25%         30.3899             30.639999           29.900000          29.13995             29.10399        1.19435e+06
50%         156.5453            162.45450          153.45645          158.48455          159.54548       3.1807e+04
75%         224.5464            220.56545          215.56545          225.54565          222.56445       5.6621e+09
Max         285.54556          290.55455          280.54545          286.56545          286.56545       3.1763e+02

探索性数据分析

EDA是一种使用可视化技术分析数据的方法。它用于发现趋势、模式,或通过统计摘要和图形表示来检验假设。在执行特斯拉股票价格数据的EDA时,我们将分析股票价格在一段时间内的变动情况,以及季度末如何影响股票价格。

示例

输出

Stock Market prediction using Machine Learning

从上面的图表中,我们可以看到特斯拉股票正显示出如图所示的上升趋势。

输出

Date             Open               High                   Low                  Close          Adj             Volume
         Opening         Highest              Lowest	            Closing      		   Trading
          price	        price                  price	            price			   volume
                                that day            that day
2010-07-07     16.4000            16.629999           14.980000          15.8000         15.8000              6921700
2010-07-08     16.1399            17.520000           15.570000          17.4599         17.4599              7711400
2010-07-09     17.5800            17.900000           16.549999          17.4000         17.4000             4050600
2010-07-12     17.9500            18.070000           17.000000          17.0499         17.0499             2202500
2010-07-13     17.3899            18.639999           16.900000          18.1399         18.1399            2680100

在ds.head()的输出中,如果我们仔细观察,可以看到“close”列中的数据与“Adj Close”列中的数据是相同的,我们应该检查是否所有列都如此。

特征工程

特征工程有助于从现有特征中提取一些有价值的特征。这些附加特征有时有助于整体提高模型的性能,并且绝对有助于获得对数据的更深入见解。

输出

Date      Open             High           Low     Close           Adj    Volume       day    month   year
 Opening        Highest      Lowest    Closing      	 Trading
  price	             price           price	     price	volume
                            that day    that day
2010-07-07     16.40            16.62           14.98          15.80         15.80              69217     7       7          2010
2010-07-08     16.13            17.52           15.57          17.45         17.45              77114      8       7         2010
2010-07-09     17.58            17.90           16.54          17.40         17.40             40506        9       7        2010
2010-07-12     17.95            18.07           17.00          17.04         17.04             22025        12      7        2010
2010-07-13     17.38            18.63           16.90          18.13         18.13            26801         13       7        2010

在这里,我们将日期列拆分成了三个更细的列:日、月和年,它们已经存在于日期列中了。

输出

Date      Open      High         Low     Close           Adj    Volume  Day  month  year  Quarter
          Opening  Highest      Lowest    Closing      	 Trading
  price	       price           price	     price	volume
                   that day    that day
2010-07-07     16.40     16.62      14.98    15.80   15.80    69217     7       7          2010                           0
2010-07-08     16.13      17.52     15.57     17.45    17.45   77114      8       7         2010	             0
2010-07-09     17.58       17.90    16.54     17.40    17.40    40506        9       7        2010                         0
2010-07-12     17.95       18.07     17.00    17.04    17.04    22025        12      7        2010                        0
2010-07-13     17.38       18.63      16.90   18.13    18.13    26801         13       7        2010                      0

三个月为一个季度。每家公司都会准备其季度业绩并向公众发布,以便人们可以分析公司的业绩。这些季度业绩对股票价格有很大影响,这就是为什么我们添加了这个特征,因为它可能是一个有用的特征供学习模型使用。

输出

Stock Market prediction using Machine Learning

通过分析上述条形图,我们可以说,特斯拉股票在2013年至2014年间上涨了两次。

这是对上述分组数据的一些重要观察结果。

  • 与非季度末月份相比,季度末月份的股价更高。
  • 季度末月份的交易量较低。

我们在上面添加了一些有助于训练模型的附加列。我们添加了目标特征,它指示是否应该购买,我们将训练模型来预测它。然而,在继续之前,我们应该检查目标是否通过饼图进行了平衡。

输出

Stock Market prediction using Machine Learning

当我们将特征添加到数据集中时,我们需要确保没有高度相关的特征,因为它们无助于学习过程和算法的处理。

输出

Stock Market prediction using Machine Learning

从上面的热力图中,我们可以看出OHLC之间存在高度相关性,这是显而易见的,而附加特征之间彼此或与先前提供的特征没有高度相关性,这意味着我们可以继续构建我们的模型。

数据分割和归一化

输出

(1435, 3) (190, 3)

在选择要训练模型的特征后,我们应该对数据进行归一化,因为归一化后的数据会导致模型训练稳定且快速。之后,所有数据都已按90/10的比例分为两部分,以便我们可以在隐藏数据上评估模型的性能。

模型开发和评估

现在是时候训练一些先进的机器学习模型(逻辑回归、支持向量机、XGB分类器)了,然后根据它们在训练和验证数据上的性能来选择最适合当前需求的ML模型。

对于评估指标,我们将使用ROC-AUC曲线,但原因如下:与预测硬概率(0或1)相比,我们希望它能预测软概率,即介于0到1之间的连续值。而且,对于软概率,ROC-AUC曲线通常用于衡量预测的准确性。

代码

输出

Logistic Regression():
The Training Accuracy of the model is: 0.5148967
The Validation Accuracy of the model is: 0.5468975

SVC(kernel = ?poly?, probability = True):
The Training Accuracy of the model is: 0.47108955
The Validation Accuracy of the model is: 0.4458765

XGB classifier():
The Training Accuracy of the model is: 0.7856421
The Validation Accuracy of the model is: 0.58462215

在这三个模型中,我们训练的XGB分类器表现最好,但它容易过拟合,因为训练精度和验证精度之间的差异太大了。

输出

Stock Market prediction using Machine Learning

混淆矩阵

结论

我们可以看到,最先进的ML模型的准确率并不比简单地以50%的概率猜测要好。这可能是因为数据不足或使用了过于简单的模型来执行股票市场预测这样复杂的任务。