@Channelchan
2017-04-28T16:05:45.000000Z
字数 2213
阅读 10485
时间序列是以时间排序的一组数据,金融数据基本都是以时间序列的形式存在,如股票,期货,外汇的价格。
而说到时间序列不得不提的就是时间序列的平稳性。一切时间序列的模型都是基于平稳性,如果不是平稳的时间序列,很容易出现所谓的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)的序列。
import numpy as np
import matplotlib.pyplot as plt
i0=np.random.normal(0,1,99)
i1=np.cumsum(i0)
i2=np.cumsum(i1)
fig1 = plt.figure(figsize=(15,5))
ax1=fig1.add_subplot(311)
ax2=fig1.add_subplot(312)
ax3=fig1.add_subplot(313)
ax1.plot(i0)
ax2.plot(i1)
ax3.plot(i2)
plt.show()
发现时间序列的不平稳,我们可以通过观察图形。下面我们看看模拟固定趋势,随机趋势和平稳序列的图。
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(1,100,1)
z=np.random.normal(0,1,99)
y_ft=0.3*x+z
y_st=np.zeros(100)
for j in np.arange(99):
y_st[j+1]=y_st[j]+z[j]
fig2 = plt.figure(figsize=(15,5))
ax1=fig2.add_subplot(311)
ax2=fig2.add_subplot(312)
ax3=fig2.add_subplot(313)
ax1.plot(y_ft)
ax2.plot(y_st)
ax3.plot(z)
很明显第一幅图是稳定的趋势,随着时间增长而上涨。第二幅其实就是我们所说的随机游走,也就是当前的观测值等于上一期的值加上一个白噪声,,从图中可见随机漫步忽上忽下没有稳定的趋势。而第三幅图则是俗称的白噪声,即独立同分布,且均值为0,方差为常数,无序列相关性的一个时间序列,是一个平稳的过程,可以看见其在均值0上下波动。
一般来说,如果序列呈现上面第三幅图的形状,我们可以假设其平稳,当然由图中直接推断比较不够准确。我们可以用统计检验来验证。
检验平稳性,我们使用ADF-test。其原假设为序列不平稳。下面使用股票数据来做一个例子。
from statsmodels.tsa.stattools import adfuller
import tushare
import pandas as pd
import matplotlib.pyplot as plt
data=tushare.get_k_data('000001', start='2016-01-01', end='2016-12-31', ktype='D',autype='qfq')
data.index = pd.to_datetime(data['date'],format='%Y-%m-%d')
data=data['close']
plt.plot(data)
p_value=adfuller(data)[1]
print('p_value:%s' %p_value)
plt.plot(data.diff())
p_value=adfuller(data.diff()[1:])[1]
#p_value=adfuller(data.pct_change()[1:])[1]
print('p_value:%s' %p_value)
第一个p-value不显著而第二个p-value显著,也就是说未差分前序列不平稳,而差分后序列平稳。
根据ADF-test的结果,可以断定该序列为I(1),也就是不平稳。所以一般我们会使用收益率来进行时间序列的建模。