[关闭]
@Channelchan 2017-04-28T16:05:45.000000Z 字数 2213 阅读 10485

时间序列1


时间序列是以时间排序的一组数据,金融数据基本都是以时间序列的形式存在,如股票,期货,外汇的价格。
而说到时间序列不得不提的就是时间序列的平稳性。一切时间序列的模型都是基于平稳性,如果不是平稳的时间序列,很容易出现所谓的spurious regression。
举个例子,你可能会发现某地的累计降雨量和它的CPI存在正相关关系,你run了个regression,发现模型的R方还不错,这是否意味着你可以用累计降雨量去预测CPI呢?NO.之所以会这样,是因为这两个序列都会随时间而增长,也就是说存在一个固定的趋势,即不平稳。不过大部分的金融时间序列并不会有固定趋势(不然你就无脑买就好啦),但是还有一种随机趋势,而大部分的金融时间序列都是随机趋势,也就是常说的随机漫步。
何谓平稳性呢?
一个时间序列,如果均值没有系统的变化(无趋势)、方差没有系统变化,且严格消除了周期性变化,就称之是平稳的。
平稳性又分为强平稳和弱平稳。
强平稳过程的条件呢, 就是一段时间序列, 你在当中随便取两段长度一样的时间序列出来,它们两个的联合分布得相同。这个要求有点过分,所以我们一般所指的平稳为弱平稳。
弱平稳的条件为,时间序列的均值与方差是常数函数,协方差只依赖于时间间隔。用公式表达就是

如果一个时间序列经过一次差分变成平稳的,则称原序列是1阶单整的,记为I(1)。 一般地,如果时间序列经过d次差分后变成平稳序列,而经过d-1次差分仍不平稳,则称原序列是d阶单整序列,记为I(d)。如果时间序列平稳,则记为I(0)。我们来模拟一下I(0),I(1)和I(2)的序列。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. i0=np.random.normal(0,1,99)
  4. i1=np.cumsum(i0)
  5. i2=np.cumsum(i1)
  6. fig1 = plt.figure(figsize=(15,5))
  7. ax1=fig1.add_subplot(311)
  8. ax2=fig1.add_subplot(312)
  9. ax3=fig1.add_subplot(313)
  10. ax1.plot(i0)
  11. ax2.plot(i1)
  12. ax3.plot(i2)
  13. plt.show()

发现时间序列的不平稳,我们可以通过观察图形。下面我们看看模拟固定趋势,随机趋势和平稳序列的图。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. x=np.arange(1,100,1)
  4. z=np.random.normal(0,1,99)
  5. y_ft=0.3*x+z
  6. y_st=np.zeros(100)
  7. for j in np.arange(99):
  8. y_st[j+1]=y_st[j]+z[j]
  9. fig2 = plt.figure(figsize=(15,5))
  10. ax1=fig2.add_subplot(311)
  11. ax2=fig2.add_subplot(312)
  12. ax3=fig2.add_subplot(313)
  13. ax1.plot(y_ft)
  14. ax2.plot(y_st)
  15. ax3.plot(z)

很明显第一幅图是稳定的趋势,随着时间增长而上涨。第二幅其实就是我们所说的随机游走,也就是当前的观测值等于上一期的值加上一个白噪声,,从图中可见随机漫步忽上忽下没有稳定的趋势。而第三幅图则是俗称的白噪声,即独立同分布,且均值为0,方差为常数,无序列相关性的一个时间序列,是一个平稳的过程,可以看见其在均值0上下波动。
一般来说,如果序列呈现上面第三幅图的形状,我们可以假设其平稳,当然由图中直接推断比较不够准确。我们可以用统计检验来验证。

检验平稳性,我们使用ADF-test。其原假设为序列不平稳。下面使用股票数据来做一个例子。

  1. from statsmodels.tsa.stattools import adfuller
  2. import tushare
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. data=tushare.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D',autype='qfq')
  6. data.index = pd.to_datetime(data['date'],format='%Y-%m-%d')
  7. data=data['close']
  8. plt.plot(data)
  9. p_value=adfuller(data)[1]
  10. print('p_value:%s' %p_value)
  11. plt.plot(data.diff())
  12. p_value=adfuller(data.diff()[1:])[1]
  13. #p_value=adfuller(data.pct_change()[1:])[1]
  14. print('p_value:%s' %p_value)

第一个p-value不显著而第二个p-value显著,也就是说未差分前序列不平稳,而差分后序列平稳。
根据ADF-test的结果,可以断定该序列为I(1),也就是不平稳。所以一般我们会使用收益率来进行时间序列的建模。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注