搞金融数据分析的同学都知道, 时间序列分析 是块难啃的骨头。尤其是那些波动率模型、GARCH族模型啥的,光看公式就够头大了。要是用上 Arch 这个 Python 库,马上就能事半功倍,轻松搞定这些复杂模型。
Arch 库可不是盖的,它集成了一大堆金融时间序列分析的工具,像 ARCH、GARCH 这些模型都能轻松跑起来。最爽的是,它跟 pandas、numpy 这些库完美配合,上手贼快。
import arch
import pandas as pd
import numpy as np
# 读取股票数据
data = pd.read_csv('stock_returns.csv')
returns = data['returns']
# 创建 GARCH(1,1) 模型
model = arch.arch_model(returns, vol='Garch', p=1, q=1)
results = model.fit()
print(results.summary())
金融市场天天都在变,波动率模型就是帮咱们抓住这种变化的好帮手。
# 设置 GARCH 模型参数
garch = arch.arch_model(returns,
mean='Zero',
vol='GARCH',
p=1,
q=1)
# 模型训练
res = garch.fit(disp='off')
# 预测未来波动率
forecasts = res.forecast(horizon=5)
⚠️ 小贴士:
- 建模前记得检查数据是否存在缺失值
- 波动率预测要用对数收益率,不是原始价格
- p和q参数不要设太大,容易过拟合
做分析不能光靠感觉,得用数据说话。Arch 库自带了好多统计检验的工具。
from arch.unitroot import ADF
# ADF单位根检验
adf = ADF(returns)
print(adf.summary())
# 异方差检验
from arch.unitroot import VarianceRatio
vr = VarianceRatio(returns)
print(vr.summary())
光看数字没意思,画个图直观多了。Arch 库的可视化功能也挺强。
import matplotlib.pyplot as plt
# 画出条件波动率
fig = res.plot(annualize='D')
plt.show()
# 预测结果可视化
forecasts.plot()
plt.title('波动率预测')
plt.show()
⚠️ 小贴士:
- 记得设置中文字体,不然图表中文会乱码
- 给图表加标题和轴标签,让图更专业
- 保存图表时用高分辨率,避免模糊
干金融分析的都知道,数据预处理特别重要。处理不好,再高级的模型也白搭。
# 处理异常值
def clean_outliers(series, n_sigmas=3):
mean = series.mean()
std = series.std()
return series[abs(series - mean) <= n_sigmas * std]
# 计算对数收益率
clean_returns = np.log(data['close']).diff().dropna()
clean_returns = clean_outliers(clean_returns)
⚠️ 小贴士:
- 数据质量决定分析质量,垃圾进垃圾出
- 记得处理缺失值和异常值
- 模型诊断很重要,不能光看结果
有了 Arch 这个神器,金融时间序列分析真不是什么难事。代码写得好,股票涨得早,赶紧学起来!
代码地址:## 滚动窗口分析:>
金融数据不可能一成不变,得用滚动窗口看趋势变化。Arch 库对这块支持特别好。
# 设置滚动窗口大小
window = 252 # 一年交易日
# 滚动窗口GARCH分析
rolling_params = []
for i in range(window, len(returns)):
sample = returns[i-window:i]
model = arch.arch_model(sample, vol='Garch', p=1, q=1)
result = model.fit(disp='off')
rolling_params.append([result.params['omega'],
result.params['alpha[1]'],
result.params['beta[1]']])
rolling_params = pd.DataFrame(rolling_params,
columns=['omega', 'alpha', 'beta'],
index=returns.index[window:])
⚠️ 小贴士:
- 窗口大小要根据数据特点来定,太大太小都不好
- 计算量比较大,可以用并行计算提速
- 记得保存中间结果,避免重复计算
单个变量分析太单调,咱们来点高级的,整个多变量模型。
from arch.univariate import ConstantMean
from arch.univariate import GARCH
# 准备多个资产的收益率数据
assets = ['stock', 'bond', 'gold']
returns_dict = {}
for asset in assets:
returns_dict[asset] = pd.read_csv(f'{asset}_returns.csv')['returns']
# 多资产建模
models = {}
for asset in assets:
mean_model = ConstantMean(returns_dict[asset])
vol_model = GARCH(1, 0, 1)
model = mean_model/vol_model
models[asset] = model.fit(disp='off')
风险管理才是重中之重,VaR 和 ES 这些指标必须得会算。
# 计算VaR
def calculate_var(returns, level=0.05):
model = arch.arch_model(returns)
res = model.fit(disp='off')
forecast = res.forecast(horizon=1)
cond_mean = forecast.mean.values[-1]
cond_var = forecast.variance.values[-1]
var = norm.ppf(level, cond_mean, np.sqrt(cond_var))
return var
# 计算ES
def calculate_es(returns, level=0.05):
var = calculate_var(returns, level)
return returns[returns <= var].mean()
⚠️ 小贴士:
- 风险指标要配合置信区间来看
- 不同市场状态下要用不同的分布假设
- 历史模拟法和参数法要结合使用
模型跑完了可不能就完事了,得好好验证一下。
# 残差检验
residuals = results.resid
standardized = results.resid/results.conditional_volatility
# Q-Q图
import statsmodels.api as sm
fig = sm.qqplot(standardized)
plt.title('标准化残差Q-Q图')
# 自相关检验
from statsmodels.stats.diagnostic import acorr_ljungbox
lb_test = acorr_ljungbox(standardized**2, lags=10)
print(“Ljung-Box检验结果:”, lb_test)
⚠️ 小贴士:
- 模型诊断是个系统工程,得多个角度验证
- 别忘了检查模型的预测能力
- 参数的统计显著性很重要
搞金融分析的都知道,好的工具能让分析事半功倍。Arch 库绝对是个不可多得的好帮手,掌握了这些技巧,分析工作真就是轻轻松松。
文档::>