Bootstrap

时间序列_python自相关系数(ACF)绘图

一、概述

自相关函数,用来度量同一事件在不同时期之间的相关程度,或者说是一个信号经过类似于反射、折射等其它情况的延时后的副本信号与原信号的相似程度。
R ( τ ) = E [ ( X t − μ ) ( X t − τ − μ ) ] σ 2 R(\tau) = \frac{E[(X_t - \mu)(X_{t-\tau} - \mu)]}{\sigma ^ 2} R(τ)=σ2E[(Xtμ)(Xtτμ)]

简单讲就是比较不同时间延迟两个序列的相似程度,就好比下图蓝色框内序列和红色框内序列之间的相关性。
在这里插入图片描述

二、python实现&statsmodels自带绘制

python绘制

基于公式,计算滞后h的自相关系数

import numpy as np
import matplotlib.pyplot as plt
from numba import jit 
from statsmodels.graphics.tsaplots import plot_acf

@jit(nopython=True)
def self_corr(in_arr, h):
    """
    自相关系数:
    E((X_t-u)(X_{t-h} -u))/var(X)
    简单化简了下
    """
    u = np.mean(in_arr)
    s1 = in_arr[h:]
    s2 = in_arr[:-h] if h !=0  else in_arr
    return np.sum((s1 - u) * (s2 - u) / np.sum((in_arr-u)*(in_arr-u)))

基于相关系数,计算每次滞后的自相关系数,并绘制图形

def m_acf_plot(s, lags, ax='no', show_flag=False):
    acf_list = []
    plot_fig = ax
    if ax == 'no':
        plot_fig = plt
        plt.figure(figsize=(10, 6))

    for i in range(0, lags+1):
        p_ = np.round(self_corr(s, i), 5)
        acf_list.append(p_)
        plot_fig.vlines(x=i, ymin=0, ymax=p_, alpha=0.7)

    plot_fig.scatter(list(range(lags+1)), acf_list)
    plot_fig.axhline(y=0, c='steelblue')
    try:
        plot_fig.title('ACF plot')
    except:
        plot_fig.set_title('ACF plot')
    if show_flag:
        plt.show()
    return acf_list

statsmodels绘制及比对

x = np.arange(600) / 100 * np.pi
y = np.sin(x)
fig, axes = plt.subplots(3, 1, figsize=(12, 10))
axes[0].plot(y)
for i in [200, 400]:
    axes[0].vlines(x=i, ymin=-1, ymax=1, linestyle='--', alpha=0.6)

plot_acf(y, ax=axes[1], lags=300)
acf_list=m_acf_plot(y, lags=300, ax=axes[2])
plt.show()

绘制结果如下,可以看出我们绘制的图形与statsmodels的绘制是一致。
在这里插入图片描述

三、从ACF中的发现

从上图中我们基本能够看出,序列在经过了200个t滞后和序列的相关又达到了峰值,所以序列的周期大概是200

;