# 平稳性检验函数
from statsmodels.tsa.stattools import adfuller
def check_stationarity(X, cutoff=0.01):
pvalue = adfuller(X)[1]
if pvalue < cutoff:
print(f'p值 = {pvalue} 序列可能平稳')
return True
else:
print(f'p值 = {pvalue} 序列可能非平稳')
return False
# 数据生成函数
import numpy as np
def generate_datapoint(params):
mu, sigma = params
return np.random.normal(mu, sigma)
# 依赖库
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.stats.stattools import jarque_bera
import statsmodels.api as sm
使用ADF检验判断以下序列是否平稳:
# 获取QQQ价格数据(替代get_pricing)
qqq = yf.download('QQQ', start='2014-01-01', end='2015-01-01')['Close']
qqq.name = 'QQQ'
# 在此调用平稳性检验函数
check_stationarity(qqq)
使用Jarque-Bera检验判断上述序列是否符合正态分布:
# 在此调用Jarque-Bera检验
jb_value, pvalue, skewness, kurtosis = jarque_bera(qqq)
print(f'JB统计量: {jb_value}, p值: {pvalue}')
生成一个与课堂不同的平稳序列并验证:
# 生成平稳序列代码(示例)
stationary_series = np.random.normal(0, 1, 100)
check_stationarity(stationary_series)
生成一个与课堂不同的非平稳序列并验证:
# 生成非平稳序列代码(示例)
T = 100
non_stationary = pd.Series([generate_datapoint((t**2, 1)) for t in range(T)])
check_stationarity(non_stationary)
估计以下时间序列的整合阶数:
# 获取QQQ价格数据
qqq = yf.download('QQQ', start='2014-01-01', end='2015-01-01')['Close']
# 在此编写阶数估计代码(提示:使用差分法)
diff_series = qqq.diff().dropna()
check_stationarity(diff_series)
在以下四个时间序列中寻找协整的平稳线性组合:
# 生成四个关联序列
T = 500
X1 = pd.Series([generate_datapoint((t*0.1, 1)) for t in range(T)])
X2 = X1**2 + X1
X3 = X1**3 + X1
X4 = np.sin(X1) + X1
# 在此编写协整检验代码(提示:使用OLS找线性组合)
X1_const = sm.add_constant(X1)
model = sm.OLS(X4, X1_const)
results = model.fit()
linear_comb = X4 - results.params['X1'] * X1
check_stationarity(linear_comb)
注意事项:
yfinance
,示例:yf.download('AAPL', start='2010-01-01')['Close']
check_stationarity
函数,内置ADF检验