业界常用的技术分析指标都与价格本身有关,而时间序列分析由于对数据平稳性的要求常常是基于收益率这样更加偏稳定的数据(收益率由于会涨停和跌停每天最多10%)
平稳性:
强平稳性:随时间变化,各个统计特征都保持不变,那么这个随机过程具有强平稳性——一般我们只要求金融序列是弱平稳性的也就是均值,方差,协方差随着时间的变化不会发生变化即可
注意‼️:对于不平稳的数据很有可能会产生伪回归
用ARIMA构建有关收益率的时间序列:
在时间序列当中,最简单的模型就是ARIMA模型,其中,AR的含义是自回归,I的含义是差分,MA的含义是移动平均
其中,自回归系数的计算方法:
在AR模型中要对AR模型进行平稳性检验:
又因为白噪声有如下特征:
对原AR求期望可以得到:
有平稳性特征:期待值是相同的
因此进一步化简:
我们称该方程的解的倒数为模型的特征根
当他的特征根的模都小于1,则可以认为序列是平稳的
如下是ARIMA模型简单的代码实例:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import acf, pacf
# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
# 数据准备
data = {
'年份': list(range(1997, 2024)),
'报考人数': [24.20, 27.40, 31.90, 39.20, 46.00, 62.40, 79.70, 94.50, 117.20, 127.12, 128.20, 120.00, 124.60, 140.00, 151.10, 165.60, 176.00, 172.00, 164.90, 177.00, 201.00, 238.00, 290.00, 341.00, 377.00, 457.00, 474.00],
'录取率': [21.08, 21.17, 20.38, 21.69, 24.02, 31.25, 33.88, 34.92, 27.72, 31.69, 28.40, 32.50, 33.31, 33.71, 32.76, 31.48, 30.73, 31.90, 34.58, 33.32, 35.82, 32.02, 27.93, 29.05, 27.87, 24.15, 24.23]
}
df = pd.DataFrame(data)
df.set_index('年份', inplace=True)
# 选择一个时间序列列,例如 '报考人数'
ts = df['报考人数']
# 计算ACF和PACF值
acf_values = acf(ts, nlags=9)
pacf_values = pacf(ts, nlags=13)
# 计算置信区间
conf_int = 1.96 / np.sqrt(len(ts))
# 绘制ACF柱状图
plt.figure(figsize=(12, 6))
plt.bar(range(len(acf_values)), acf_values, color='blue', alpha=0.7)
plt.axhline(y=0, color='black', linestyle='--')
plt.axhline(y=-conf_int, color='red', linestyle='--', label='95% 置信区间')
plt.axhline(y=conf_int, color='red', linestyle='--')
plt.title('ACF图')
plt.xlabel('滞后期')
plt.ylabel('自相关系数')
plt.xticks(range(len(acf_values)), labels=range(len(acf_values)))
plt.legend()
plt.show()
# 绘制PACF柱状图
plt.figure(figsize=(12, 6))
plt.bar(range(len(pacf_values)), pacf_values, color='blue', alpha=0.7)
plt.axhline(y=0, color='black', linestyle='--')
plt.axhline(y=-conf_int, color='red', linestyle='--', label='95% 置信区间')
plt.axhline(y=conf_int, color='red', linestyle='--')
plt.title('PACF图')
plt.xlabel('滞后期')
plt.ylabel('偏自相关系数')
plt.xticks(range(len(pacf_values)), labels=range(len(pacf_values)))
plt.legend()
plt.show()
常用定阶方法:
求解AR(p)的p的过程叫做定阶,定阶一般有两种方法,一种是偏自相关系数,另一种是利用信息准则函数:
利用偏自相关系数:构建一连串的AR(p)模型,绘制pacf图,其中纵坐标表示的是偏自相关系数,横坐标表示的是相差的序列数,从哪一个数字开始,稳定在范围以内,就从哪一个数字以前的数作为最终的时间序列
利用信息准则:最常见的有AIC(赤池信息准则):
其中,k为包括结局项在内,自由参数的数量;L为似然函数的最大值
最大似然估计(MLE)的核心思想确实是通过不断调整模型参数 ,来寻找使得观察到的数据出现概率(即似然函数)最大的参数值。
在ARIMA(p,q)当中p和q分别代表自回归和滑动平均部分的阶数,可以通过绘制热力图来找到最小的AIC(BIC准则同理)
具体可以参考这篇arima模型预测考研难度(基于考研难度系数评价模型)-CSDN博客
用ARCH和GARCH来预测金融时间序列的波动率:
在金融时间序列里,还有一种处理方法是对波动率进行处理,这种方法相比收益率相对来说没有那么直观但是更加常用,在金融时间序列当中往往存在波动率聚集现象(volatility cluster),也就是说,波动率在一段时间内都比较高,在另一段时间内都比较低,且波动率会随着时间相对平稳的变化。
ARCH:
波动率模型(ARCH)采用自回归来体现波动聚集性,其假设资产收益率的扰动序列虽然不相关,但也并非完全独立(可以用延迟值的简单二次函数来表示)
(用方差预测条件方差)
同样的,我们会对其进行相关性检验
GARCH:
更常用的干扰率预测模型其实是GARCH(在ARCH的基础上进一步改进)
其中残差平方反应的是以往实际观测值与模型预测值之间差异的影响,捕捉了波动性的长期记忆效应;而条件方差反应了过去信息对当前信息的预测,是一种波动性的长期记忆效应。
GARCH的阶数在实际应用当中不太容易确定,因此往往直接采用低阶的
(在arch模块当中,可以用res.summary来查看拟合结果)