时间序列一【只是搬运工】

history_data
标签: #<Tag:0x00007fcf61fc8dd8>

(hugo) #1

我不生产知识,只是知识的搬运工

克隆策略

一、与时间序列分析相关的部分基础知识/概念

1.1 什么是时间序列

简而言之:
对某一个或者一组变量 x(t) 进行观察测量,将在一系列时刻 t1,t2,⋯,tn 所得到的离散数字组成的序列集合,称之为时间序列。

例如: 某股票A从2015年6月1日到2016年6月1日之间各个交易日的收盘价,可以构成一个时间序列;某地每天的最高气温可以构成一个时间序列。

一些特征:
趋势:是时间序列在长时期内呈现出来的持续向上或持续向下的变动。

季节变动:是时间序列在一年内重复出现的周期性波动。它是诸如气候条件、生产条件、节假日或人们的风俗习惯等各种因素影响的结果。

循环波动:是时间序列呈现出得非固定长度的周期性变动。循环波动的周期可能会持续一段时间,但与趋势不同,它不是朝着单一方向的持续变动,而是涨落相同的交替波动。

不规则波动:是时间序列中除去趋势、季节变动和周期波动之后的随机波动。不规则波动通常总是夹杂在时间序列中,致使时间序列产生一种波浪形或震荡式的变动。只含有随机波动的序列也称为平稳序列

1.2 平稳性

在百度词条中是这样粗略的讲的:平稳时间序列粗略地讲,一个时间序列,如果均值没有系统的变化(无趋势)、方差没有系统变化,且严格消除了周期性变化,就称之是平稳的

我们不妨先来看下图:

In [30]:
#查找date前/后1日的交易日,0为前,1为后
def get_near_date(date,direction):
    td = D.trading_days(market='CN', start_date=None, end_date=None)
    td['date'] = td['date'].apply(lambda x:x.strftime('%Y-%m-%d'))
    while True:
        if direction == 0:
            pre_date = datetime.datetime.strptime(date,'%Y-%m-%d') - datetime.timedelta(1)
        elif direction == 1:
            pre_date = datetime.datetime.strptime(date,'%Y-%m-%d') + datetime.timedelta(1)
        pre_date = pre_date.strftime('%Y-%m-%d')
        date = pre_date
        if pre_date in list(td['date']):
            break
    return date
#查找date在td中的位置
def get_date_index(date,direction):
    td = D.trading_days(market='CN', start_date=None, end_date=None)
    td['date'] = td['date'].apply(lambda x:x.strftime('%Y-%m-%d'))
    try:
        ix = td[td['date']== date].index[0]
    except IndexError as e:
        date = get_near_date(date,direction)
        ix = td[td['date']== date].index[0]
    return ix

def get_date_range(ix,direction,days):
    td = D.trading_days(market='CN', start_date=None, end_date=None)
    if direction == 0: 
        start_ix = ix-days+1#用get_date_index取得的index位置获取
        assert len(td.ix[start_ix:ix]) == days #assert断言函数,如果不为真则报错
        start_date = td.ix[start_ix:ix]['date'].min()
        end_date = td.ix[start_ix:ix]['date'].max()
    elif direction ==1:
        end_ix = ix+days-1
        assert len(td.ix[ix:end_ix]) == days
        start_date = td.ix[ix:end_ix]['date'].min()
        end_date = td.ix[ix:end_ix]['date'].max()
    return (start_date, end_date)

def get_history_data_by_days(instruments,date,days,direction,fields):
    ix = get_date_index(date, direction)
    start_date = get_date_range(ix,direction,days)[0]
    end_date = get_date_range(ix,direction,days)[1]
    return D.history_data(instruments=instruments,start_date=start_date,end_date=end_date,fields=fields)
In [31]:
base_data=get_history_data_by_days(['603999.SHA'],'2017-05-26',400,0,['close'])
base_data['close_diff_1']=base_data['close'].diff(1)
base_data['close_diff_2']=base_data['close_diff_1'].diff(1)
base_data=base_data.set_index('date')
In [32]:
base_data.plot(subplots=True,figsize=(18,12))
Out[32]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7fe3f00bc4a8>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7fe3f00ac160>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7fe3f0088ac8>], dtype=object)

上图中第一张图为股票分年份的收盘情况,是一个非平稳时间序列;而下面两张为平稳时间序列(当然这里没有检验,只是为了让大家看出差异,关于检验序列的平稳性后续会讨论)

细心的朋友已经发现,下面两张图,实际上是对第一个序列做了差分处理,方差和均值基本平稳,成为了平稳时间序列,后面我们会谈到这种处理。

下面可以给出平稳性的定义了:

严平稳:

如果对所有的时刻 t,任意正整数 k 和任意 k 个正整数 $$ \large (t_1,t_2......t_k), \\ \large (r_{t_1},r_{t_2},......r_{t_k})$$ 的联合分布与 $$ \large (r_{t_1 + t},r_{t_2+t},......r_{t_k + t}) $$ 的联合分布相同,我们称时间序列 {rt} 是严平稳的。

也就是,$$ \large (r_{t_1},r_{t_2},......r_{t_k})$$ 的联合分布在时间的平移变换下保持不变,这是个很强的条件。而我们经常假定的是平稳性的一个较弱的方式

弱平稳:

若时间序列 {rt} 满足下面两个条件:$$ \large E(r_t) = \mu, \mu 是常数\\ \large Cov(r_t,r_{t-l}) = \gamma_l, \gamma_l 只依赖于l $$ 则时间序列 {rt} 为弱平稳的。即该序列的均值,rt与rt-l 的协方差不随时间而改变,l为任意整数。

在金融数据中,通常我们所说的平稳序列,是弱平稳的。

差分

回头我们再谈之前说的差分操作:

差分(这里为前向),就是求时间序列{rt}在 t时刻的值 rt 与 t-1 时刻的值r(t-1) 的差不妨记做 dt,则我们得到了一个新序列{dt},为一阶差分,对新序列{dt}再做同样的操作,则为二阶差分

通常非平稳序列可以经过d次差分,处理成弱平稳或者近似弱平稳时间序列。回头看上图,我们发现二阶差分得到的序列比一阶差分效果更好。

1.3 相关系数和自相关函数

1.3.1 相关系数

对于两个向量,我们希望定义它们是不是相关。一个很自然的想法,用向量与向量的夹角来作为距离的定义,夹角小,就距离小,夹角大,就距离大。

早在中学数学中,我们就经常使用余弦公式来计算角度:$$ \large cos<\vec a , \vec b> = \frac {\vec a \cdot \vec b}{\lvert \vec a \rvert \lvert \vec b \rvert} $$

而对于,$$\large \vec a \cdot \vec b$$ 我们叫做内积,例如$$ \large (x_1,y_1) \cdot (x_2,y_2) = x_1x_2 + y_1y_2 $$

我们再来看相关系数的定义公式,X和Y的相关系数为: $$ \large \rho_{xy} = \frac{Cov(X,Y)}{\sqrt{Var(X)Var(Y)}}$$

而我们的根据样本的估计计算公式为; $$ \large \rho_{xy} = \frac{\sum_{t=1}^{T}(x_t- \bar x)(y_t-\bar y)}{\sqrt{ \sum_{t=1}^{T}(x_t- \bar x)^{2}\sum_{t=1}^{T}(y_t- \bar y)^{2}}} = \frac{\overrightarrow{(X- \bar x)} \cdot \overrightarrow{(Y- \bar y)}}{\lvert \overrightarrow{(X- \bar x)} \rvert \lvert \overrightarrow{(Y- \bar y)} \rvert}$$

我们发现,相关系数实际上就是计算了向量空间中两个向量的夹角! 协方差是去均值后两个向量的内积!

如果两个向量平行,相关系数等于1或者-1,同向的时候是1,反向的时候就是-1。如果两个向量垂直,则夹角的余弦就等于0,说明二者不相关。两个向量夹角越小,相关系数绝对值越接近1,相关性越高。 只不过这里计算的时候对向量做了去均值处理,即中心化操作。而不是直接用向量 X,Y计算。

对于减去均值操作,并不影响角度计算,是一种“平移”效果,如下图所示:

In [33]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
a = pd.Series([9,8,7,5,4,2])
b = a - a.mean() # 去均值
plt.figure(figsize=(10,4))
a.plot(label='a')
b.plot(label='mean removed a')
plt.legend()
Out[33]:
<matplotlib.legend.Legend at 0x7fe3f200c240>

1.3.2 自相关函数 (Autocorrelation Function, ACF)

相关系数度量了两个向量的线性相关性,而在平稳时间序列 {rt} 中,我们有时候很想知道,rt 与它的过去值 rt-i 的线性相关性。 这时候我们把相关系数的概念推广到自相关系数。

rt 与 rt-l 的相关系数称为 rt 的间隔为 l 的自相关系数,通常记为 ρl。具体的: $$\large \rho_l = \frac{Cov(r_t,r_{t-l})} {\sqrt{Var(r_t)Var(r_{t-l})}} = \frac{Cov(r_t,r_{t-l})} {Var(r_t)} $$ 这里用到了弱平稳序列的性质: $$ \large Var(r_t)=Var(r_{t-l})$$

对一个平稳时间序列的样本 {rt}, 1 <= t <= T,则间隔为 l 的样本自相关系数的估计为: $$ \large \hat \rho_l = \frac{\sum_{t=l+1}^{T}(r_t- \bar r)(r_{t-l}-\bar r)}{ \sum_{t=1}^{T}(r_t- \bar r)^{2}}, 0 \leqslant l \leqslant T-1 $$

则函数 $$ \large \hat \rho_1,\hat \rho_2 ,\hat \rho_3...$$ 称为 rt 的样本自相关函数(ACF)

当自相关函数中所有的值都为0时,我们认为该序列是完全不相关的;因此,我们经常需要检验多个自相关系数是否为0。

混成检验

原假设 $$ H0: \rho_1 = ... = \rho_m=0 $$ 备择假设 $$ H1: \exists i \in \{1,...,m\}, \rho_i \ne 0 $$

混成检验统计量:$$\large Q(m) = T(T+2) \sum_{l=1}^{m} \frac{\hat{\rho_l}^{2}}{T-l}$$ Q(m)渐进服从自由度为m的 $$ \chi^2 $$分布

决策规则: $$ \large Q(m) > \chi_\alpha^{2} ,拒绝H0$$ 即,Q(m)的值大于自由度为m的卡方分布100(1-α)分位点时,我们拒绝H0。

大部分软件会给出Q(m)的 p-value,则当 p-value 小于等于显著性水平 α时拒绝H0。

下面给出示例:

In [34]:
from scipy import  stats
import statsmodels.api as sm  # 统计相关的库

data = base_data['close'] # 603999.SHA
m = 10 # 我们检验10个自相关系数

acf,q,p = sm.tsa.acf(data,nlags=m,qstat=True)  ## 计算自相关系数 及p-value
out = np.c_[range(1,11), acf[1:], q, p]
output=pd.DataFrame(out, columns=['lag', "AC", "Q", "P-value"])
output = output.set_index('lag')
output
Out[34]:
AC Q P-value
lag
1.0 0.956465 328.430140 2.112066e-73
2.0 0.897079 618.158315 5.869856e-135
3.0 0.833054 868.714467 5.406647e-188
4.0 0.763956 1080.028141 1.614647e-232
5.0 0.695939 1255.888809 2.298756e-269
6.0 0.629225 1400.059304 2.351952e-299
7.0 0.558667 1514.035519 0.000000e+00
8.0 0.488801 1601.537437 0.000000e+00
9.0 0.418519 1665.870366 0.000000e+00
10.0 0.346758 1710.160814 0.000000e+00

我们取显著性水平为0.05,可以看出,所有的p-value都小于0.05;则我们拒绝原假设H0。

因此,我们认为该序列,是序列相关

我们再来看看同期603999.SHA的日收益率序列:

In [35]:
data2 = base_data['close'].pct_change() # 603999.SHA日涨跌
m = 10 # 我们检验10个自相关系数

acf,q,p = sm.tsa.acf(data2.dropna(),nlags=m,qstat=True)  ## 计算自相关系数 及p-value
out = np.c_[range(1,11), acf[1:], q, p]
output=pd.DataFrame(out, columns=['lag', "AC", "Q", "P-value"])
output = output.set_index('lag')
output
Out[35]:
AC Q P-value
lag
1.0 0.375801 50.560197 1.155652e-12
2.0 0.196708 64.452221 1.010132e-14
3.0 0.262787 89.315763 3.072670e-19
4.0 0.169990 99.749439 1.112209e-20
5.0 0.120804 105.033795 4.585197e-21
6.0 0.195319 118.887369 2.790786e-23
7.0 0.138351 125.858198 4.603733e-24
8.0 0.161533 135.388078 2.156438e-25
9.0 0.157784 144.507072 1.208656e-26
10.0 -0.004290 144.513835 4.999161e-26

如果p-value均大于显著性水平0.05。我们选择假设H0,即,603999.SHA日收益率序列没有显著的相关性
但是这里均小于,则拒绝H0假设,改序列是序列相关

1.4 白噪声序列和线性时间序列

1.4.1 白噪声序列

随机变量X(t)(t=1,2,3……),如果是由一个不相关的随机变量的序列构成的,即对于所有S不等于T,随机变量Xt和Xs的协方差为零,则称其为纯随机过程。

对于一个纯随机过程来说,若其期望和方差均为常数,则称之为白噪声过程。白噪声过程的样本实称成为白噪声序列,简称白噪声。之所以称为白噪声,是因为他和白光的特性类似,白光的光谱在各个频率上有相同的强度,白噪声的谱密度在各个频率上的值相同。

1.4.2 线性时间序列

时间序列{rt},如果能写成: $$ \large r_t = \mu + \sum_{i=0}^{\infty}\psi_ia_{t-i} \\ \large \mu为r_t 的均值, \psi_0=1,\{a_t\}为白噪声序列$$ 则我们称{rt} 为线性序列。其中at称为在t时刻的新息(innovation)扰动(shock)

很多时间序列具有线性性,即是线性时间序列,相应的有很多线性时间序列模型,例如接下来要介绍的AR、MA、ARMA,都是线性模型,但并不是所有的金融时间序列都是线性的

对于弱平稳序列,我们利用白噪声的性质很容易得到rt的均值和方差: $$ \large E(r_t) = \mu , Var(r_t) = \sigma_a^2 \sum_{i=0}^{\infty} \psi_i^{2} \\ \large \sigma_a^2为a_t的方差。$$

因为 Var(rt)一定小于正无穷,因此 $$ \{\psi_i^2\}$$ 必须是收敛序列,因此满足 $$ i \to \infty 时, \psi_i^2 \to 0$$

即,随着i的增大,远处的扰动 at-i 对 rt 的影响会逐渐消失。

到目前为止介绍了一些基本知识和概念,如平稳性、相关性、白噪声、线性序列,介绍的过程中并没有太深入,目前来说“够用”了,一些细节会在后面章节补充。下面开始介绍一些线性模型。

二、自回归(AR)模型

在第一章中,我们计算了上证指数部分数据段的ACF,看表可知间隔为1时自相关系数是显著的。这说明在t-1时刻的数据rt-1 ,在预测t时刻时的 rt 时可能是有用的!

根据这点我们可以建立下面的模型:$$ \large r_t = \phi_0 + \phi_1r_{t-1} + a_t$$

其中{at}是白噪声序列,这个模型与简单线性回归模型有相同的形式,这个模型也叫做一阶自回归(AR)模型,简称AR(1)模型

从AR(1)很容易推广到AR(p)模型:$$ \large r_t = \phi_0 + \phi_1r_{t-1} + \cdots + \phi_pr_{t-p}+ a_t \qquad (2.0)$$

2.1 AR(p)模型的特征根及平稳性检验

我们先假定序列是弱平稳的,则有; $$\large E(r_t) = \mu \qquad \large Var(r_t) = \gamma_0 \qquad \large Cov(r_t,r_{t-j})=\gamma_j , 其中\mu,\gamma_0 是常数 $$

因为{at}是白噪声序列,因此有:$$ \large E(a_t) = 0, Var(a_t) = \sigma_a^2$$

所以有:$$ \large E(r_t) = \phi_0 + \phi_1E(r_{t-1}) + \phi_2E(r_{t-2}) + \cdots + \phi_pE(r_{t-p})$$

根据平稳性的性质,又有E(rt) = E(rt-1)=...= u,从而: $$ \large \mu = \phi_0 + \phi_1\mu + \phi_2\mu+ \cdots +\phi_p\mu\\ \large E(r_t)=\mu=\frac{\phi_0}{1-\phi_1 - \phi_2 - \cdots -\phi_p} \qquad (2.1)$$

对式2.1,假定分母不为0, 我们将下面的方程称为特征方程: $$ \large 1 - \phi_1x - \phi_2x - \cdots -\phi_px = 0$$

该方程所有解的倒数称为该模型的特征根,如果所有的特征根的模都小于1,则该AR(p)序列是平稳的。

下面我们就用该方法,检验603999.SHA日收益率序列的平稳性

In [36]:
temp = np.array(data2.dropna()) # 载入收益率序列
model = sm.tsa.AR(temp)  
results_AR = model.fit()  
plt.figure(figsize=(10,4))
plt.plot(temp,'b',label='Pct')
plt.plot(results_AR.fittedvalues, 'r',label='AR model')
plt.legend()
Out[36]:
<matplotlib.legend.Legend at 0x7fe3ae5e5978>
In [37]:
#看看模型有多少阶
print (len(results_AR.roots))
16

由于len返回值的下标为0,所以这里一共有17个,关于价次的讨论在下节内容,我们画出模型的特征根,来检验平稳性

In [38]:
pi,sin,cos = np.pi,np.sin,np.cos
r1 = 1
theta = np.linspace(0,2*pi,360)
x1 = r1*cos(theta)
y1 = r1*sin(theta)
plt.figure(figsize=(6,6))
plt.plot(x1,y1,'k')  # 画单位圆
roots = 1/results_AR.roots  # 注意,这里results_AR.roots 是计算的特征方程的解,特征根应该取倒数
for i in range(len(roots)):
    plt.plot(roots[i].real,roots[i].imag,'.r',markersize=8)  #画特征根
plt.show()

可以看出,所有特征根都在单位圆内,则序列为平稳的!

2.2 AR(p)模型的定阶

一般有两种方法来决定p:

第一种:利用偏相关函数(Partial Auto Correlation Function,PACF)

第二种:利用信息准则函数

2.2.1 偏相关函数判断p

对于偏相关函数的介绍,这里不详细展开,重点介绍一个性质:

AR(p)序列的样本偏相关函数是 p 步截尾的。

所谓截尾,就是快速收敛应该是快速的降到几乎为0或者在置信区间以内。

具体我们看下面的例子,还是以之前的收益率序列

In [39]:
fig = plt.figure(figsize=(20,5))
ax1=fig.add_subplot(111)
fig = sm.graphics.tsa.plot_pacf(temp,ax=ax1)

我们看出,按照截尾来看,模型阶次p在110+,但是之前调用的自动生成AR模型,阶数为17,这一点我也有些不解。。

当然,我们很少会用这么高的阶次。

2.2.2 信息准则--- AIC、BIC、HQ

现在有以上这么多可供选择的模型,我们通常采用AIC法则。我们知道:增加自由参数的数目提高了拟合的优良性,AIC鼓励数据拟合的优良性但是尽量避免出现过度拟合(Overfitting)的情况。所以优先考虑的模型应是AIC值最小的那一个。赤池信息准则的方法是寻找可以最好地解释数据但包含最少自由参数的模型。不仅仅包括AIC准则,目前选择模型常用如下准则:

AIC = -2 ln(L) + 2 k 中文名字:赤池信息量 akaike information criterion

BIC = -2 ln(L) + ln(n)*k 中文名字:贝叶斯信息量 bayesian information criterion

HQ = -2 ln(L) + ln(ln(n))*k hannan-quinn criterion

下面我们来测试下3种准则下确定的p,仍然用上证指数日收益率序列。为了减少计算量,我们只计算间隔前10个看看效果。

In [40]:
aicList = []
bicList = []
hqicList = []
for i in range(1,11):  #从1阶开始算
    order = (i,0)  # 这里使用了ARMA模型,order 代表了模型的(p,q)值,我们令q始终为0,就只考虑了AR情况。
    tempModel = sm.tsa.ARMA(temp,order).fit()
    aicList.append(tempModel.aic)
    bicList.append(tempModel.bic)
    hqicList.append(tempModel.hqic)
In [41]:
plt.figure(figsize=(15,6))
plt.plot(aicList,'r',label='aic value')
plt.plot(bicList,'b',label='bic value')
plt.plot(hqicList,'k',label='hqic value')
plt.legend(loc=0)
Out[41]:
<matplotlib.legend.Legend at 0x7fe3ae422a90>

可以看出,3个准则在第一点均取到最小值,也就是说,p的最佳取值应该在1,我们只计算了前10个,结果未必正确。

whatever,我们的目的是了解方法。

当然,利用上面的方法逐个计算是很耗时间的,实际上,有函数可以直接按照准则计算出合适的 order,这个是针对 ARMA模型的,我们后续再讨论。

2.3 模型的检验

根据式2.0,如果模型是充分的,其残差序列应该是白噪声,根据我们第一章里介绍的混成检验,可以用来检验残差与白噪声的接近程度。

我们先求出残差序列:

In [42]:
delta = results_AR.fittedvalues  - temp[16:]  # 残差
plt.figure(figsize=(10,6))
#plt.plot(temp[17:],label='original value')
#plt.plot(results_AR.fittedvalues,label='fitted value')
plt.plot(delta,'r',label=' residual error')
plt.legend(loc=0)
Out[42]:
<matplotlib.legend.Legend at 0x7fe3ae462630>

然后我们检查它是不是接近白噪声序列

In [43]:
acf,q,p = sm.tsa.acf(delta,nlags=10,qstat=True)  ## 计算自相关系数 及p-value
out = np.c_[range(1,11), acf[1:], q, p]
output=pd.DataFrame(out, columns=['lag', "AC", "Q", "P-value"])
output = output.set_index('lag')
output
Out[43]:
AC Q P-value
lag
1.0 -0.026093 0.232859 0.629412
2.0 -0.058686 1.414268 0.493055
3.0 -0.034972 1.835054 0.607337
4.0 -0.026931 2.085324 0.720069
5.0 0.002907 2.088249 0.836804
6.0 0.007117 2.105832 0.909712
7.0 -0.010781 2.146300 0.951301
8.0 -0.021245 2.303925 0.970248
9.0 0.022395 2.479614 0.981427
10.0 0.015499 2.564022 0.989910

观察p-value可知,该序列可以认为没有相关性,近似得可以认为残差序列接近白噪声。

2.4 拟合优度及预测

2.4.1 拟合优度

我们使用下面的统计量来衡量拟合优度:$$ \large R^2 = 1 - \frac{残差的平方和}{总的平方和}$$

但是,对于一个给定的数据集,R2是用参数个数的非降函数,为了克服该缺点,推荐使用调整后的R2: $$ \large Adj R^2 = 1- \frac{残差的平方}{r_t的方差} $$

它的值在0-1之间,越接近1,拟合效果越好。

下面我们计算之前对上证指数日收益率的AR模型的拟合优度。

In [44]:
score = 1 - delta.var()/temp[17:].var()
score
Out[44]:
0.084939230008408195

可以看出,模型的拟合程度并不好,当然,这并不重要,也许是这个序列并不适合用AR模型拟合。

2.4.2 预测

我们首先得把原来的样本分为训练集和测试集,再来看预测效果,还是以之前的数据为例:

In [45]:
train = temp[:-10]
test = temp[-10:]
output = sm.tsa.AR(train).fit()  
output.predict()
Out[45]:
array([ -1.01041480e-02,  -2.69727473e-03,  -7.50028109e-03,
        -4.11332806e-02,  -2.05957035e-02,  -4.17538454e-02,
        -2.12665692e-02,   8.97622879e-04,  -2.55382092e-02,
        -2.33526488e-02,  -3.49947327e-02,  -4.64674448e-02,
        -4.25645599e-02,  -6.13627875e-03,   1.80970384e-03,
        -1.27908796e-02,  -1.43930396e-02,  -1.24979492e-03,
        -1.27448809e-02,   4.28845657e-02,  -1.45048795e-02,
         1.22257572e-02,   2.21696075e-02,  -4.49100814e-03,
        -1.75361822e-02,   2.19319171e-02,   5.41700793e-03,
         1.22365100e-02,   2.24553382e-02,  -3.05163367e-03,
        -1.33644671e-02,   2.10859137e-02,  -3.48871576e-02,
         4.02179244e-04,  -5.98942983e-04,  -2.13858101e-02,
         7.96960091e-04,   1.47608965e-02,  -1.56664230e-02,
        -5.27672079e-03,  -1.07030895e-02,  -2.47293534e-02,
         1.04035952e-02,  -8.85404376e-03,   2.09354857e-02,
         1.34377790e-02,  -1.71054335e-02,   7.22726667e-03,
         2.64077901e-02,   1.24445588e-02,   4.01652130e-03,
         1.34277210e-03,   6.49349614e-03,  -2.19684423e-02,
         4.40641213e-03,  -7.73525189e-03,   8.86329913e-03,
         1.86260704e-02,  -2.30717512e-02,  -3.75961634e-03,
         4.04928154e-03,  -2.03798134e-02,  -2.20350649e-04,
        -1.12312999e-02,   3.58506773e-03,  -1.18158194e-04,
         5.50424526e-03,   7.65558075e-03,  -1.07317081e-02,
         2.40778806e-03,  -1.27360711e-02,  -1.45127371e-02,
         1.42739352e-02,  -1.03049694e-02,   7.34744541e-04,
         1.22147461e-02,  -2.09469202e-02,  -7.69818770e-03,
         1.72677736e-03,  -1.16064501e-02,   7.10340605e-04,
         1.03560775e-02,  -1.00573126e-02,  -9.60856091e-03,
         1.77124010e-02,  -1.58606723e-02,   1.40195667e-02,
         9.51912641e-03,  -7.78730959e-03,  -2.32704221e-03,
        -1.28461860e-02,   2.75357853e-03,  -5.45682268e-05,
         2.58285754e-03,  -7.61918116e-03,   4.83819546e-03,
         9.85144995e-03,  -8.00462549e-03,   3.89455053e-03,
         1.09241941e-02,   1.07177518e-02,   7.05418470e-05,
        -4.64267818e-03,   1.09758411e-03,   3.46240161e-03,
        -1.06156726e-02,  -1.20875284e-02,   1.23169435e-02,
        -3.49243630e-03,  -1.09793132e-02,   4.93788927e-05,
         4.69615764e-03,  -1.43164917e-02,  -1.99279468e-03,
        -2.51885166e-02,   7.07291440e-03,   1.05078331e-02,
        -1.24630929e-02,   1.76624449e-02,  -3.54372096e-03,
        -4.03506749e-03,   7.09630900e-03,   9.02408212e-03,
         1.17206507e-03,   3.38367331e-04,  -7.67525662e-04,
        -2.31725334e-02,   6.90022328e-03,   1.94322120e-03,
         3.11095983e-03,   1.01410670e-02,  -2.15733623e-02,
        -1.64930283e-03,  -1.32847414e-02,   3.05338835e-03,
        -2.88919850e-03,  -1.02239866e-02,  -8.30610187e-03,
        -2.39415299e-02,   9.11127953e-03,  -8.34341698e-03,
        -2.72641719e-03,   6.12549843e-03,  -7.94455442e-03,
         1.19286404e-02,  -1.40790334e-02,  -3.84058874e-03,
         3.73946526e-03,   2.45174965e-03,   7.51826041e-04,
         3.67553452e-03,   1.12881758e-02,  -8.07694132e-03,
         1.53126364e-02,  -4.28509792e-03,   8.10504883e-04,
        -7.37169430e-03,  -3.30586443e-03,   9.65495176e-03,
         2.51674474e-03,  -4.42798534e-03,  -4.04536502e-03,
        -6.92411612e-03,  -7.73325435e-03,   8.27875488e-04,
         1.02000392e-03,  -1.19737650e-03,  -7.25723900e-04,
        -9.28840597e-03,   2.35522313e-03,  -5.82347552e-03,
        -4.15390523e-03,  -1.43460116e-03,  -3.11699493e-03,
         6.17512535e-03,  -5.04419726e-03,   1.13395330e-03,
        -1.20515186e-03,   6.38406213e-03,  -1.65846905e-03,
         1.03956503e-02,  -6.06088472e-03,  -3.22088486e-03,
         2.64811186e-03,   1.84094043e-02,   1.71424926e-02,
         2.40058935e-02,  -3.94065357e-03,  -1.41353681e-02,
         3.59307249e-03,  -2.70704772e-02,   2.18826796e-02,
         4.20221622e-03,  -1.50092242e-03,   6.41262924e-03,
        -3.06464420e-02,  -1.93582559e-02,  -1.51230808e-02,
        -2.79743886e-02,   7.22742579e-04,   2.44385907e-03,
        -1.51309486e-02,  -1.57609597e-03,  -9.15481048e-03,
        -2.10397777e-02,   1.89089498e-02,  -9.56081722e-03,
         1.19495763e-02,  -5.14015149e-03,   5.37760611e-04,
         8.88560584e-03,   5.10516262e-03,  -8.97511312e-03,
         1.62062408e-03,   6.71964857e-03,  -8.52870736e-03,
         3.79611956e-03,  -1.42165557e-02,  -5.66250843e-03,
         1.07876892e-03,  -1.12018333e-02,   1.31425738e-02,
        -6.60924872e-04,  -7.93677386e-03,   6.94139744e-03,
        -1.29904584e-02,   1.19499105e-03,  -3.80936226e-03,
        -1.49278725e-02,  -3.44391378e-03,   4.79634564e-03,
        -7.54132267e-03,   1.82075060e-02,   1.35758414e-02,
        -1.91848297e-02,   8.94206148e-03,  -1.02445715e-02,
        -9.45853607e-03,   1.56309161e-02,  -6.21675155e-03,
         3.69461480e-03,   1.13655210e-02,  -8.70145317e-03,
         2.73113643e-03,   1.35046290e-02,  -1.43398924e-02,
        -8.23587283e-03,   9.30523726e-03,  -8.96527781e-03,
        -4.54630116e-03,  -1.67987074e-03,   1.10405535e-03,
        -3.25352359e-03,  -5.68672302e-03,   5.73732770e-03,
        -5.11071382e-03,   8.93536812e-03,  -4.93827348e-03,
        -5.98620680e-03,  -1.81972674e-03,  -9.45401139e-03,
        -6.45868948e-03,   1.05538464e-02,   4.88366551e-03,
        -1.05931022e-03,   7.66409051e-03,   3.89507367e-03,
        -1.16538231e-02,   1.50731840e-02,  -7.21304148e-03,
         2.95406322e-03,  -1.70987906e-03,  -3.65746382e-03,
        -8.08444668e-04,   2.42545176e-03,  -4.24224083e-03,
         2.73561859e-04,  -2.90318909e-03,   4.61517677e-04,
        -6.29559441e-03,   9.93551403e-04,  -3.50061398e-03,
         1.01620581e-03,  -2.87769733e-03,  -1.59310441e-03,
         3.02271858e-03,  -3.45727293e-03,  -7.51396685e-03,
        -4.01765708e-03,  -3.08554131e-03,   1.83262557e-03,
         7.35481044e-04,  -6.25630573e-03,  -4.90428598e-03,
        -2.28319796e-03,  -4.44213338e-03,   4.15475922e-03,
        -4.54408906e-03,   4.44789519e-04,   7.02370172e-04,
        -1.04872756e-02,  -1.18632405e-03,  -1.27844966e-03,
        -1.19665458e-03,   1.66483765e-03,   2.40719330e-03,
        -8.89873762e-03,   2.60318071e-03,  -6.67867068e-03,
         1.85781898e-03,   7.93958749e-03,  -1.89883882e-03,
        -1.34384129e-02,   1.98164381e-03,  -5.73553154e-04,
         2.49158260e-04,  -3.20152880e-03,   4.08503471e-04,
        -1.11325544e-02,   1.85628216e-03,  -2.72503751e-03,
         4.20654335e-03,   3.35411988e-03,  -9.15892639e-03,
        -6.44229183e-03,   8.88864220e-03,   3.36027871e-04,
        -5.72444725e-04,  -4.84821978e-04])
In [54]:
predicts=output.predict(320,329,dynamic=True)
print (len(predicts))
comp = pd.DataFrame()
comp['original'] = temp[-10:]
comp['predict'] = predicts
comp
10
Out[54]:
original predict
0 -0.000935 0.001665
1 0.021067 0.003459
2 0.010546 -0.003579
3 0.000000 -0.002693
4 -0.005898 -0.001708
5 -0.047011 -0.001859
6 -0.061782 0.007087
7 0.001021 0.002034
8 0.005609 -0.003315
9 -0.001521 0.000069

该模型的预测结果是很差的呢~

那么我们是不是可以通过其他模型获得更好的结果呢? 我们将在下一部分继续介绍。

参考文献

1.《金融时间序列分析》 第2版 Ruey S.Tsay著 王辉、潘家柱 译
2.Time Series analysis tsa http://nipy.bic.berkeley.edu/nightly/statsmodels/doc/html/tsa.html