【问题标题】:ARMA forecasting, problems with trend eliminationARMA 预测,趋势消除问题
【发布时间】:2016-01-09 02:39:29
【问题描述】:

我想对其进行粗略的 ARMA 预测,即了解更多关于如何使用 stats 模型库的知识并了解它是如何工作的。因此,首先我启动了网络中某处的示例,但 ARMA 拟合和预测不起作用,因为 MLE 不收敛。我决定这个系列不是静止的,所以首先我想消除趋势,这对我来说是一个挑战。代码如下:

   import pandas.io.data as web
import statsmodels.api as sm
import statsmodels.tsa.api as tsa
import datetime
import statsmodels.formula.api as smf


start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2010, 1, 27)
f = web.DataReader("F", 'yahoo', start, end)
print f

#+++++++++++++++TREND+++++++++++++++
atrend = tsa.add_trend(f['Close'].values,trend='ctt')
print atrend
#+++++++++++++++fitting ARMA++++++++

arma =tsa.ARMA(f['Close'].values, order =(2,2))
results= arma.fit()

所以,打印“趋势”给了我:

[[  10.28    1.      1.      1.  ]
 [  10.96    1.      2.      4.  ]
 [  11.37    1.      3.      9.  ]
 [  11.66    1.      4.     16.  ]
 [  11.69    1.      5.     25.  ]
 [  12.11    1.      6.     36.  ]
 [  11.87    1.      7.     49.  ]
 [  11.68    1.      8.     64.  ]
 [  11.76    1.      9.     81.  ]
 [  11.6     1.     10.    100.  ]
 [  11.75    1.     11.    121.  ]
 [  11.51    1.     12.    144.  ]
 [  11.18    1.     13.    169.  ]
 [  10.52    1.     14.    196.  ]
 [  11.03    1.     15.    225.  ]
 [  11.19    1.     16.    256.  ]
 [  11.55    1.     17.    289.  ]]

我完全不明白。 我要求有一个 ctt 趋势,即:at^2+bt+c 为了比较,我在excel中计算了at^2+bt+c,at^3+bt^2+ct+d,得到了以下值。

10,494523
10,780752
11,031687
11,247328
11,427675
11,572728
11,682487
11,756952
11,796123
11,8
11,768583
11,701872
11,599867
11,462568
11,289975
11,082088
10,838907

对于抛物线,y = -1.7647x2 + 33.917x + 1017.3 ,并且:

10,00432
10,65848
11,1547
11,5105
11,7434
11,87092
11,91058
11,8799
11,7964
11,6776
11,54102
11,40418
11,2846
11,1998
11,1673
11,20462
11,32928

对于三次方程 y = 0.292x3 - 9.649x2 + 92.319x + 917.47。 即使是现在,我也不知道如何将这些值插入 arma =tsa.ARMA(f['Close'].values, order =(2,2)) 以检查我是否可以执行下一个任务。

总而言之,我的想法是简要介绍如何轻松地在 python 中使用 ARMA 预测,但对我来说并非如此。

【问题讨论】:

    标签: python statistics time-series statsmodels


    【解决方案1】:

    这应该很容易,但解释变量、exog 和趋势的处理仍然有一些棘手的部分。 (exog 处理是 ARMA 的后期添加。)

    ARMA 有一个 exog 关键字,用于平均预测的附加解释变量。该常量通过fit 方法的trend 关键字包含,目前不能包含在exog 中。不幸的是,trend 关键字不允许任意订单趋势。

    所以在你的情况下,这样的事情应该可以工作:

    arma = tsa.ARMA(f['Close'].values, exog=f[['trend1', 'trend2']] order=(2,2))
    

    对于predict 中的样本外预测,您将需要相同类型的趋势exog

    这里https://gist.github.com/josef-pkt/1ea164439b239b228557 是我的一个秘密要点,我曾经用它来弄清楚如何在 ARMA 中使用 exog。

    当前的 master 和即将推出的 statsmodels 0.7 修复了我们使用 exog 进行样本外预测时的一些计时问题。

    一般情况下,可以使用 OLS 或其他方法对解释变量的时间序列进行回归,然后使用残差来估计 ARMA 模型。这适用于预测,但是 ARMA 估计的标准误差和预测标准误差将是错误的,因为它们没有考虑初始估计 (AFAIK)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-17
      • 2018-09-17
      • 2020-01-05
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2019-12-11
      相关资源
      最近更新 更多