时间序列
简而言之,时间序列就是带时间戳的数值序列。股票,期货等金融数据就是典型的时间序列。量化的过程,很多时间都是在分析时间序列,找到稳定赚钱因子。
平稳性定义
所谓时间序列的平稳性,是指时间序列的均值,方差以及协方差都是常数,与时间t无关。这样的序列才可以作为我们基于历史预测未来的基础。
满足以上条件属于严平稳,一般达到弱平稳都是可以接受的。
平稳性是当前时间序列分析的前提条件,因为我们的建模过程基本都是以大数定理和中心极限定理为理论基础(比如ARMA,ARIMA模型等),而大数定理和中心极限定理也是有前提条件的,那就是要求样本同分布(等价于时间序列的平稳性)。如果这个条件不满足,那么我们的很多分析结果是不可靠的。
- 白噪声属于平稳序列,因为它的均值为0,方差为常数,协方差为0。但白噪声属于纯随机序列,基于它预测是没有意义的。
- 随机游走属于非平稳序列,因为它的均值为常数,但是方差为非常数,与时间t有关。
平稳性检验
对于一个时间序列,我们如何处理呢?
1 检验序列是否平稳性序列
2 如果序列非平稳,通过数学变换为平稳性序列
3 检验序列是否白噪声
4 下一步
平稳性检验常用方法有ADF检验和KPSS检验。
平稳性检验-ADF Test
ADF Test:Augmented Dickey-Fuller Test
首先假设时间序列是不稳定的,根据假设求得的置信度P值如果小于阈值(一般为1%),那么我们认为假设不成立,时间序列是稳定的;反之,假设成立。
Python和R都有相应平稳性检验的模块。
Python需安装statsmodels模块。
R需安装tseries模块。
这里以Python为例:
#python
import numpy as np
from statsmodels.tsa.stattools import adfuller
ss = np.random.randn(10000)
adfuller(ss)
#(-100.04436307924058,
# 0.0, ##(P Value)
# 0,
# 9999,
# {'1%': -3.4310041633725734,
# '10%': -2.566923883481157,
# '5%': -2.861829101294412},
# 28143.20974307366)
检验结果的第二项为P值,这里为0.0%,远低于阈值1%,因为我们检验的是一个标准正太分布,因此假设肯定是不成立的,我们的序列为稳定性时间序列。
平稳性检验-KPSS Test
KPSS Test:Kwiatkowski-Phillips-Schmidt-Shin Test
首先假设序列是平稳的,根据假设求得的P值如果小于阈值(一般为5%),那么假设不成立;反之,假设成立。仍以Python为例:
#python
import numpy as np
from statsmodels.tsa.stattools import kpss
ss = np.random.randn(10000)
kpss(ss)
# (0.09407968315491025,
# 0.1, ##(P Value)
# 38,
# {'1%': 0.739, '10%': 0.347, '2.5%': 0.574, '5%': 0.463})
检验结果的第二项为P值,这里为10%,远高于阈值5%,因此假设是成立的,我们的序列为稳定性时间序列。
白噪声检验-Ljung-Box Test
首先假设序列为白噪声,根据假设求得的P值如果小于阈值(一般为5%),那么假设不成立;反之,假设成立。仍以Python为例:
#python
import numpy as np
from statsmodels.stats.diagnostic import acorr_ljungbox as ljbox
ss = np.random.randn(10000)
ljbox(ss, lags=1)
# (array([0.00307541]),
# array([0.95577487])) ##P-Value
检验结果的第二项为P值,这里为95.57%,远高于阈值5%,因此假设是成立的,我们的序列为白噪声序列(实际是随机序列)。
峰度 - Kurtosis
峰度表征统计分布在平均值处峰值高低的度量,反应了峰部的尖度。
峰度按数值包括三类:
- 正态分布(Kurtosis = 0)
- 厚尾分布(Kurtosis > 0)
- 瘦尾分布(Kurtosis < 0)
金融时间序列一般都是厚尾分布。
Python峰度计算采用scipy模块,R峰度计算采用moments模块。
这里需要说明的是:Python峰度计算是以0为中间值,R中峰度计算是以3位中间值(R峰度计算过程中没有减3的操作)。
以Python为例:
#python
import numpy as np
from scipy.stats import kurtosis
ss = np.random.randn(10000)
kurtosis(ss)
# -0.045421184138716875
偏度 - Skewness
偏度表征统计分布偏斜方向和程度的度量,是统计分布非对称程度的数字特征。
偏度按数值包括三类:
- 正态分布(skew = 0)
- 左偏分布(skew < 0),峰在左边。
- 右偏分布(skew > 0),峰在右边。
以Python为例:
#python
import numpy as np
from scipy.stats import skew
ss = np.random.randn(10000)
skew(ss)
# -0.0071660377825474705
非平稳变换
非平稳的序列如何变换成平稳系列呢?
一般有如下几种方法:
- 对数变换
- 平滑变换(移动平均,指数平均等)
- 差分变换(一阶差分,二阶差分,高阶差分等)
- 分解变换(多成分分解 = 长期趋势 + 中期趋势 + 随机)
这里就不展开了。