时间序列分析主要包括三个检验:白噪声检验,平稳性检验和时间序列数据的自相关系数和偏自相关系数的分析
# 一些导入的准备工作
"""
主要参考书籍:孙玉林,余本国.2021年9月.Python机器学习算法与实战.电子工业出版社
"""
# 导入科学运算和绘图的包
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
# 输出高清图像
%config InlineBackend.figure_format="retina"
%matplotlib inline
sns.set(font="Kaiti",style="ticks",font_scale=1.4) # 规范sns输出的图片格式
# 解决显示中文的问题
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams["font.sans-serif"] = ["SimHei"]
# 生成实验数据
# 生成随机数据,用于实验(X1为非随机化数据,X2为随机化数据)
# 设置随机数种子以确保结果的可复现性
np.random.seed(42)
# 设置时间序列的长度
length = 100
# 生成时间序列索引
dates = pd.date_range(start='2023-01-01', periods=length, freq='D')
# 生成带有线性趋势的X1序列数据
slope = 0.1 # 线性趋势的斜率
intercept = 10 # 线性趋势的截距
X1_trend = slope * np.arange(length) + intercept
X1 = X1_trend + np.random.randn(length) # 在趋势基础上添加随机噪声
# 生成完全随机的X2序列数据
X2 = np.random.randn(length) + 14
# 将数据组合成DataFrame
df = pd.DataFrame({'date': dates, 'X1': X1, 'X2': X2})
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
# 数据可视化
df.head()
# 可视化时间序列数据
df.plot(kind="line",figsize=(10,6))
plt.grid() # 添加网格线
plt.title("时序数据")
plt.show()
# 白噪声检验
如果一个序列是白噪声(独立同分布的随机数据),那么进行时间序列分析是无意义的。因此需要进行白噪声检验
常用的检验方法为LB检验(Ljung-Box检验)
H0:延迟期数小于或等于m期的序列之间相互独立(序列为白噪声)
H1:延迟期数小于或等于m期的序列之间存在相关性(序列不为白噪声)
利用sm.stats.diagnostic.acorr_ljungbox()进行白噪声检验
## LB检验
import statsmodels.api as sm
lags = [4,8,16,32] #m
LB = sm.stats.diagnostic.acorr_ljungbox(df["X1"],lags=lags,return_df=True)
print("序列X1的检验结果:\n",LB)
LB = sm.stats.diagnostic.acorr_ljungbox(df["X2"],lags=lags,return_df=True)
print("序列X2的检验结果:\n",LB)
检验结果如下:
根据LB检验的结果,在延迟阶数[4,8,16,32]的情况下,X1序列P值均小于0.05,拒绝H0,接受H1,差异有统计学意义,认为该数据不是随机的。同理,认为X2是随机的。