前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
主要一个股票,使用时间序列模型研究按照下面的流程来研究一下其变化趋势,看看准不准,Python代码写的比较优美,学习者可以研读一下整个程序流程。
步骤:
- 准备数据
- 可视化数据、审查数据
- 处理数据
- 根据ACF、PACF定阶
- 拟合ARIMA模型
- 预测
<span>#</span><span> -*- coding: utf-8 -*-</span> <span>"""</span><span> Spyder Editor This is a temporary script file. </span><span>"""</span> <span><a href="https://www.gaodaima.com/tag/import" title="查看更多关于import的文章" target="_blank">import</a></span><span> pandas as pd </span><span>import</span><span> pandas_datareader </span><span>import</span><span> datetime </span><span>import</span><span> matplotlib.pylab as plt </span><span>from</span> matplotlib.pylab <span>import</span><span> style </span><span>from</span> statsmodels.tsa.arima_model <span>import</span><span> ARIMA </span><span>from</span> statsmodels.graphics.tsaplots <span>import</span><span> plot_acf, plot_pacf style.use(</span><span>"</span><span>ggplot</span><span>"</span>) <span>#</span><span> 设置图片显示的主题样式</span> <span>#</span><span> 解决matplotlib显示中文问题</span> plt.rcParams[<span>"</span><span>font.sans-serif</span><span>"</span>] = [<span>"</span><span>SimHei</span><span>"</span>] <span>#</span><span> 指定默认字体</span> plt.rcParams[<span>"</span><span>axes.unicode_minus</span><span>"</span>] = False <span>#</span><span> 解决保存图像是负号"-"显示为方块的问题</span> <span>def</span><span> run_main(): </span><span>"""</span><span> 主函数 </span><span>"""</span> <span>#</span><span> 1. 准备数据</span> <span>#</span><span> 指定股票分析开始日期</span> start_date = datetime.datetime(2009, 1, 1<span>) </span><span>#</span><span> 指定股票分析截止日期</span> end_date = datetime.datetime(2019, 4, 1<span>) </span><span>#</span><span> 股票代码</span> stock_code = <span>"</span><span>600519.SS</span><span>"</span> <span>#</span><span> 沪市贵州茅台</span> <span> stock_df </span>=<span> pandas_datareader.data.DataReader( stock_code, </span><span>"</span><span>yahoo</span><span>"</span><span>, start_date, end_date ) </span><span>#</span><span> 预览数据</span> <span>print</span><span>(stock_df.head()) </span><span>#</span><span> 2. 可视化数据</span> plt.plot(stock_df[<span>"</span><span>Close</span><span>"</span><span>]) plt.title(</span><span>"</span><span>股票每日收盘价</span><span>"</span><span>) plt.show() </span><span>#</span><span> 按周重采样</span> stock_s = stock_df[<span>"</span><span>Close</span><span>"</span>].resample(<span>"</span><span>W-MON</span><span>"</span><span>).mean() stock_train </span>= stock_s[<span>"</span><span>2014</span><span>"</span>:<span>"</span><span>2018</span><span>"</span><span>] plt.plot(stock_train) plt.title(</span><span>"</span><span>股票周收盘价均值</span><span>"</span><span>) plt.show() </span><span>#</span><span> 分析 ACF</span> acf = plot_acf(stock_train, lags=20<span>) plt.title(</span><span>"</span><span>股票指数的 ACF</span><span>"</span><span>) acf.show() </span><span>#</span><span> 分析 PACF</span> pacf = plot_pacf(stock_train, lags=20<span>) plt.title(</span><span>"</span><span>股票指数的 PACF</span><span>"</span><span>) pacf.show() </span><span>#</span><span> 3. 处理数据,平稳化数据</span> <span>#</span><span> 这里只是简单第做了一节差分,还有其他平稳化时间序列的方法</span> stock_diff =<span> stock_train.diff() diff </span>=<span> stock_diff.dropna() </span><span>print</span><span>(diff.head()) </span><span>print</span><span>(diff.dtypes) plt.figure() plt.plot(diff) plt.title(</span><span>"</span><span>一阶差分</span><span>"</span><span>) plt.show() acf_diff </span>= plot_acf(diff, lags=20<span>) plt.title(</span><span>"</span><span>一阶差分的 ACF</span><span>"</span><span>) acf_diff.show() pacf_diff </span>= plot_pacf(diff, lags=20<span>) plt.title(</span><span>"</span><span>一阶差分的 PACF</span><span>"</span><span>) pacf_diff.show() </span><span>#</span><span> 4. 根据ACF和PACF定阶并建立模型</span> model = ARIMA(stock_train, order=(1, 1, 1), freq=<span>"</span><span>W-MON</span><span>"</span><span>) </span><span>#</span><span> 拟合模型</span> arima_result =<span> model.fit() </span><span>print</span><span>(arima_result.summary()) </span><span>#</span><span> 5. 预测</span> <span> pred_vals </span>= arima_result.predict(start=str(<span>"</span><span>2019-01</span><span>"</span>),end=str(<span>"</span><span>2019-03</span><span>"</span><span>), dynamic</span>=False, typ=<span>"</span><span>levels</span><span>"</span><span>) </span><span>print</span><span>(pred_vals) </span><span>#</span><span> 6. 可视化预测结果</span> stock_forcast = pd.concat([stock_s, pred_vals], axis=1, keys=[<span>"</span><span>original</span><span>"</span>, <span>"</span><span>predicted</span><span>"</span><span>]) plt.figure() plt.plot(stock_forcast) plt.title(</span><span>"</span><span>真实值vs预测值</span><span>"</span><span>) plt.savefig(</span><span>"</span><span>./stock_pred.png</span><span>"</span>, format=<span>"</span><span>png</span><span>"</span><span>) plt.show() </span><span>if</span> <span>__name__</span> == <span>"</span><span>__main__</span><span>"</span><span>: run_main()</span>
www#gaodaima.com来源gaodai$ma#com搞$$代**码)网搞代码
结果显示: