中美汇率的时间序列之旅

中美汇率的时间序列之旅

“夫天地者万物之逆旅也,光阴者百代之过客也”
1.时间序列发展史

| 序号 | 时间 | 主要贡献者 | 主要贡献 | 特点 |
| ---- | ------------- | --------------------------------- | ------------------------------ | -------------------------------------- |
| 1 | 7000 年前 | 古埃及人 | 尼罗河涨落记录 | 描述性分析方法的起源 |
| 2 | 1927 年 | G.U. Yule | 提出 AR 模型 | 现代时间序列分析的起点 |
| 3 | 1931 年 | G.T. Walker | 提出 MA 和 ARMA 模型 | 构成时间序列分析的基础 |
| 4 | 1953 年 | Moran | 对加拿大山猫数据建模 | 发现数据中的异方差特征 |
| 5 | 1960 年代 | R.E. Kalman | 卡尔曼滤波 | 状态空间模型的先驱 |
| 6 | 1967 年 | Burg | 提出最大熵谱估计 | 现代谱分析的开端 |
| 7 | 1969 年 | Capon | 提出最小方差谱估计 | 奠定现代谱估计基础 |
| 8 | 1970 年 | Box 和 Jenkins | 推广 ARIMA 模型 | 将 ARMA 模型扩展到包括差分的过程 |
| 9 | 1974 年 | Granger 和 Newbold | 提出虚假回归问题 | 提醒研究者注意非平稳时间序列的潜在问题 |
| 10 | 1979 年 | Dickey 和 Fuller | 提出 Dickey-Fuller 检验 | 提高了对非平稳性的检测能力 |
| 11 | 1980 年代 | 多位研究者 | 状态空间模型和卡尔曼滤波的应用 | 广泛应用于经济和金融时间序列分析 |
| 12 | 1980 年 | Tong 和 Lim | 提出 TAR 模型 | 引入非线性分析 |
| 13 | 1980 年 | Shore 和 Johnson | 提出最小交叉熵法 | 提高分辨率,适用于有先验信息的情况 |
| 14 | 1982 年 | Engle | 提出 ARCH 模型 | 处理条件异方差问题 |
| 15 | 1986 年 | Bollerslev | 提出 GARCH 模型 | 反映数据的长期记忆性质 |
| 16 | 1987 年 | Engle 和 Granger | 提出协整理论 | 解释多变量非平稳序列间的均衡关系 |
| 17 | 1992 年 | Kwiatkowski-Phillips-Schmidt-Shin | KPSS 检验 | 增强对非平稳序列稳定性的检验 |
| 18 | 1989 年 | Hamilton | 提出马尔可夫转换模型 | 允许时间序列在不同状态之间转换 |
| 19 | 1990 年代末 | Hochreiter 和 Schmidhuber | 提出 LSTM 网络 | 深度学习在时间序列分析中的早期应用 |
| 20 | 2008 年 | Varian | 提出“大数据”概念 | 推动了时间序列分析在大数据领域的应用 |
| 21 | 2010 年代 | 深度学习研究者 | 深度学习在时间序列分析中的应用 | 提高了对复杂时间序列的建模能力 |

2. 中美汇率时间序列之旅——基于ARIMA模型的中美汇率时间序列分析

美元兑人民币汇率

痛点:建立SARIMA模型和乘积季节模型都存在残差自相关和不符合正态分布的问题

可能解决办法:
1.增加模型的阶数
2.考虑趋势项或季节性调整
3.考虑其他模型

import pandas as pd
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.statespace.sarimax import SARIMAX
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.stats.stattools import jarque_bera
# 设置matplotlib的字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

# 加载数据
file_path = '美元兑人民币汇率.xlsx'
df = pd.read_excel(file_path)
# 设置日期索引
df['日期'] = pd.to_datetime(df['日期'])
df.set_index('日期', inplace=True)
# 重采样为日频率并填充缺失值
df = df.resample('D').mean().ffill()
# 进行ADF检验判断平稳性
result = adfuller(df['美元'])
print("ADF统计量:", result[0])
print("p值:", result[1])
if result[1] < 0.05:
    print("数据是平稳的")
else:
    print("数据不是平稳的")
# 绘制原始时间序列图
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['美元'], color='#1f77b4', linewidth=1)
plt.title('美元兑人民币汇率')
plt.xlabel('日期')
plt.ylabel('汇率')
plt.grid(axis='y', alpha=0.75)
plt.tight_layout()
plt.show()

# 对时间序列进行季节性分解
res = seasonal_decompose(df['美元'], model='additive')
# 绘制季节性分解的各个分量
fig, axes = plt.subplots(4, 1, figsize=(10, 12))
res.observed.plot(ax=axes[0])
axes[0].set_title('原始时间序列')
res.trend.plot(ax=axes[1], color='red')
axes[1].set_title('趋势成分')
res.seasonal.plot(ax=axes[2], color='green')
axes[2].set_title('季节性成分')
res.resid.plot(ax=axes[3], color='blue')
axes[3].set_title('残差成分')
plt.subplots_adjust(hspace=0.7)
plt.tight_layout()
plt.show()
# 一阶差分
df_diff = df['美元'].diff().dropna()
# 对差分后的时间序列进行ADF检验
result_diff = adfuller(df_diff)
print("差分后的ADF统计量:", result_diff[0])
print("差分后的p值:", result_diff[1])
if result_diff[1] < 0.05:
    print("差分后的数据是平稳的")
else:
    print("差分后的数据不是平稳的")

# 可视化差分后的时间序列
plt.figure(figsize=(10, 6))
plt.plot(df_diff.index, df_diff, color='#1f77b4', linewidth=1)
plt.title('一阶差分后的人民币汇率中间价')
plt.xlabel('日期')
plt.ylabel('美元')
plt.grid(axis='y', alpha=0.75)
plt.show()

# 创建一个图形窗口
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# 在第一个子图上绘制ACF图
plot_acf(df_diff, lags=40, ax=ax1)
ax1.set_title('差分后序列的自相关图', fontsize=12)  # 设置中文标题
ax1.set_xlabel('滞后数', fontsize=10)  # 设置中文x轴标签
ax1.set_ylabel('自相关系数', fontsize=10)  # 设置中文y轴标签

# 在第二个子图上绘制PACF图
plot_pacf(df_diff, lags=40, ax=ax2)
ax2.set_title('差分后序列的偏自相关图', fontsize=12)  # 设置中文标题
ax2.set_xlabel('滞后数', fontsize=10)  # 设置中文x轴标签
ax2.set_ylabel('偏自相关系数', fontsize=10)  # 设置中文y轴标签

# 调整子图间距
plt.tight_layout()

# 显示图形
plt.show()

# 根据ACF和PACF图确定的阶数,这里以(0, 1, 1)x(0, 1, 1, 12)为例
# 建立SARIMA模型
model1 = SARIMAX(df['美元'], order=(1, 4, 4), seasonal_order=(0, 1, 1, 12))
model1_fit = model1.fit()

# 建立乘积季节模型
model2 = SARIMAX(df['美元'], order=(0, 1, 1), seasonal_order=(0, 1, 1, 4))
model2_fit = model2.fit()

# 打印模型摘要
print(model1_fit.summary())
print(model2_fit.summary())

# 模型诊断
model1_fit.plot_diagnostics(figsize=(15, 12))
plt.show()

model2_fit.plot_diagnostics(figsize=(15, 12))
plt.show()

 

 

 

版权声明:
作者:夜阑
链接:http://yelan.xyz/index.php/2024/04/22/%e4%b8%ad%e7%be%8e%e6%b1%87%e7%8e%87%e7%9a%84%e6%97%b6%e9%97%b4%e5%ba%8f%e5%88%97%e4%b9%8b%e6%97%85/
来源:夜阑的小站
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>