Day56打卡 @浙大疏锦行
知识点回顾:
- 假设检验基础知识
- 原假设与备择假设
- P值、统计量、显著水平、置信区间
- 白噪声
- 白噪声的定义
- 自相关性检验:ACF检验和Ljung-Box 检验
from statsmodels.graphics.tsaplots import plot_acf
print("--- 开始检验白噪声属性 ---")# 检验 1: 均值是否接近 0
mean = np.mean(random_sequence)
print(f"1. 序列的均值: {mean:.4f}")
if -0.1 < mean < 0.1:print(" (结论: 均值非常接近0,满足条件。)\n")
else:print(" (结论: 均值偏离0较远。)\n")# 检验 2: 方差是否恒定(且接近理论值1)
# 对于我们生成的数据,方差恒定是与生俱来的。我们主要检查其值。
variance = np.var(random_sequence)
print(f"2. 序列的方差: {variance:.4f}")
if 0.8 < variance < 1.2:print(" (结论: 方差接近于1,满足条件。np.random.randn理论方差为1)\n")
else:print(" (结论: 方差偏离1较远。)\n")# 检验 3: 自相关性是否为 0
# 这是最核心的检验。我们通过绘制ACF图来完成。
print("3. 检验自相关性 (使用ACF图):")
print(" - ACF图展示了序列与它过去值之间的相关性。")
print(" - 对于白噪声,只有lag=0时相关性为1,其他所有lag的相关性都应在蓝色置信区间内(统计上不显著)。")# 创建一个新的图形来绘制ACF图
fig, ax = plt.subplots(figsize=(12, 5))
plot_acf(random_sequence, lags=30, ax=ax) # 我们查看前30个滞后的相关性
ax.set_title('序列的自相关函数图 (ACF Plot)')
ax.set_xlabel('Lag (滞后阶数)')
ax.set_ylabel('Autocorrelation (自相关系数)')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
# 引入Ljung-Box检验的函数
from statsmodels.stats.diagnostic import acorr_ljungbox # --- 您的原始代码部分 ---
np.random.seed(42)
num_points = 200
random_sequence = np.random.randn(num_points)# --- 白噪声属性检验---
mean = np.mean(random_sequence)
variance = np.var(random_sequence)
print(f"1. 序列的均值: {mean:.4f}")
print(f"2. 序列的方差: {variance:.4f}\n")
print("3. 检验自相关性 (使用ACF图)...")
fig, ax = plt.subplots(figsize=(12, 5))
plot_acf(random_sequence, lags=30, ax=ax)
ax.set_title('序列的自相关函数图 (ACF Plot)')
plt.show()# --- 新增:使用 Ljung-Box 检验进行严格的白噪声检验 ---
print("\n" + "="*50)
print("4. 进行严格的白噪声检验 (Ljung-Box Test)")
print("="*50)
print(" - 原假设(H₀): 序列是白噪声。")
print(" - 判断标准: 如果 p-value > 0.05,则接受原假设,认为序列是白噪声。")# 执行Ljung-Box检验
# 我们通常会检查一系列的滞后项,比如前10、20、30个
# 函数返回一个包含统计量和p值的DataFrame
ljung_box_result = acorr_ljungbox(random_sequence, lags=[10, 20, 30], return_df=True)print("\nLjung-Box检验结果:")
print(ljung_box_result)# --- 结论解释 ---
print("\n--- 检验结论 ---")
# 我们可以检查最后一个(最严格的)p值
# .iloc[-1] 获取最后一行, .loc['lb_pvalue'] 获取p值
last_p_value = ljung_box_result.iloc[-1]['lb_pvalue']if last_p_value < 0.05:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 小于 0.05。")print("结论:我们拒绝原假设,该序列不是白噪声。")
else:print(f"在滞后30阶时,p-value ({last_p_value:.4f}) 大于 0.05。")print("结论:我们无法拒绝原假设,该序列是白噪声。")
-
- 偏自相关性检验:PACF检验
- 平稳性
- 平稳性的定义
- 单位根检验
- 季节性检验
- ACF检验
- 序列分解:趋势+季节性+残差
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.graphics.tsaplots import plot_acf
# 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False# --- 1. 创建一个带季节性的序列 ---
# 我们模拟一个为期5年的月度数据(60个点)
num_points = 60
time = np.arange(num_points)# a. 创建一个线性趋势
trend = 0.5 * time# b. 创建一个季节性成分(周期为12个月)
# 使用sin函数来模拟年度周期性波动
seasonal_component = 15 * np.sin(2 * np.pi * time / 12)# c. 创建一些随机噪声
np.random.seed(10)
noise = np.random.randn(num_points) * 2# d. 合成最终序列
seasonal_data = trend + seasonal_component + noise# --- 2. 开始检验季节性 ---# 方法一:肉眼观察
print("--- 方法一:肉眼观察 ---")
plt.figure(figsize=(14, 6))
plt.plot(seasonal_data)
plt.title('带趋势和季节性的时间序列图', fontsize=16)
plt.xlabel('时间步 (月)')
plt.ylabel('值')
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()
# 观察:我们可以清晰地看到一个整体上升的趋势,以及每年重复的波峰和波谷。
@浙大疏锦行