时间序列学习(1):平稳性、自相关性


做量化始终逃不掉对时间序列的分析。这个系列笔记是作为小白的我对时间序列分析基础知识的整理。不到之处,多多包涵。

1、基本统计概念

在一切开始之间得先回顾一下统计中的一些基本概念,这将有助于后续介绍时间序列。

协方差

X , Y X,Y X,Y是两个随机变量(分布未知), X , Y X,Y X,Y的总体协方差为:

C o v ( X , Y ) = E [ ( X − μ X ) ( Y − μ Y ) ] Cov(X,Y)=E[(X-\mu_X)(Y-\mu_Y)] Cov(X,Y)=E[(XμX)(YμY)]

其中, μ X , μ Y \mu_X,\mu_Y μX,μY X , Y X,Y X,Y的均值。

基于样本计算协方差:

1 n − 1 ∑ i = 1 n ( X i − X ˉ ) ( Y i − Y ˉ ) \frac{1}{n-1}\sum^n_{i=1}(X_i-\bar{X})(Y_i-\bar{Y}) n11i=1n(XiXˉ)(YiYˉ)

相关系数

X , Y X,Y X,Y是两个随机变量, X , Y X,Y X,Y的总体相关系数为:

ρ ( X , Y ) = E [ ( X − μ X ) ( Y − μ Y ) ] σ X σ Y \rho(X,Y)=\frac{E[(X-\mu_X)(Y-\mu_Y)]}{\sigma_X\sigma_Y} ρ(X,Y)=σXσYE[(XμX)(YμY)]

σ X , σ Y \sigma_X,\sigma_Y σX,σY分别为 X , Y X,Y X,Y的总体标准差。

注意

  • ρ ( X , Y ) \rho(X,Y) ρ(X,Y)取值为1:正相关;0:不相关;-1:负相关;
  • ρ ( X , Y ) \rho(X,Y) ρ(X,Y)只能描述 X , Y X,Y X,Y的线性相关性,不能描述非线性相关性。

基于样本计算相关系数:

ρ ^ ( X , Y ) = ∑ i = 1 n ( X i − X ˉ ) ( Y i − Y ˉ ) ∑ i = 1 n ( X i − X ˉ ) 2 ( Y i − Y ˉ ) 2 \hat{\rho}(X,Y)=\frac{\sum^n_{i=1}(X_i-\bar{X})(Y_i-\bar{Y})}{\sqrt{\sum^n_{i=1} (X_i-\bar{X})^2(Y_i-\bar{Y})^2}} ρ^(X,Y)=i=1n(XiXˉ)2(YiYˉ)2 i=1n(XiXˉ)(YiYˉ)

其中, X ˉ , Y ˉ \bar{X},\bar{Y} Xˉ,Yˉ X , Y X,Y X,Y的样本均值;分母的 n − 1 n-1 n1使得样本协方差为总体协方差的无偏估计。

2、啥是时间序列

从统计角度来讲,时间序列就是随机过程(离散的情形叫随机序列)。因为是在时间轴上的随机变量集合 { r t } \{r_t\} {rt},又叫时间序列。

注意,每一个时间点上是一个随机变量,有自己的分布。

我们平时看到的在时间轴上的曲线图,是给定时间段以及每个时间点的随机变量得到一个观测值后的数值序列。这个数值序列是千万种可能中的一种而已。

下图是沪深300自2018年1月1日至2019年12月13日的走势图。它每个时间点是指数的点数。这个走势图是某个时间序列的一个观测(因为历史只有一个,我们也只能观测到一种现实)。

# 基于聚宽接口
prices = get_price('000300.XSHG', start_date='2018-01-01', end_date='2019-12-13', frequency='daily', fields='close')
fig = plt.figure(figsize=(10, 6))
ax = fig.add_axes([0.2, 0.2, 1.2, 1.2])

ax.plot(prices, color="blue", linewidth=1.5, linestyle="-", label=r'hs300')
plt.legend(loc='upper right', frameon=False)

在这里插入图片描述

光看上图,我们看不出这个时间序列有啥规律可循。2018年年初到年底,有很明显的下降趋势(我们都知道为什么);2019年至今又是一个上涨加盘整的趋势。不管怎么样,对于指数点数来说,我们看不出什么周期性和规律性。

3、平稳性

研究者们觉得,对不那么上蹿下跳的时间序列进行分析应该更加靠谱。如果存在这样的时间序列,那么分析它们也许也能做出一定的预测。研究者们称这类时间序列为平稳时间序列。

要使得时间序列平稳,那么一个较为宽松的条件就是使它们的统计特征保持不变。下面是时间序列弱平稳性的要求:

时间序列 r t {r_t} rt弱平稳的,那么:

  • 均值平稳性:对于任意的 t t t,有 E [ r t ] = μ E[r_t]=\mu E[rt]=μ,其中 μ \mu μ为常数;
  • 二阶平稳性: 对于任意的 t t t及间隔 k k k r t r_t rt r t − k r_{t-k} rtk的协方差 σ ( r t , r t − k ) = γ k \sigma(r_t,r_{t-k})=\gamma_k σ(rt,rtk)=γk仅依赖 k k k σ ( r t , r t ) = γ 0 \sigma(r_t,r_t)=\gamma_0 σ(rt,rt)=γ0不随时间变化,是方差平稳的。

均值平稳性说的是序列在某个固定值上下波动;二阶平稳性说的是,两个子序列波动的相关性。如果时间间隔为0,就是单个时间点自身,它与自己肯定是相关的,其方差(或者波动的幅度)必须是固定的。如果时间间隔为k,那么这相距k的两个时间点的波动相关性只与k有关。

更为严格的,如果任意两个时间段内的子序列中的随机变量的联合概率分布是一样的,那么这类时间序列是严平稳的。这个条件比较难以达到。我们平时要求时间序列达到弱平稳的就够用了。

第2节的指数走势图看上去不那么“平稳”,那么我们看看它的日收益曲线如何(见下图)。

import pandas as pd

returns = {'return':{}}
for i in range(len(prices)):
    current_price = prices.iloc[i,0]
    if i == 0:
        current_return = 0
    else:
        last_price = prices.iloc[i-1,0]
        current_return = (current_price-last_price)/last_price
    date = list(prices.index)[i]
    returns['return'][date] = current_return
return_df = pd.DataFrame(returns, columns=['return'], index=list(prices.index))

fig = plt.figure(figsize=(10, 6))
ax = fig.add_axes([0.2, 0.2, 1.2, 1.2])
ax.plot(return_df, color="blue", linewidth=1.5, linestyle="-", label=r'hs300-daily-returns')
plt.legend(loc='upper right', frameon=False)

在这里插入图片描述

日收益曲线看上去比指数走势图要“平稳”一些,表现在:
(1)序列看上去都在某个值(均值,貌似是0)上下波动;
(2)序列似乎有个波动范围(方差),上图的单日波动都在6%以下(毕竟,个股单日涨跌停最大是10%)。

上述日收益曲线究竟是不是平稳还需要严格的检验,这个后面再说。

4、自相关性

上一节谈到了相关性:两个时间点的波动相关性用它们的协方差来衡量。但是,对于不同的标的,由于价格相差很大,算出来的协方差也差别很大,看不出究竟谁更相关,谁更不相关。

所以,一个简单的处理就是将协方差归一化到[-1,-1]的范围内。这样对于任意的时间序列相关性度量,都可以用统一的标准。

于是,结合第1节的相关系数,很自然地给出了下面的时间序列相关系数的算法:

ρ k = C o v ( r t , r t − k ) σ r t σ r t − k = C o v ( r t , r t − k ) σ r t σ r t = γ k γ 0 \rho_k=\frac{Cov(r_t,r_{t-k})}{\sigma_{r_t}\sigma_{r_{t-k}}}=\frac{Cov(r_t,r_{t-k})}{\sigma_{r_t}\sigma_{r_t}}=\frac{\gamma_k}{\gamma_0} ρk=σrtσrtkCov(rt,rtk)=σrtσrtCov(rt,rtk)=γ0γk

一些性质:

  • k = 0 , ρ 0 = 1 k=0,\rho_0=1 k=0,ρ0=1;
  • ρ k = ρ − k \rho_k=\rho_{-k} ρk=ρk;
  • − 1 ≤ ρ k ≤ 1 -1\le\rho_k\le1 1ρk1.

上面这个相关系数又自相关系数,是因为它衡量的是同一个时间序列内的两个不同的时间段的相关性。我们当然可以研究两个不同时间序列同一时间段的相关性(比如不同到期合约的价差分析),其相关系数同样采用上面的式子给出。

当然,我们只能通过样本计算相关系数。下面是基于样本计算自相关系数的公式:

ζ k = c k c 0 ; c k = 1 n ∑ t = 1 n − k ( r t − r ˉ ) ( r t + k − r ˉ ) \zeta_k=\frac{c_k}{c_0}; c_k=\frac{1}{n}\sum_{t=1}^{n-k}(r_t-\bar{r})(r_{t+k}-\bar{r}) ζk=c0ck;ck=n1t=1nk(rtrˉ)(rt+krˉ)

其中 c k c_k ck为样本自协方差, ζ k \zeta_k ζk为样本自相关系数。

5、相关图

上面给出的相关系数(或者自相关系数)只与时间间隔有关。因此,我们可以把不同时间间隔的相关系数算出来并且绘制在图中。这个图就是相关图。

我们用statsmodels来绘制相关图。statsmodels是大部分用python的朋友做时间序列分析首选的工具包。下面绘制的相关图是上面沪深300自2018年1月1日至2019年12月13日的日收益率的相关图。

import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf

fig = plt.figure(figsize=(10, 6))
ax = fig.add_axes([0.2, 0.2, 1.2, 1.2])
plot_acf(return_df, ax)
plt.show()

在这里插入图片描述

可以看到,当时间间隔为0的时候,相关系数为1,很显然,每个点和自己都是完全相关的。当时间间隔大于1,相关系数便只是在0附近波动,说明不同时间点的单日收益相关性不大。

图中浅蓝色区域是95%的置信区间,如果相关系数在置信区间内,我们可以认为这个间隔下的子序列是不相关的。图中有个别间隔的序列相关系数超过置信区间,说明子序列还不是完全不相关的。不过大致上,我们可以认为沪深300的单日收益和其它交易日关联度不大。

  • 24
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值