使用 statsmodel 中的 arma_order_select_ic 进行 ARMA 模型顺序选择

Posted

技术标签:

【中文标题】使用 statsmodel 中的 arma_order_select_ic 进行 ARMA 模型顺序选择【英文标题】:ARMA model order selection using arma_order_select_ic from statsmodel 【发布时间】:2018-10-27 14:28:41 【问题描述】:

我正在使用 statsmodel 库中的 arma_order_select_ic 来计算 ARMA 模型的 (p,q) 顺序,我正在使用 for 循环来遍历数据框每一列中的不同公司。代码如下:

import pandas as pd
from statsmodels.tsa.stattools import arma_order_select_ic

df = pd.read_csv("Adjusted_Log_Returns.csv", index_col = 'Date').dropna()

main_df = pd.DataFrame()


for i in range(146):
    order_selection = arma_order_select_ic(df.iloc[i].values, max_ar = 4, 
    max_ma = 2, ic = "aic")
    ticker = [df.columns[i]]

    df_aic_min = pd.DataFrame([order_selection["aic_min_order"]], index = 
    ticker)

main_df = main_df.append(df_aic_min)


main_df.to_csv("aic_min_orders.csv")

代码运行良好,最后我在 csv 文件中得到了所有结果,但令我困惑的是,当我在 for 循环之外为单个公司计算 (p,q) 时,我得到不同的结果

order_selection = arma_order_select_ic(df["ABL"].values, max_ar = 4, 
max_ma = 2, ic = "aic")

公司 ABL 的顺序在 for 循环中计算时为 (1,1),而在 for 循环之外计算时为 (4,1)。

所以我的问题是我做错了什么或者为什么会这样?任何帮助将不胜感激。

提前致谢

【问题讨论】:

【参考方案1】:

从您的代码中可以清楚地看出,您正在尝试在 columns' 数据上查找 ARMA 模型的参数,但这不是代码所做的:您在循环的参数。

考虑一下:

import pandas as pd

df = pd.DataFrame('a': [3, 4])

>>> df.iloc[0]
a    3
Name: 0, dtype: int64

>>> df['a']
0    3
1    4
Name: a, dtype: int64

您可能应该将代码更改为

for c in df.columns:
    order_selection = arma_order_select_ic(df[c].values, max_ar = 4, 
    max_ma = 2, ic = "aic")
    ticker = [c]

【讨论】:

这很有帮助,现在我应该如何处理这个警告? C:\ProgramData\Anaconda3\lib\site-packages\statsmodels\base\model.py:496:ConvergenceWarning:最大似然优化未能收敛。检查 mle_retvals "检查 mle_retvals", ConvergenceWarning) @SaadAhmed stats.stackexchange.com/questions/313426/…

以上是关于使用 statsmodel 中的 arma_order_select_ic 进行 ARMA 模型顺序选择的主要内容,如果未能解决你的问题,请参考以下文章

忽略 Python 的 statsmodels 中的 NaN

Pandas 或 Statsmodels 中的固定效果

使用 statsmodel 中的 arma_order_select_ic 进行 ARMA 模型顺序选择

Statsmodel 跳过逻辑回归中的值?

statsmodels 中的面板 OLS(因为它在 Pandas 中已被弃用?)

使用 ywunbiased 时,statsmodels.tsa.stattools 中的 PACF 函数给出大于 1 的数字?