参考链接: 一阶逻辑解析
时间序列的变动
一个时间序列往往是以下几类变化形式的叠加和耦合。
趋势变动:在长时期内按某种规则稳定地呈现出来的持续向上或向下或保持在某一水平。季节变动:在一个年度内重复出现的周期性波动。它是诸如气候条件、生产条件、节假日或人们的风俗习惯等各种因素影响的结果。循环波动:是时间序列呈现出得非固定长度的周期性变动。循环波动的周期可能会持续一段时间,但与趋势不同,它不是朝着单一方向的持续变动,而是涨落相同的交替波动。不规则波动(随机变动):是许多不可控的偶然因素共同作用的结果,致使时间序列产生一种波浪形或震荡式的变动。
随机时序分析的基本概念
随机过程
现象的变化没有确定的形式,没有必然的变化规律。随机过程是随机变量的集合。 若一随机系统的样本点是随机函数,则称此函数为样本函数,这一随机系统全部样本函数的集合是一个随机过程。
在研究随机过程时人们透过表面的偶然性描述出必然的内在规律并以概率的形式来描述这些规律,从偶然中悟出必然正是这一学科的魅力所在。
随机变量:简单的随机现象,如某班一天学生出勤人数,是静态的。
随机过程:随机现象的动态变化过程。动态的。如某一时期各个时刻的状态。
所谓过程就是事物的发展变化过程,尽管过程的形式各异,但归纳起来不外乎两种:一种是确定性的,一种是随机性的。
所谓确定性过程,就是指事物的发展有必然的变化规律,用数学语言来说,就是事物变化的过程可以用一个(或几个)时间t的确定的函数来描述。具有可重复性。
所谓随机过程,就是说现象的变化没有确定形式,没有必然的变化规律。用数学语言来说,就是事物变化的过程不能用一个(或几个)时间t的确定的函数来描述。不可重复性。也就是说,如果对事物变化的全过程进行一次观测得到一次观察结果是一个时间t的函数,但对同一事物的变化过程独立地重复进行多次观测所得的结果是不相同的。 如果对于每一特定的t属于T(T是时间集合),X(t)是一个随机变量,则称这一族无穷多个随机变量{X(t),t属于T}是一个随机过程。
白噪声序列
随机变量X(t)(t=1,2,3……),如果是由一个不相关的随机变量的序列构成的,即对于所有s≠k,随机变量Xs和Xk的协方差为零,则称其为纯随机过程。
如果一个纯随机过程的期望和方差均为常数,则称之为白噪声过程。白噪声过程的样本实称成为白噪声序列,简称白噪声。
——白噪声序列是一个有限均值、有限方差的独立同分布随机变量序列(随机过程)。之所以称为白噪声,是因为他和白光的特性类似,白光的光谱在各个频率上有相同的强度,白噪声的谱密度在各个频率上的值相同。
如果白噪声具体是服从均值为0、方差为常数的正态分布,那就是高斯白噪声序列。
平稳性序列
平稳性可以说是时间序列分析的基础。平稳的通俗理解就是时间序列的一些行为不随时间改变, 所谓平稳过程就是其统计特性不随时间的平移而变化的过程。
——即时间序列内含的规律和逻辑,要在被预测的未来时间段内能够延续下去。这样我们才能用历史信息去预测未来信息,类似机器学习中的训练集和测试集同分布。
——如果时间序列的变化是没有规律的、完全随机的,那么预测模型也就没有用。
——平稳性的数学表达:如果时间序列在某一常数附近波动且波动范围有限,即有常数均值和常数方差,并且延迟k期的序列变量的自协方差和自相关系数是相等的或者说延迟k期的序列变量之间的影响程度是一样的,则称该序列为平稳序列。简单说就是没有明显趋势且波动范围有限。
严平稳/强平稳
通俗来说,就是时间序列的联合分布随着时间变化严格保持不变。
数学表达:如果对所有的时刻 t, (yt1,yt2,…ytm)的联合分布与(y(t1 k),(yt2 k),…y(tm k))的联合分布相同,我们称时间序列 {yt} 是严平稳的。也就是时间序列的联合分布在时间的平移变换下保持不变。
弱平稳
数学表达:均值不变,协方差Cov(yt,y(t-k))=γk,γk依赖于k。
——即协方差也不随时间改变,而仅与时间差k相关。
可以根据根据时间序列的折线图等大致观察数据的(弱)平稳性:所有数据点在一个常数水平上下以相同幅度波动。
弱平稳的线性时间序列具有短期相关性(证明见参考书),即通常只有近期的序列值对现时值得影响比较明显,间隔越远的过去值对现时值得影响越小。至于这个间隔,也就是下面要提到的模型的阶数。
严平稳和弱平稳的关系
严平稳是一个很强的条件,难以用经验的方法验证,所以一般将弱平稳性作为模型的假设条件。
两者并不是严格的包含与被包含关系,但当时间序列是正态分布时,二者等价。
单位根非平稳序列(可转换为平稳序列的非平稳序列)
在金融数据中,通常假定资产收益率序列是弱平稳的。但还有一些研究对象,比如利率、汇率、资产的价格序列,往往不是平稳的。对于资产的价格序列,其非平稳性往往由于价格没有固定的水平,这样的非平稳序列叫做单位根(unit-root)非平稳序列。
(1)最著名的单位根非平稳序列的例子是随机游走(random walk)模型:
pt=μ p(t-1) εt
μ是常数项(漂移:drift)。εt是白噪声序列,则pt就是一个随机游走。它的形式和AR模型很像,但不同之处在于,AR模型中,系数的模需要小于1,这是AR的平稳性条件,而随机游走相当于系数为1的AR公式,不满足AR模型的平稳性条件。
随机游走模型可作为(对数)股价运动的统计模型,在这样的模型下,股价是不可预测的。因为εt关于常数对称,所以在已知p(t-1)的条件下,pt上升或下降的概率都是50%,无从预测。
(2)带趋势项的时间序列
pt=β0 β1*t yt
yt是一个平稳时间序列。
——带漂移的随机游走模型,其均值和方差都随时间变化;而带趋势项的时间序列,其均值随时间变化,但方差则是不变的常数。
单位根非平稳序列可以进行平稳化处理转换为平稳序列。比如用差分法处理随机游走序列,用用简单的回归分析移除时间趋势处理带趋势项的时间序列。
线性时间序列
——μ是yt的均值;ψ是系数,决定了时间序列的线性动态结构,也被称为权重,其中ψ0=1;{εt}为高斯白噪声序列,它表示时间序列{yt}在t时刻出现了新的信息,所以εt称为时刻t的innovation(新信息)或shock(扰动)。
线性时间序列模型,就是描述线性时间序列的权重ψ的计量经济模型或统计模型,比如ARIMA。因为并非所有金融数据都是线性的,所以不是所有金融数据都适合ARIMA等模型。
非线性时间序列
时间序列预测
一:ETS模型族(Error Trend Seasonality)
基于简单的指数平滑法(加权移动平均法)的一系列模型。
移动平均的逻辑见下一节中介绍。
二:ARIMA模型
(Auto Regressive Integrated Moving Average Model)
ARIMA模型家族:
自回归模型(AR)
用变量自身的历史时间数据对变量进行回归,从而预测变量未来的时间数据。
p阶(滞后值,可暂理解为每个移动窗口有p期)自回归公式即AR(p):
c是常数(与序列的均值有关),γ是自相关系数(大于0.5才有意义),ε是误差,{εt}是高斯白噪声序列。
如果p=1,那么有AR(1):yt=c γ1y(t-1) εt,因为εt是高斯白噪声,所以yt的期望E(yt)=c γ1y(t-1),即yt的值将以c γ1y(t-1)为中心取值,其扰动(方差)就是{εt}的方差。
并且结合前面提到弱平稳线性时间序列的短期相关性,这说明yt只与yt-1相关,而与yt-i(i>1)都无关,这是AR(1)的马尔可夫性质(类比一阶马尔可夫假设)。
扩展:与线性回归模型的比较:
类似AR这种也叫做动态模型,它与线性回归模型的形式很像,但其实有很多不同,比如这里的常数c是有含义的,与序列的均值相关,而且其系数γi的模必须小于1,而线性回归中的参数没有限制。
移动平均模型(MA)
移动平均模型关注的是误差项的累加,能够有效消除预测中的随机波动。
可以看作是白噪声序列的简单推广,是白噪声序列的有限线性组合。
也可以看作是参数受到限制的无穷阶AR模型。
c是常数(yt序列的均值),{εt}是高斯白噪声序列。
自回归移动平均模型(ARMA)
有时候,要用很多阶数的AR和MA模型(见后面的定阶问题),为解决这个问题提出ARMA模型。
对于金融中的收益率序列,直接使用ARMA模型的时候较少,但其概念与波动率建模很相关,GARCH模型可以认为是对{εt}的ARMA模型。
换一个形式辅助理解:
左边是AR,右边是MA,要使这个方程有意义,需要γ和θ不相等,否则这个方程所决定的过程就变成一个白噪声序列。
自回归差分移动平均模型(ARIMA)
ARIMA比ARMA仅多了个"I",代表的含义可理解为差分。
——一些非平稳序列经过d次差分后,可以转化为平稳时间序列。我们对差分1次后的序列进行平稳性检验,若果是非平稳的,则继续差分。直到d次后检验为平稳序列。
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(stock_train, order=(1, 1, 1))
model_results = model.fit()
# print result.summary():可以打印出更多的模型信息
order元组中传入的是三个超参数p/d/q。
模型的建立过程就是输入训练数据求解最佳参数γ和θ。
流程:
1、平稳性检验
绘制滚动统计:我们可以绘制移动平均数和移动方差,观察它是否随着时间变化。
# (1)绘制滑动均值和滑动方差曲线,看均值和方差是否随时间变化
tpa_rolmean = pd.rolling_mean(tpa_train, window=12)
tpa_rolstd = pd.rolling_std(tpa_train, window=12)
# 画图
fig = plt.figure(figsize=(15,8))
plt.plot(tpa_train, color='blue',label='Original')
plt.plot(tpa_rolmean, color='red', label='Rolling Mean')
plt.plot(tpa_rolstd, color='black', label = 'Rolling Std')
plt.legend()
ADF检验(单位根检验):这是一种检查数据稳定性的统计测试。原假设(无效假设):时间序列是不稳定的。测试结果由测试统计量和一些置信区间的临界值组成。如果“测试统计量”少于“临界值”,我们可以拒绝原假设,并认为序列是稳定的。或者根据p值检验,如果p值小于显著性水平,我们可以拒绝原假设,认为序列稳定。
# (2)ADF检验
from statsmodels.tsa.stattools import adfuller
tpa_adf = adfuller(tpa_train, autolag='AIC')
# 将输出放入一个序列中
tpa_output = pd.Series(tpa_adf[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
print (tpa_output)
print("--------------------------------")
print (tpa_adf[4])
2、平稳化处理
导致数据不平稳的原因有很多,如果是以下两种原因我们可以进行平稳化后仍然使用ARIMA模型。
趋势-随着时间产生不同的平均值。举例:在飞机乘客这个案例中,我们看到总体上,飞机乘客的数量是在不断增长的。季节性-特定时间框架内的变化。举例:在特定的月份购买汽车的人数会有增加的趋势,因为车价上涨或者节假日到来。
平稳化的基本思路是:通过建模并估计趋势和季节性这些因素,并从时间序列中移除,来获得一个稳定的时间序列,然后再使用统计预测技术来处理时间序列,最后将预测得到的数据,通过加入趋势和季节性等约束,来还原到原始时间序列数据。
2.0 对数变换
对某些时间序列需要取对数处理,一是可以将一些指数增长的时间序列变成线性增长,二是可以稳定序列的波动性。对数变换在经济金融类时间序列中常用。
tpa_train_st = tpa_train.apply(lambda x:np.log(x 1))
一般首先进行对数变换,然后根据实际情况和效果分别选择差分法、平滑法或分解法。
2.1 差分法
如果是单位根非平稳的(比如随机游走模型),可以对其进行差分化。它能让数据呈现一种更加平稳的趋势。
——ARIMA模型可以自带差分,不过好像只能处理三阶以内?注意之前手动差分和ARIMA模型指定差分很容易重复差分。
差分阶数的选择通常越小越好,只要能够使得序列稳定就行。我们可以通过选择不同的阶数,然后进行平稳性检测,选择平稳性表现良好的阶数就行,一般一阶和二阶用的比较多。
# 一阶差分
data['diff_1'] = data['column1'].diff(1)
# 二阶差分
data['diff_2'] = data['diff_1'].diff(1)
2.2 平滑法
移动平均
moving_avg = pd.rolling_mean(data,12)
# 做差
diff = data - moving_avg
指数加权移动平均
expwighted_avg=pd.ewma(data,halflife=12)
# 做差
diff = data - expwighted_avg
两种平滑法区别:移动平均数需要指定window,并且对所有的数一视同仁;而采用指数加权移动平均方法,会对当前的数据加大权重,对过去的数据减小权重。halflife半衰期,用来定义衰减量。其他参数,如跨度span和质心com也可以用来定义衰减。
这些平滑法也可以作为经验方法对时间序列进行预测,比如简单的指数平滑法非常类似于自回归阶数为0、差分阶数为1、移动平均值阶数为1 且没有常量的ARIMA 模型。但效果和应用范围都有限制。
——注:经差分或平滑后的数据可能因包含缺失值而不能使用检验,需要将缺失值去除:
tpa_1.dropna(inplace=True)
2.3 分解法
建立有关趋势和季节性的模型,并从模型中删除它们。
#时间序列分解
from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(ts_log)
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid
季节性调整
有些时间序列呈现出一定的循环或周期性,这样的时间序列叫季节性时间序列。例如月入境旅游人数,公司股票的每股的季度盈利,以及一些与天气相关的衍生产品、能源期货的价格等。
在有些应用中,需要将季节性波动这种特征消除(如GDP增长率和失业率),这种操作叫季节性调整,例如X12 季调方法、STL分解法等。
3、建立模型:模型选择和模型的定阶
模型的选择即在AR、MA、ARMA、ARIMA中间如何选择。
模型的定阶即指定上面过程中产生的超参数p、q和d(差分的阶数)。
相关系数
自相关系数/序列相关函数(Auto correlation Function,ACF)
——因为是弱平稳,所以yt和y(t-k)的方差一样,都是γk,而自协方差只与k有关,所以自相关函数是一个关于k的函数。
一个变量与其过去的值的相关性。两者之间有一个时间间隔k,叫做时间间隔为k的自相关系数。
——因为序列的短缺相关性,也就是说随着延迟期数的增加,平稳序列的自相关系数会比较快的衰减趋向于零,并在零附近随机波动。而非平稳序列的自相关系数衰减的速度比较慢。(魏鸿鑫)
如果对所有k>0,都有ACF(k)=0,我们说这个弱平稳序列是序列不相关的。前面说了白噪声序列是序列不相关的,也就是其自相关函数为0(现实中接近0即可)。资本资产定价模型(CAPM)理论的一种形式,就是假定资产收益率序列是不可预测的,且没有自相关性。零自相关系数的检验被用来作为有效市场假说是否成立的判定工具。然而,现实中,尤其是高频金融数据,收益率序列可能具有自相关性。
通常用ACF来刻画数据的线性动态关系,可以说一个线性时间序列,是由其ACF决定的。
偏自相关函数(Partial Autocorrelation Function,PACF)
ACF其实不能真正表现y(t)和y(t-k)之间的相关性,它还掺杂了两者之间的k-1个变量(比如y(t-1)、y(t-2)等)与其的相关性,PACF则能够剔除这些其他变量的影响,单纯的表现y(t)和y(t-k)之间的相关性。
# 需要安装statsmodels库
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
acf = plot_acf(stock_diff, lags=20)
plt.title("ACF")
acf.show()
pacf = plot_pacf(stock_diff, lags=20)
plt.title("PACF")
pacf.show()
可以观察ACF和PACF图,可以判断p和q的阶数。(系数越大,说明越序列相关,对应的阶数可选,系数趋于0,说明越序列无关,对应的阶数不可选)
(1)用ACF和PACF图判断使用哪种线性时间序列模型
AR模型:ACF拖尾,PACF截尾,看PACF定阶。
MA模型:ACF截尾,PACF拖尾,看ACF定阶。
ARMA模型:都拖尾。(EACF定阶)
——截尾:在某阶后迅速趋于0(后面大部分阶的对应值在二倍标准差以内);
——拖尾:按指数衰减或震荡,值到后面还有增大的情况。
ARIMA模型:适用于差分后平稳的序列。
(2)利用 信息准则 函数选择合适的阶
对于个数不多的时序数据,可以通过观察自相关图和偏相关图来进行模型识别,倘若要分析的时序数据量较多,例如要预测每只股票的走势,就不可能逐个去调参了。这时可以依据AIC或BIC准则识别模型的p, q值,通常认为AIC或BIC值越小的模型相对更优。
AIC或BIC准则综合考虑了残差大小和自变量的个数,残差越小AIC或BIC值越小,自变量个数越多AIC或BIC值越大。AIC或BIC准则可以说是对模型过拟合设定了一个标准。
AIC(Akaike information criterion,赤池信息度量准则)
AIC=2k-2ln(L)
BIC(Bayesian information criterion,贝叶斯信息度量准则)
BIC=kln(n)-2ln(L)
——k为模型的超参数个数,n为样本数量,L为似然函数。
——类比机器学习中的损失函数=经验损失函数 正则化项。
模型选择标准:AIC和BIC越小越好(在保证精度的情况下模型越简单越好)
4、模型检验和评估(之前应切分训练集和验证 集)
检验残差是否符合标准(QQ图):是否服从均值为0,方差是常数的正态分布(εt是否是高斯白噪声序列)。拟合优度检验(模型的评估):R^2和调整后的R^2(R^2只适用于平稳序列)。
5、预测
需要数据以时间列作为索引
# 以第0列即时间列作为索引并且将其解析为标准时间格式
stock = pd.read_csv('data/T10yr.csv', index_col=0, parse_dates=[0])
预测
pred = result.predict('20140609', '20160701',dynamic=True, typ='levels')
如果之前进行了标准化、差分化等,需要进行还原:
标准化的还原要注意是log(x 1)还是log(x)。
用ARIMA中自带的差分不需要还原差分,只需要预测时传入参数 dynamic=True 即可。但是ARIMA自带的差分似乎只支持3阶以下的差分。
预测值和真实值的比较
plt.figure(figsize=(6, 6))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(stock_train)
三:条件异方差模型
1、基础概念
波动率
在期权交易中,波动率是标的资产的收益率的条件标准差。之前的平稳序列假设方差为常数,但当序列的方差不是常数时,我们需要用波动率对其变化进行描述。
对于金融时间序列,波动率往往具有以下特征:
存在波动率聚集(volatility cluster)现象。 即波动率在一些时间段上高,一些时间段上低。波动率以连续时间变化,很少发生跳跃。波动率不会发散到无穷,而是在固定的范围内变化(统计学角度上说,其是平稳的)杠杆效应:波动率对价格大幅上升和大幅下降的反应是不同的。
波动率模型/条件异方差模型
给资产收益率的波动率进行建模的模型叫做条件异方差模型。这些波动率模型试图刻画的数据有这样的特性:它们是序列不相关或低阶序列相关的(比如股票的日收益率可能相关,但月收益率则无关),但又不是独立的。波动率模型就是试图刻画序列的这种非独立性。
定义信息集F(t-1)是包含过去收益率的一切线性函数,假定F(t-1)给定,那么在此条件下时间序列yt的条件均值和条件方差分别表示为:
均值方程:
波动率方程:
条件异方差模型就是描述σt^2的演变的,σt^2随时间变化的方式可以用不同的波动率模型来表示。其建模方式就是对时间序列增加一个动态方程,来刻画资产收益率的条件方差随时间演变的规律。
2、ARCH(AutoRegressive Conditional Heteroskedasticity,自回归条件异方差)
ARCH模型将当前一切可利用信息作为条件,并采用某种自回归形式来刻划方差的变异。对于一个时间序列而言,在不同时刻可利用的信息不同,而相应的条件方差也不同,利用ARCH 模型,可以刻划出随时间而变异的条件方差。
模型的基本假设
资产收益率序列的扰动 {εt} 序列不相关,但又不独立。
{εt}的不独立性可以用其延迟值的简单二次函数来描述。
数学形式:
——{ηt}是均值为0方差为1的独立同分布随机变量序列,通常假定其服从标准正态分布或标准化学生-t分布 ;α0>0、αi(i>0)≥0,且能够保证εt的无条件方差是有限的。
ARCH效应
从上面模型的结构看,大的过去的平方“扰动”会导致信息εt大的条件异方差。从而εt有取绝对值较大的值的倾向。这意味着:在ARCH的框架下,大的"扰动"会倾向于紧接着出现另一个大的"扰动"。这与波动率聚集的现象相似。
所谓ARCH模型效应,也就是条件异方差序列既是序列无关、但又不是独立的。
ARCH效应检验(结合ARIMA模型的第4步)
用混成检验(Ljung-Box)来对前面创建的均值模型(如ARMA或ARIMA)的残差进行检验,判断是否具有ARCH效应,如果具有ARCH效应,对残差建立条件异方差模型。
ARCH的缺点
无法表现金融资产的价格对正的扰动和负的扰动反应是不同的这一特性;
对参数的限制很强;
只是表现了条件方差的变化,但不能解释为何发生这种变化。
3、GARCH(Generalized AutoRegressive Conditional Heteroskedasticity,广义ARCH)
虽然ARCH模型简单,但为了充分刻画收益率的波动率过程,往往需要很多参数,有时会需要很高的ARCH(m)模型。因此,Bollerslev(1986)年提出了一个推广形式,称为广义的ARCH模型(GARCH)。
α0>0,∀i>0:αi⩾0,βi⩾0,(αi βi)<1。对αi βi的限定保证扰动序列的无条件方差是有限的。αi和βi分别叫做ARCH参数和GARCH参数。
与之前的ARCH模型建立过程类似,不过GARCH(m,s)的定阶较难,一般使用低阶模型如GARCH(1,1)、GARCH(2,1)、GARCH(1,2)等。
4、更多条件异方差模型
求和GARCH、GARCH-M模型、指数GARCH、EGARCH模型等。还有另外一类波动率模型,比如随机波动率模型。
时间序列回归
即研究两个时间序列之间的关系,比如个股收益率与市场指数收益率的研究、利率的期限结构的研究(不同期限的利率之间的关系)等。比如一个简单的形式:
如果εt是白噪声,那我们用OLS即可。但如果εt是序列相关的,那就不能用OLS去估计。
一个解决方法是为残差序列{εt}构建一个简单AR/MA/ARMA模型。比如观察ACF发现MA模型是适合的,那么建模:εt=ηt-θa(t-1)。其中{ηt}是白噪声序列。
也就是说,这里我们简单地用不带常数项的AR/MA/ARMA模型去刻画εt序列的这种相关性。
参考:
利用Python进行数据分析
优达学城时间序列预测分析
网易云课堂Python数据分析与机器学习实战
fyiqi金融时间序列分析入门
金融时间序列分析(中文第2版)
时间序列分析王振龙
伍德里奇计量经济学导论
Python实现时间序列分析