🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

练习

辅助函数

# 平稳性检验函数
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

练习 1:平稳性检验

1.a 检查平稳性

使用ADF检验判断以下序列是否平稳:

# 获取QQQ价格数据(替代get_pricing)
qqq = yf.download('QQQ', start='2014-01-01', end='2015-01-01')['Close']
qqq.name = 'QQQ'

# 在此调用平稳性检验函数
check_stationarity(qqq)

1.b 正态性检验

使用Jarque-Bera检验判断上述序列是否符合正态分布:

# 在此调用Jarque-Bera检验
jb_value, pvalue, skewness, kurtosis = jarque_bera(qqq)
print(f'JB统计量: {jb_value}, p值: {pvalue}')

1.c 构建平稳序列示例

生成一个与课堂不同的平稳序列并验证:

# 生成平稳序列代码(示例)
stationary_series = np.random.normal(0, 1, 100)
check_stationarity(stationary_series)

1.d 构建非平稳序列示例

生成一个与课堂不同的非平稳序列并验证:

# 生成非平稳序列代码(示例)
T = 100
non_stationary = pd.Series([generate_datapoint((t**2, 1)) for t in range(T)])
check_stationarity(non_stationary)

练习 2:估计整合阶数

估计以下时间序列的整合阶数:

# 获取QQQ价格数据
qqq = yf.download('QQQ', start='2014-01-01', end='2015-01-01')['Close']

# 在此编写阶数估计代码(提示:使用差分法)
diff_series = qqq.diff().dropna()
check_stationarity(diff_series)

练习 3:寻找平稳线性组合

在以下四个时间序列中寻找协整的平稳线性组合:

# 生成四个关联序列
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)

注意事项:

  1. 所有数据获取均使用yfinance,示例:yf.download('AAPL', start='2010-01-01')['Close']
  1. 平稳性检验使用check_stationarity函数,内置ADF检验
  1. 生成非平稳序列时需构造趋势/单位根过程