时间序列分析中统计模型statsmodels.tsa.arima_model

文章介绍了在时间序列分析中遇到statsmodels库中ARIMA模型已被弃用的问题,以及如何解决这个问题。通过更新代码,使用statsmodels.tsa.arima.model.ARIMA替代旧版本。接着,文章展示了对期货日收益率的ARMA-GARCH建模过程,包括平稳性检验、自相关和偏自相关分析,以及GARCH模型的构建和滚动预测。最终,计算了月条件波动率并进行了可视化展示。
摘要由CSDN通过智能技术生成

(10条消息) 时间序列分析中的 statsmodels.tsa.arima_model被抛弃了,如何解决?_-berry的博客-CSDN博客

"""
根据某个期货的收盘价用ARMA-GARCH拟合三年日收益率,然后求出月条件波动率平均值,得到一个月波动率序列。
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.stattools import adfuller
# 该错误是由于在使用statsmodels库中已经弃用的ARIMA模型导致的。
# 解决方法是更新代码,将statsmodels.tsa.arima_model.ARMA 和statsmodels.tsa.arima_model.ARIMA
# 替换为 statsmodels.tsa.arima.model.ARIMA。

##替换ARMA
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa import stattools
from arch import arch_model
from datetime import datetime
import warnings
warnings.filterwarnings("ignore")

path = "玉米期货.xlsx"


# 数据处理
df = pd.read_excel(path)
df = df.loc[:,["时间","收盘价"]]
df = df.dropna(how="any")
df["时间"] = pd.to_datetime(df['时间'], format='%Y-%m-%d', errors='coerce')
l = len(df)
# 计算日收益率
df_ = pd.DataFrame()
df_["close"] = df["收盘价"][1:]
df_["daily return"] = (df_["close"].values-df["收盘价"][0:l-1].values)*100/df["收盘价"][0:l-1].values
df_.index = list(df["时间"][1:])
# 绘制日收益率图
plt.figure(figsize=(10,8))
plt.plot(df_.index,df_["daily return"])
plt.xlabel("date")
plt.ylabel("daily return")
plt.show()

# Arma
dr = df_["daily return"].values
# 平稳性检验
result = adfuller(dr)
print(result) # 拒绝原假设,所以是平稳的
# 白噪声检验
p_value = acorr_ljungbox(dr, lags=12,boxpierce=False,return_df =bool)
print(p_value) # 序列白噪声检验通过
# 自相关,偏相关
plot_acf(dr,use_vlines=True,lags=30) #自相关函数图,滞后30阶
plt.show()
plot_pacf(dr,use_vlines=True,lags=30) #偏自相关函数图
plt.show()
# 该错误是由于在使用statsmodels库中已经弃用的ARIMA模型导致的。解决方法是更新代码,将statsmodels.tsa.arima_model.ARMA 和statsmodels.tsa.arima_model.ARIMA替换为 statsmodels.tsa.arima.model.ARIMA。
# 这是一个程序运行错误的信息,表示在调用statsmodels模块中的arma_order_select_ic函数时,传入的参数trend不是预期的字符串,应该是'n'或'c'。请确保调用该函数时trend参数的值符合预期要求。
# 确定系数构建模型
train_results = sm.tsa.arma_order_select_ic(dr, ic=['aic', 'bic'], trend='c', max_ar=4, max_ma=4)
print('AIC', train_results.aic_min_order) #建立AIC值最小的模型
result = ARMA(dr,(1,1)).fit(disp=-1)
print(result.summary())

# GARCH
# Arch效应检验
resid1=result.resid #提取残差
LjungBox=stattools.q_stat(stattools.acf(resid1**2)[1:13],len(resid1)) #残差平方序列的白噪声检验
print(LjungBox[1][1])
# GARCH模型构建
am=arch_model(resid1)
model2=am.fit(update_freq=0)
print(model2.summary())
# 滚动预测
rolling_predictions = []
test_size = 600
for i in range(test_size):
    train = df_['daily return'][:-(test_size - i)]
    model = arch_model(train, p=1, q=1)
    model_fit = model.fit(disp='off')
    pred = model_fit.forecast(horizon=1)
    rolling_predictions.append(np.sqrt(pred.variance.values[-1, :][0]))

rolling_predictions = pd.Series(rolling_predictions, index=df_['daily return'].index[-600:])

# 计算月条件波动率
df_pre = pd.DataFrame(rolling_predictions,columns=["Volatility"])
df_pre["month"] = df_pre.index.map(lambda x : str(x)[:7])
df_pre_month = df_pre.groupby("month").agg({"Volatility":"mean"})
df_pre_month = pd.DataFrame(df_pre_month,columns=["Volatility"])
df_pre_month.to_excel("../output/excel/%s"%path.split("/")[-1])

# 可视化波动率
fig, ax = plt.subplots(figsize=(10, 4))
plt.plot(rolling_predictions)
plt.title('Rolling Prediction')
plt.show()

NotImplementedError: 
statsmodels.tsa.arima_model.ARMA and statsmodels.tsa.arima_model.ARIMA have
been removed in favor of statsmodels.tsa.arima.model.ARIMA (note the .
between arima and model) and statsmodels.tsa.SARIMAX.
statsmodels.tsa.arima.model.ARIMA makes use of the statespace framework and
is both well tested and maintained. It also offers alternative specialized
parameter estimators.

修改代码:

 from statsmodels.tsa.arima.model import ARIMA

并替换

from statsmodels.tsa.arima_model import ARMA

同样的,将:

from statsmodels.tsa.arima_model import ARIMA

替换

from statsmodels.tsa.arima.model import ARIMA

train_results = sm.tsa.arma_order_select_ic(dr, ic=['aic', 'bic'], trend='c', max_ar=4, max_ma=4)

print('AIC', train_results.aic_min_order) #建立AIC值最小的模型

result = ARMA(dr,(1,1)).fit(disp=-1)

print(result.summary())

# GARCH

# Arch效应检验

resid1=result.resid #提取残差

LjungBox=stattools.q_stat(stattools.acf(resid1**2)[1:13],len(resid1)) #残差平方序列的白噪声检验

print(LjungBox[1][1])

# GARCH模型构建

am=arch_model(resid1)

model2=am.fit(update_freq=0)

print(model2.summary())

# 滚动预测

rolling_predictions = []

test_size = 600

for i in range(test_size):

train = df_['daily return'][:-(test_size - i)]

model = arch_model(train, p=1, q=1)

model_fit = model.fit(disp='off')

pred = model_fit.forecast(horizon=1)

rolling_predictions.append(np.sqrt(pred.variance.values[-1, :][0]))

rolling_predictions = pd.Series(rolling_predictions, index=df_['daily return'].index[-600:])

# ARMA model
train_results = sm.tsa.arma.ARMA(dr, order=(1, 1)).fit() #使用ARMA函数
print('AIC', train_results.aic) #打印AIC值
print(train_results.summary())
# GARCH
# Arch effect test
resid1 = train_results.resid #提取残差
LjungBox = acorr_ljungbox(resid1**2, lags=12) #使用acorr_ljungbox函数进行白噪声检验
print(LjungBox[1][-1])
# GARCH model building
model = arch_model(resid1, mean='AR', vol='GARCH', p=1, q=1) #使用arch_model函数
model_fit = model.fit() #使用fit函数进行模型拟合
print(model_fit.summary())
# Rolling forecast
rolling_predictions = []
test_size = 600
for i in range(test_size):
    train = df_['daily return'][:-(test_size - i)]
    model = arch_model(train, mean='AR', vol='GARCH', p=1, q=1)
    model_fit = model.fit()
    pred = model_fit.forecast(horizon=1).variance #使用variance属性
    rolling_predictions.append(np.sqrt(pred.values[-1, :][0]))
rolling_predictions = pd.Series(rolling_predictions, index=df_['daily return'].index[-600:])

修改后的代码

路径就是以下:

"""
根据某个期货的收盘价用ARMA-GARCH拟合三年日收益率,然后求出月条件波动率平均值,得到一个月波动率序列。
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.stattools import adfuller
# 该错误是由于在使用statsmodels库中已经弃用的ARIMA模型导致的。
# 解决方法是更新代码,将statsmodels.tsa.arima_model.ARMA 和statsmodels.tsa.arima_model.ARIMA
# 替换为 statsmodels.tsa.arima.model.ARIMA。

from statsmodels.tsa.arima_model import ARMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa import stattools
from arch import arch_model
from datetime import datetime
import warnings
warnings.filterwarnings("ignore")

path = "玉米期货.xlsx"


# 数据处理
df = pd.read_excel(path)
df = df.loc[:,["时间","收盘价"]]
df = df.dropna(how="any")
df["时间"] = pd.to_datetime(df['时间'], format='%Y-%m-%d', errors='coerce')
l = len(df)
# 计算日收益率
df_ = pd.DataFrame()
df_["close"] = df["收盘价"][1:]
df_["daily return"] = (df_["close"].values-df["收盘价"][0:l-1].values)*100/df["收盘价"][0:l-1].values
df_.index = list(df["时间"][1:])
# 绘制日收益率图
plt.figure(figsize=(10,8))
plt.plot(df_.index,df_["daily return"])
plt.xlabel("date")
plt.ylabel("daily return")
plt.show()

# Arma
dr = df_["daily return"].values
# 平稳性检验
result = adfuller(dr)
print(result) # 拒绝原假设,所以是平稳的
# 白噪声检验
p_value = acorr_ljungbox(dr, lags=12,boxpierce=False,return_df =bool)
print(p_value) # 序列白噪声检验通过
# 自相关,偏相关
plot_acf(dr,use_vlines=True,lags=30) #自相关函数图,滞后30阶
plt.show()
plot_pacf(dr,use_vlines=True,lags=30) #偏自相关函数图
plt.show()
# 该错误是由于在使用statsmodels库中已经弃用的ARIMA模型导致的。解决方法是更新代码,将statsmodels.tsa.arima_model.ARMA 和statsmodels.tsa.arima_model.ARIMA替换为 statsmodels.tsa.arima.model.ARIMA。
# 这是一个程序运行错误的信息,表示在调用statsmodels模块中的arma_order_select_ic函数时,传入的参数trend不是预期的字符串,应该是'n'或'c'。请确保调用该函数时trend参数的值符合预期要求。
# 确定系数构建模型
# train_results = sm.tsa.arma_order_select_ic(dr, ic=['aic', 'bic'], trend='c', max_ar=4, max_ma=4)
# print('AIC', train_results.aic_min_order) #建立AIC值最小的模型
# result = ARMA(dr,(1,1)).fit(disp=-1)
# print(result.summary())
#
# # GARCH
# # Arch效应检验
# resid1=result.resid #提取残差
# LjungBox=stattools.q_stat(stattools.acf(resid1**2)[1:13],len(resid1)) #残差平方序列的白噪声检验
# print(LjungBox[1][1])
# # GARCH模型构建
# am=arch_model(resid1)
# model2=am.fit(update_freq=0)
# print(model2.summary())
# # 滚动预测
# rolling_predictions = []
# test_size = 600
# for i in range(test_size):
#     train = df_['daily return'][:-(test_size - i)]
#     model = arch_model(train, p=1, q=1)
#     model_fit = model.fit(disp='off')
#     pred = model_fit.forecast(horizon=1)
#     rolling_predictions.append(np.sqrt(pred.variance.values[-1, :][0]))
#
# rolling_predictions = pd.Series(rolling_predictions, index=df_['daily return'].index[-600:])
#
# # 计算月条件波动率
# df_pre = pd.DataFrame(rolling_predictions,columns=["Volatility"])
# df_pre["month"] = df_pre.index.map(lambda x : str(x)[:7])
# df_pre_month = df_pre.groupby("month").agg({"Volatility":"mean"})
# df_pre_month = pd.DataFrame(df_pre_month,columns=["Volatility"])
# df_pre_month.to_excel("../output/excel/%s"%path.split("/")[-1])
#
# # 可视化波动率
# fig, ax = plt.subplots(figsize=(10, 4))
# plt.plot(rolling_predictions)
# plt.title('Rolling Prediction')
# plt.show()
# ARMA model

# `order` argument must be an iterable with three elements.



# train_results = sm.tsa.arima.ARIMA(dr, order=(1, 1)).fit() #使用ARMA函数

train_results = sm.tsa.arima.ARIMA(dr, order=(1,1,1)).fit() #使用ARMA函数
print('AIC', train_results.aic) #打印AIC值
print(train_results.summary())
# GARCH
# Arch effect test
resid1 = train_results.resid #提取残差
# LjungBox = acorr_ljungbox(resid1**2, lags=12) #使用acorr_ljungbox函数进行白噪声检验

#报错
# print(LjungBox[1][1])
# 你可以尝试在调用 acorr_ljungbox() 函数时传递 lags 参数,而不是用 LjungBox[1][-1]。具体如下:
print(acorr_ljungbox(resid1**2, lags=12)[1][-1])
# GARCH model building
model = arch_model(resid1, mean='AR', vol='GARCH', p=1, q=1) #使用arch_model函数
model_fit = model.fit() #使用fit函数进行模型拟合
print(model_fit.summary())
# Rolling forecast
rolling_predictions = []
test_size = 600
for i in range(test_size):
    train = df_['daily return'][:-(test_size - i)]
    model = arch_model(train, mean='AR', vol='GARCH', p=1, q=1)
    model_fit = model.fit()
    pred = model_fit.forecast(horizon=1).variance #使用variance属性
    rolling_predictions.append(np.sqrt(pred.values[-1, :][0]))
rolling_predictions = pd.Series(rolling_predictions, index=df_['daily return'].index[-600:])
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈都婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值