ARIMA时间序列分析
2019-08-19 本文已影响2人
estate47
ARIMA模型全称为自回归积分滑动平均模型。该模型的基本思想:将预测变量随时间变化而形成的序列作为随机序列,用一定的数学模型来近似描述这个序列。这个模型一旦被识别后就可以从时间序列的过去值及现在值来预测未来值。其中ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数。所谓ARIMA模型,是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。
适用性:ARIMA模型是一种常见的解决非平稳时间序列的模型,在预测等方而取得了较为显著的成果。金融企业可以运用该模型对波动性趋势进行时间序列预测,结合卖空波动性策略,实现收益最大化。
image.png
输入表:包括时间和利率两列
image.png
输出表:预测一定期间的利率
image.png
参数:输入开始预测的时间及需要预测的个数
完整代码如下:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
ARIMA_input = 'ARIMA_input.xlsx'
forecastnum = 8
data = pd.read_excel('ARIMA_input.xlsx',index_col = u'Date')
#时序图
data.plot()
# plt.show()
#自相关图
from statsmodels.graphics.tsaplots import plot_acf
# plot_acf(data).show()
#平稳性检测
from statsmodels.tsa.stattools import adfuller as ADF
# print(u'原始序列的ADF检验结果为:', ADF(data[u'Rate']))
#差分后的结果
D_data = data.diff().dropna()
D_data.columns = [u'Rate差分']
D_data.plot() #时序图
# plt.show()
# plot_acf(D_data).show() #自相关图
from statsmodels.graphics.tsaplots import plot_pacf
# plot_pacf(D_data).show() #偏自相关图
print(u'差分序列的ADF检验结果为:', ADF(D_data[u'Rate差分'])) #平稳性检测
#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值
from statsmodels.tsa.arima_model import ARIMA
data[u'Rate'] = data[u'Rate'].astype(float)
#定阶
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10) #一般阶数不超过length/10
bic_matrix = [] #bic矩阵
for p in range(pmax+1):
tmp = []
for q in range(qmax+1):
try: #存在部分报错,所以用try来跳过报错。
tmp.append(ARIMA(data, (p,1,q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值
p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值为:%s、%s' %(p,q))
model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #给出一份模型报告
model.forecast(10) #作为期10天的预测,返回预测结果、标准误差、置信区间。
print(model.forecast(10))