python——金融商品收益率平稳时间序列建模(ARMA模型)
作者:互联网
一、ARMA模型简介
ARMA 模型Auto-Regressive and Moving Average Model是研究时间序列的重要方法由自回归模型简称AR模型与滑动平均模型简称MA模型为基础“混合”构成。在市场研究中常用于长期追踪资料的研究如Panel研究中用于消费行为模式变迁研究在零售研究中用于具有季节变动特征的销售量、市场规模的预测等。 ARMA模型三种基本形式 :
1、自回归模型ARAuto-regressive:如果时间序列yt满足 其中εt是独立同分布的随机变量序列且满足E(εt) = 0则称时间序列为yt服从p阶的自回归模型。自回归模型的平稳条件滞后算子多项式的根均在单位圆外即φ(B) = 0的根大于1。
2、移动平均模型MAMoving-Average:如果时间序列yt满足则称时间序列为yt服从p阶移动平均模型移动平均模型平稳条件任何条件下都平稳。
3、混合模型ARMAAuto-regressive Moving-Average:如果时间序列yt满足 ,则称时间序列为yt服从(p,q)阶自回归滑动平均混合模型。
二、读取数据
选取云南白药(000538):
Out[1]:
Date
2020-11-30 -0.011209
2020-12-01 0.023302
2020-12-02 0.010257
2020-12-03 0.000711
2020-12-04 0.026278
Name: Close, dtype: float64
三、检验序列平稳性
检验数据平稳的方法,常规上使用ADF检验法来进行检验,验证是否满足ADF检验的结果。平稳序列通常具有短期相关性。该性质用自相关系数来描述就是随着延迟期数的增加,平稳序列的自相关系数会很快的衰减到0。
adf结果的返回值
Test statistic:代表检验统计量
p-value:代表p值检验的概率
Lags used:使用的滞后k,autolag=AIC时会自动选择滞后
Number of Observations Used:样本数量
Critical Value(5%) : 显著性水平为5%的临界值。
(1)假设是存在单位根,即不平稳;
(2)显著性水平,1%:严格拒绝原假设;5%:拒绝原假设,10%类推;
(3)看P值和显著性水平a的大小,p值越小,小于显著性水平的话,就拒绝原假设,认为序列是平稳的;大于的话,不能拒绝,认为是不平稳的;
(4)看检验统计量和临界值,检验统计量小于临界值的话,就拒绝原假设,认为序列是平稳的;大于的话,不能拒绝,认为是不平稳的。
检验输出结果:
Out[2]: Augmented Dickey-Fuller Results ====================================
Test Statistic -32.635
P-value 0.000 Lags 2
Trend: Constant and Linear Time Trend
Critical Values: -3.96 (1%), -3.41 (5%), -3.13 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.
通过上述结果可以看出,该序列存在一个单位根,p小于0.005,这是一个弱平稳序列。
四、检验序列是否为白噪声
白噪声序列,是指白噪声过程的样本实称,简称白噪声。随机变量X(t)(t=1,2,3……),如果是由一个不相关的随机变量的 序列构成的,即对于所有S不等于T,随机变量Xt和Xs的协方差为零,则称其为纯随机过程。对于一个纯随机过程来说,若其期望为 0,方差为常数,则称之为白噪声过程。白噪声就是一系列独立分布的正态序列:序列无相关性,无趋势性,有随机性,它服从均值为0,方差为σ2的正态分布,白噪声的每一个时序点都是服从正态分布的。
1、acorr_ljungbox(x, lags=None, boxpierce=False)函数检验无自相关,lag为延迟期数,如果为整数,则是包含在内的延迟期数,如果是一个列表或数组,那么所有时滞都包含在列表中最大的时滞中。
2、boxpierce为True时表示除开返回LB统计量还会返回Box和Pierce的Q统计量。
LB检验输出结果:
Out[3]: (array([29.58954853, 32.33644822]), array([4.70376247e-05, 1.22758374e-03]))
从上面的分析结果中可以看到,延迟6阶的p值小于0.05,因此该序列不是白噪声序列。
五、建立ARMA模型
Out[4]:
{‘bic’: 0 1 2 3 4
0 -13327.889738 -13320.243134 -13334.861794 -13329.764396 -13321.884236
1 -13320.200172 -13325.046267 -13329.571321 -13321.883732 -13314.246061
2 -13334.321611 -13329.622652 -13321.759681 -13314.029824 -13322.493096
3 -13329.477788 -13321.828768 -13315.296595 -13307.673943 -13299.927858
4 -13321.634516 -13316.087988 -13322.118602 -13314.643202 -13307.323831,
‘bic_min_order’: (1, 1)}
根据上述结果,选择 ARMA (1,1)模型。
六、查看模型结果
1、000538.SZ 收益率 ARMA (1,1)模型 Out[5]: ARMA Model Results Dep. Variable: Close No. Observations: 2649 Model: ARMA(1, 1) Log Likelihood 6678.287 Method: css-mle S.D. of innovations 0.019 Date: Mon, 07 Dec 2020 AIC -13348.574 Time: 00:01:36 BIC -13325.046 Sample: 0 HQIC -13340.057 ============================================================================== coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------- const 0.0006 0.000 2.083 0.037 3.83e-05 0.001 ar.L1.Close 0.7257 0.103 7.053 0.000 0.524 0.927 ma.L1.Close -0.7738 0.094 -8.190 0.000 -0.959 -0.589 Roots ============================================================================= Real Imaginary Modulus Frequency ------------------------------------------------------------------------------------------------------------------------------- AR.1 1.3780 +0.0000j 1.3780 0.0000 MA.1 1.2923 +0.0000j 1.2923 0.0000
2、利用自相关图和偏自相关图
3、AIC统计量
Out[6]:
******* AIC model1 is Best *******
0 1
const 0.000038 0.00126
ar.L1.Close 0.524033 0.92737
ma.L1.Close -0.959024 -0.58864
七、残差诊断
1、000538.SZ 收益率ARMA (1,1)模型标准化残差与 ACF
(1)模型LjungBox检验
Ljung-Box test是对randomness的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。
模型标准化残差图
(2)ACF
模型标准化残差ACF
2、000538.SZ收益率ARMA(1,1)模型LjungBox检验与20滞后阶ACF
(1)模型LjungBox检验
Out[7]:
0.15332376520997962
0.11494106190197652
(2)20 滞后阶ACF
20 滞后阶ACF
结果如000538.SZ 收益率 ARMA (1,1)模型标准化残差与 ACF所 示。从图中可看出,残差项之间没有显著的自相关性。针对自相关性的 LB 检验也有足够高的 p 值,即残差序列白噪声的原假设不能被拒绝。基于以上结果,基本得出结论:ARMA (1,1)模型满足要求。
八、运行代码
#云南白药(000538)
import time
import datetime
import pandas_datareader as web
import pandas as pd
from arch.unitroot import ADF
stock=input("輸入股票代號=====> ")
stockfile=stock+".SZ"
#from pandas_datareader import data as web
write=pd.ExcelWriter('D:/stock.xlsx')
starttime=time.perf_counter()
start = datetime.datetime(2010,1,1)
end =datetime.datetime(2020,12,31)
df=web.DataReader(stockfile,'yahoo',start,end)
df.to_excel(write,'stock')
write.save()
SZ = pd.read_excel('D:/stock.xlsx')
df = web.DataReader(stockfile,'yahoo',start,end)
# ****************************************************************
SZindex = df
SZindex.index=pd. to_datetime(SZindex.index)
Close = SZindex.Close
SZiRet = (Close - Close.shift(1)) / Close.shift(1)
SZiRet = SZiRet.dropna()
SZiRet.tail()
plt.plot(SZiRet)
adf = ADF(SZiRet[1:])
adf
print(adf.lags)
adf.trend='ct'
print(adf.summary())
# **************LB检验*************************************
from statsmodels.stats.diagnostic import acorr_ljungbox
def test_stochastic(ts,lag):
p_value = acorr_ljungbox(ts, lags=lag) #lags可自定义
return p_value
test_stochastic(SZiRet,[6,12])
# **************单位根检验**************************************
from statsmodels.tsa import stattools
from statsmodels.graphics.tsaplots import *
import math
LjungBox = stattools.q_stat(stattools.acf(SZiRet[1:13]),len(SZiRet))
print('*******************************************')
print(LjungBox[1][-1])
print('*******************************************')
##arima 建模
#max_ma 参数用于指定最大 ma 滞后阶数
stattools.arma_order_select_ic(SZiRet[1:],max_ma = 4)
# *******************************************************************
from statsmodels.tsa import arima_model
model1 = arima_model.ARIMA(SZiRet[1:],order=(1,0,1)).fit()
print(model1.summary())
# *******************************************************************
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
axe1=plt.subplot(121)
axe2=plt.subplot(122)
plot_acf(SZiRet[1:],lags=30,ax=axe1)
plot_pacf(SZiRet[1:],lags=30,ax=axe2)
# ****************************************
print(' ******* AIC model1 is Best *******')
print('*******************************************')
print(model1.conf_int())
print('*******************************************')
stdresid = model1.resid/math.sqrt(model1.sigma2)
plt.plot(stdresid)
plot_acf(stdresid,lags=20)
from statsmodels.stats.diagnostic import acorr_ljungbox
LjungBox = stattools.q_stat(stattools.acf(stdresid)[1:20],len(stdresid))
print('*******************************************')
print(LjungBox[1][-1])
print('*******************************************')
from statsmodels.stats.diagnostic import acorr_ljungbox
LjungBox1 = stattools.q_stat(stattools.pacf(stdresid)[1:20],len(stdresid))
print('*******************************************')
print(LjungBox1[1][-1])
print('*******************************************')
plot_acf(stdresid,lags=20)
print('*************************************** End ****')
标签:python,模型,SZiRet,建模,序列,print,import,ARMA 来源: https://blog.csdn.net/weixin_47307243/article/details/113531553