Arch,一个金融时间序列分析超强的 Python 库!

文摘   2024-11-06 12:23   广东  

▼点击下方卡片关注我


▲点击上方卡片关注我

搞金融数据分析的同学都知道, 时间序列分析 是块难啃的骨头。尤其是那些波动率模型、GARCH族模型啥的,光看公式就够头大了。要是用上 Arch 这个 Python 库,马上就能事半功倍,轻松搞定这些复杂模型。


Arch 库简介

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 库绝对是个不可多得的好帮手,掌握了这些技巧,分析工作真就是轻轻松松。


文档::>


往期回顾

◆ Pandera:数据验证神器,这个Python库让数据更可靠!

◆ PyAutoGUI:自动化控制神器,这个Python库让你解放双手!

◆ Django,一个全栈开发者的 Python 终极武器!

点赞分享

流向你

第二世界的趣事
“在‘精神世界的趣事’中,我们一同探索心灵深处的奥秘。每一篇文章都是一次心灵的旅行,带你发现自我,理解他人,享受不一样的精神的盛宴。
 最新文章