(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:])