1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| import pandas as pd import numpy as np import matplotlib.pyplot as plt import statsmodels.api as sm from statsmodels.graphics.tsaplots import plot_acf
# 1. 准备示例数据(日期索引,收盘价和对数收益列) # np.random.seed(42) # date_rng = pd.date_range(start='2024-01-01', periods=250, freq='D') # prices = 100 + np.cumsum(np.random.normal(0.1, 0.5, 250)) # 模拟股价 # log_returns = np.log(prices[1:]/prices[:-1]) # 计算对数收益率
# df = pd.DataFrame({ # 'Close': prices[1:], # '对数收益': log_returns # }, index=date_rng[1:])
# 2. 创建2行1列的子图 fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10), dpi=100) fig.suptitle('对数收益波动性自相关分析', fontsize=16, fontweight='bold')
# 3. 第一子图:对数收益平方的自相关图 squared_returns = df['对数收益'] ** 2 # 计算对数收益的平方 plot_acf(squared_returns, lags=40, alpha=0.05, ax=axes[0], title='', color='darkred', zero=False) axes[0].set_title('对数收益平方的自相关性 (波动性聚集检验)', fontsize=14) axes[0].set_xlabel('滞后期数 (Lags)', fontsize=12) axes[0].set_ylabel('自相关系数', fontsize=12) axes[0].grid(alpha=0.3)
# 4. 第二子图:对数收益绝对值的自相关图 abs_returns = np.abs(df['对数收益']) # 计算对数收益的绝对值 plot_acf(abs_returns, lags=40, alpha=0.05, ax=axes[1], title='', color='darkblue', zero=False) axes[1].set_title('对数收益绝对值的自相关性 (波动性持续性检验)', fontsize=14) axes[1].set_xlabel('滞后期数 (Lags)', fontsize=12) axes[1].set_ylabel('自相关系数', fontsize=12) axes[1].grid(alpha=0.3)
# 5. 添加统计检验结果 lb_test_squared = sm.stats.acorr_ljungbox(squared_returns, lags=40, return_df=True) lb_test_abs = sm.stats.acorr_ljungbox(abs_returns, lags=40, return_df=True)
stats_text = ( f"平方收益Ljung-Box检验 (滞后40期): Q={lb_test_squared['lb_stat'].iloc[-1]:.2f}, p={lb_test_squared['lb_pvalue'].iloc[-1]:.4f}\n" f"绝对值收益Ljung-Box检验 (滞后40期): Q={lb_test_abs['lb_stat'].iloc[-1]:.2f}, p={lb_test_abs['lb_pvalue'].iloc[-1]:.4f}" )
fig.text(0.5, 0.01, stats_text, fontsize=12, ha='center', bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
# 6. 调整布局并保存 plt.tight_layout(rect=[0, 0.03, 1, 0.97]) # 为总标题和统计文本留空间 plt.savefig('volatility_autocorrelation_analysis.jpg', dpi=300, bbox_inches='tight') plt.show()
# 7. 输出关键统计指标 print("波动性聚集特征分析:") print(f"平方收益均值: {squared_returns.mean():.6f}") print(f"绝对值收益均值: {abs_returns.mean():.6f}") print(f"平方收益标准差: {squared_returns.std():.6f}") print(f"绝对值收益标准差: {abs_returns.std():.6f}") print("\nLjung-Box检验结果 (滞后40期):") print(f"平方收益: Q统计量={lb_test_squared['lb_stat'].iloc[-1]:.2f}, p值={lb_test_squared['lb_pvalue'].iloc[-1]:.4f}") print(f"绝对值收益: Q统计量={lb_test_abs['lb_stat'].iloc[-1]:.2f}, p值={lb_test_abs['lb_pvalue'].iloc[-1]:.4f}")
|