股票价格的ARIMA预测:以茅台股价为例

举报
darkpard 发表于 2022/09/04 09:59:32 2022/09/04
【摘要】 ARIMA模型,即整合移动平均自回归模型,是最有名的时间序列预测方法之一,包括自回归模型(AR模型)、移动平均模型(MA模型)、自回归-移动平均混合模型(ARMA模型)、整合移动平均自回归模型(ARIMA)。那么,它能否用来预测股票价格呢?我们以茅台(600519.SH)为例,做个简单的展示。数据获取首先,导入几个常用的包:import numpy as npimport pandas as...

ARIMA模型,即整合移动平均自回归模型,是最有名的时间序列预测方法之一,包括自回归模型(AR模型)、移动平均模型(MA模型)、自回归-移动平均混合模型(ARMA模型)、整合移动平均自回归模型(ARIMA)。那么,它能否用来预测股票价格呢?我们以茅台(600519.SH)为例,做个简单的展示。


  1. 数据获取

首先,导入几个常用的包:

    import numpy as np
    import pandas as pd
    import datetime
    from matplotlib import pyplot as plt

    然后,调用我们的数据接口,读取茅台的股价并进行一些简单的处理:

      import data_operate as do
      data = do.curfsql("select format(trade_date, '%Y-%m-%d'), close from daily where ts_code='600519.SH'")
      data[0] = data[0].apply(lambda x: x.replace(',', '')[:8])
      data.columns = ['trade_date', 'close']
      data.index = data['trade_date'].apply(lambda x: datetime.datetime.strptime(x, '%Y%m%d'))
      data.drop(columns='trade_date', inplace=True)
      data = data['close']
      data = data.resample('M').mean().ffill()
      data

      图片


      2. 数据可视与平稳性检验

      先观察一下原始数据:

        data.plot(figsize=(12,4))plt.title('600519.SH')

        图片

        然后,对原始数据进行平稳性检验:

          adfuller(data)

          图片

          很明显数据是不平稳的,所以对数据进行一阶差分并再次进行平稳性检验:

            data_diff1 = data.diff().dropna()
            data_diff1.plot(figsize=(12,4)
            adfuller(data_diff1)

            图片

            图片

            数据仍然不平稳,所以再次对数据进行差分:

              data_diff2 = data.diff().diff().dropna()
              data_diff2.plot(figsize=(12,4))
              adfuller(data_diff2)

              图片

              数据终于平稳了。

              有些年度数据可能具有明显的季节性,更适合用年度同比,此时,可以考虑一下:

                data_diff12 = data.diff(12).dropna()
                data_diff12.plot(figsize=(12,4))
                adfuller(data_diff12)


                3. 白噪声检验

                  from statsmodels.stats.diagnostic import acorr_ljungbox
                  acorr_ljungbox(data, lags=[6, 12, 24], return_df=True)

                  图片


                  4. 定阶

                  先使用BIC准则进行定阶:

                    from statsmodels.tsa.stattools import arma_order_select_ic
                    arma_order_select_ic(data_diff_quarterly, max_ar=10, max_ma=10, ic='bic')

                    这里的max_ar和max_ma表示,最高阶数为10,主要是为了减少计算量,但有时可能因此而丢失精度,可以通过acf图和pacf图观察一下:

                      from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
                      plot_acf(data_diff_quarterly)
                      plot_pacf(data_diff_quarterly)

                      图片

                      图片

                      在我们这里,阶数基本上是合理的。


                      5. 模型求解

                        from statsmodels.tsa.arima.model import ARIMA
                        model = ARIMA(data, order=(5, 2, 10)).fit()
                        model.summary()

                        图片

                        图片

                        可以看到,大部分变量都是显著的。


                        6. 结果可视化

                        先来看残差的可视化:

                          fig, axs = plt.subplots(2, 2)
                          fig.subplots_adjust(hspace=0.3)
                          model.resid.plot(ax=axs[0][0])
                          axs[0][0].set_title('line')
                          model.resid.plot(kind='hist', ax=axs[0][1])
                          axs[0][1].set_title('hist')
                          sms.qqplot(model.resid, line='45', fit=True, ax=axs[1][0])
                          axs[1][0].set_title('qqplot')
                          plot_acf(model.resid, ax=axs[1][1])
                          axs[1][1].set_title('acf')

                          图片

                          从残差看,厚尾效应还是比较明显的。

                          再来看预测结果:

                            preds = model.predict(0, len(data)+6)
                            data.plot(color='g', label='true', figsize=(12,4))
                            preds.plot(color='r', label='predicts')
                            plt.legend()

                            图片

                            从结果上看,效果还是不错的。当然,这只是一个简单的例子,用的也是月度平均价格,是否能够,以及如何应用于实战显然还需要非常深入地研究。

                            【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
                            • 点赞
                            • 收藏
                            • 关注作者

                            评论(0

                            0/1000
                            抱歉,系统识别当前为高风险访问,暂不支持该操作

                            全部回复

                            上滑加载中

                            设置昵称

                            在此一键设置昵称,即可参与社区互动!

                            *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

                            *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。