全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
2278 0
2020-12-08
使用时间序列预测的股市价格趋势预测
时间序列预测 用于根据先前观察到的值以??及趋势分析和未来预测的最佳工具之一来预测未来值 。
什么是时间序列数据?
它以规则的时间间隔记录,这些数据点的顺序很重要。因此,任何基于时间序列数据的预测模型都将时间作为自变量。模型的输出将是特定时间的预测值或分类。
时间序列分析与时间序列预测
让我们谈谈有关时间序列分析和预测的一些可能的混淆。时间序列预测是预测建模的一个示例,而时间序列分析是描述性建模的一种形式。
对于新投资者,与股票或股票市场相关的一般研究不足以做出决定。社会上股票市场的共同趋势具有很高的投资风险,因此大多数人无法根据共同趋势做出决策。任何指数的季节性变化和稳定的流量都将帮助现有和新的投资者了解并做出投资股票市场的决定。
解决这类问题的时间序列预测是最好的技术。
股市
股票市场是个人和机构投资者聚集在一起在公共场所买卖股票的地方。如今,这些交易所作为电子市场存在。
供求关系有助于确定每种证券的价格或股票市场参与者(投资者和交易者)愿意买卖的水平。
股市如何运作的概念非常简单。股票市场的运作就像拍卖行一样,使买卖双方可以协商价格并进行交易。
'Stock'的定义
股票或股份(也称为公司的“权益”)是代表公司所有权的金融工具
股票市场的机器学习
股市非常不可预测,任何地缘政治变化都会影响股市中股票的走势,最近我们已经看到covid-19如何影响股价,这就是为什么在财务数据上进行可靠的趋势分析非常困难。解决此类问题的最有效方法是借助机器学习和深度学习
在本教程中,我们将使用ARIMA模型解决此问题。
ARIMA模型是一种流行且广泛使用的时间序列预测统计方法。它是预测线性时间序列数据的最受欢迎的模型之一。由于该模型可靠,有效,并且在短期股票市场预测中具有强大的潜力,因此已在金融和经济学领域广泛使用。指数平滑和ARIMA模型是时间序列预测中使用最广泛的两种方法,并为问题提供了补充方法。虽然指数平滑模型基于数据中趋势和季节性的描述,但ARIMA模型旨在描述自相关(自相关是指给定时间序列与其滞后版本在连续时间间隔内的相似度)在数据中。
实施股价预测
我将使用nsepy库提取SBIN的历史数据。
进口货
import os
import warnings
warnings.filterwarnings('ignore')
from pylab import rcParams
rcParams['figure.figsize'] = 10
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.arima_model import ARIMA
from pmdarima.arima import auto_arima
from sklearn.metrics import mean_squared_error
import math
import numpy as np
from nsepy import get_history
from datetime import date
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
Run the below code to extract the historical data:
sbin = get_history(symbol='SBIN'
                   start=date(2000
                   end=date(2020
sbin.head()
数据显示了2020-1-1至2020-11-1的SBIN股票价格。我们的目标是创建一个可以预测
股票的收盘价。
让我们创建一个可视化图表,该图表将显示股票的每日收盘价-
plt.figure(figsize =(10
plt.grid(True)
plt.xlabel('日期')
plt.ylabel('收盘价格')
plt.plot(sbin ['Close'])
plt.title( 'SBIN收盘价')
plt.show()
plt.figure(figsize =(10
df_close = sbin ['Close']
df_close.plot(style ='k。')
plt.title('收盘价散点图')
plt.show()
plt.figure(figsize =(10
df_close = sbin ['Close']
df_close.plot(style ='k。',kind ='hist')
plt.title('收盘价高方图')
plt.show()
首先,我们需要检查序列是否平稳,因为时间序列分析仅适用于平稳数据。
测试平稳性:
为了确定数据的性质,我们将使用原假设。
H0:零假设:这是一个关于总体的陈述,要么被认为是真实的,要么被用于提出论点,除非在合理的怀疑之前可以证明它是不正确的。
H1:另一种假设:关于总体的主张与H 0和我们拒绝H 0时得出的结论矛盾。
#Ho:不平稳
#H1:静止
如果我们不能拒绝原假设,则可以说该级数是非平稳的。这意味着该序列可以是线性的。
如果均值和标准差均为平线(均值和方差恒定),则该序列变为平稳。
from statsmodels.tsa.stattools import adfuller
def test_stationarity(timeseries):
    #Determing rolling statistics
    rolmean = timeseries.rolling(12).mean()
    rolstd = timeseries.rolling(12).std()
    #Plot rolling statistics:
    plt.plot(timeseries
    plt.plot(rolmean
    plt.plot(rolstd
    plt.legend(loc='best')
    plt.title('Rolling Mean and Standard Deviation')
    plt.show(block=False)
    print("Results of dickey fuller test")
    adft = adfuller(timeseries
    # output for dft will give us without defining what the values are.
    #hence we manually write what values does it explains using a for loop
    output = pd.Series(adft[0:4]
    for key
        output['critical value (%s)'%key] =  values
    print(output)
test_stationarity(sbin['Close'])
分析完上面的图后,我们可以看到平均值和标准偏差增加,因此我们的序列不是平稳的。
dickey fuller测试结果
测试统计-1.914523
p值0.325260
使用的滞后
次数3.000000使用的观察数5183.000000
临界值(1%)-3.431612
临界值(5%)-2.862098
临界值(10%)-2.567067
dtype : float64
我们看到p值大于0.05,所以我们不能拒绝Null假设。同样,测试统计信息大于临界值。因此数据是不稳定的。
对于时间序列分析,我们将趋势和季节性与时间序列分开。
result = seasonal_decompose(df_close
fig = plt.figure()  
fig = result.plot()  
fig.set_size_inches(16
from pylab import rcParams
rcParams['figure.figsize'] = 10
df_log = np.log(sbin['Close'])
moving_avg = df_log.rolling(12).mean()
std_dev = df_log.rolling(12).std()
plt.legend(loc='best')
plt.title('Moving Average')
plt.plot(std_dev
plt.plot(moving_avg
plt.legend()
plt.show()
现在,我们将创建一个ARIMA模型,并将其与火车数据上的股票收盘价一起训练。因此,让我们将数据分为训练和测试集并对其进行可视化。
train_data
plt.figure(figsize=(10
plt.grid(True)
plt.xlabel('Dates')
plt.ylabel('Closing Prices')
plt.plot(df_log
plt.plot(test_data
plt.legend()
model_autoARIMA = auto_arima(train_data
test='adf'
max_p=3
m=1
d=None
seasonal=False
start_P=0
D=0
trace=True
error_action='ignore'
suppress_warnings=True
stepwise=True)
print(model_autoARIMA.summary())
执行逐步搜索以最小化ic
ARIMA(0
ARIMA(1
ARIMA(0
ARIMA(0
ARIMA(1
最佳模型:ARIMA(0
总拟合时间:9.079秒
                               SARIMAX结果                                
==================== ================================================ =======
德普。变量:y号观测值:4665
型号:SARIMAX(0,1,0)数似然8305.780
日期:星期二,2020年11月24日AIC -16609.560
时间:20时08分50秒BIC -16603.113
样品:0 HQIC -16607.293
                               - 4665                                         
协方差类型:OPG                                          
===== ================================================== =======================
                 coef std err z P> | z | [0.025 0.975]
---------------------------------------------- --------------------------------
sigma2 0.0017 1.06e-06 1566.660 0.000 0.002 0.002
========================================= ==========================================
Ljung-Box(Q): 24.41 Jarque-Bera(JB):859838819.58
Prob(Q):0.98 Prob(JB):0.00
异方差(H):7.16偏斜:-37.54
Prob(H)(双面):0.00峰度:2105.12
===== ================================================== ===========================
model_autoARIMA.plot_diagnostics(figsize =(15
plt.show()
model = ARIMA(train_data
fitted = model.fit(disp=-1)
print(fitted.summary())
ARIMA模型结果                              
=============================================== ===============================
德普。变量:D。关闭编号观测值:4664
模型:ARIMA(3
方法:css-mle创新的SD 0. 041
日期:2020年11月24日,星期二AIC -16604.355
时间:20:09:37 BIC -16559.222
样本:1 HQIC -16588.481
========================================= ======================================
                    coef std err z P> | z | [0.025 0.975]
---------------------------------------------- -----------------------------------
常量8.761e-06 0.001 0.015 0.988 -0.001 0.001
ar.L1。收盘价1.3689 0.251 5.460 0.000 0.877 1.860
ar.L2.D.收盘价-0.7118 0.277 -2.567 0.010 -1.255 -0.168
ar.L3.D.收盘价0.0094 0.021 0.445 0.657 -0.032 0.051
ma.L.D.Close -1.3468 0.250 -5.382 0.000 -1.837 -0.856 ma.L2.D.
关闭0.6738 0.282 2.391 0.017 0.122 1.226
                                    根                                    
================================================== ===========================
                  实际虚数模频
------------------- -------------------------------------------------- --------
AR.1 0.9772 -0.6979j 1.2008 -0.0987
AR.2 0.9772 + 0.6979j 1.2008 0.0987
AR.3 74.0622 -0.0000j 74.0622 -0.0000
MA.1 0.9994 -0.6966j 1.2183 -0.0969
MA.2 0.9994 + 0.6966j 1.2183 0.0969
-------------------------------------------- ---------------------------------
# Forecast
fc
fc_series = pd.Series(fc
lower_series = pd.Series(conf[:
upper_series = pd.Series(conf[:
plt.figure(figsize=(12
plt.plot(train_data
plt.plot(test_data
plt.plot(fc_series
plt.fill_between(lower_series.index
                 color='k'
plt.title('SBIN Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Actual Stock Price')
plt.legend(loc='upper left'
plt.show()
结论
当我们必须做出未来的决定或进行分析时,时间序列预测确实非常有用,我们可以使用ARIMA快速进行此操作,还有许多其他模型可以进行时间序列预测,但是ARIMA确实很容易理解。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群