1. 时间序列基础
1.随机时序分析的基本概念
1)随机变量:简单的随机现象,如某班一天学生出勤人数,是静态的。
2)随机过程:随机现象的动态变化过程。动态的。如某一时期各个时刻的状态。
所谓随机过程,就是说现象的变化没有确定形式,没有必然的变化规律。用数学语言来说,就是事物变化的过程不能用一个(或几个)时间t的确定的函数来描述。
如果对于每一特定的t属于T(T是时间集合),X(t)是一个随机变量,则称这一族无穷多个随机变量{X(t),t属于T}是一个随机过程。
2.白噪声序列
1)纯随机过程:随机变量X(t)(t=1,2,3……),如果是由一个不相关的随机变量的序列构成的,即对于所有s不等于k,随机变量Xs和Xk的协方差为零,则称其为 纯随机过程 。
2)白噪声过程:如果一个纯随机过程的期望和方差均为常数,则称之为 白噪声过程 。白噪声过程的样本实称成为白噪声序列,简称白噪声。
3)高斯白噪声序列:如果白噪声具体是服从均值为0、方差为常数的正态分布,那就是 高斯白噪声序列 。
3.平稳性序列
1)平稳性可以说是时间序列分析的基础。平稳的通俗理解就是时间序列的一些行为不随时间改变, 所谓平稳过程就是其统计特性不随时间的平移而变化的过程。
2)即时间序列内含的规律和逻辑,要在被预测的未来时间段内能够延续下去。这样我们才能用历史信息去预测未来信息,类似机器学习中的训练集和测试集同分布。
3)如果时间序列的变化是没有规律的、完全随机的,那么预测模型也就没有用。
4)平稳性的数学表达:如果时间序列在某一常数附近波动且波动范围有限,即有常数均值和常数方差,并且延迟k期的序列变量的自协方差和自相关系数是相等的或者说延迟k期的序列变量之间的影响程度是一样的,则称该序列为平稳序列。简单说就是没有明显趋势且波动范围有限。
4.严平稳/强平稳
1)通俗来说,就是时间序列的联合分布随着时间变化严格保持不变。
2)数学表达:如果对所有的时刻 t, (yt1,yt2,…ytm)的联合分布与(y(t1+k),(yt2+k),…y(tm+k))的联合分布相同,我们称时间序列 {yt} 是严平稳的。也就是时间序列的联合分布在时间的平移变换下保持不变。
5.弱平稳
1)数学表达:均值不变,协方差Cov(yt,y(t-k))=γk,γk依赖于k。
2)即协方差也不随时间改变,而仅与时间差k相关。
3)可以根据根据时间序列的折线图等大致观察数据的(弱)平稳性:*所有数据点在一个常数水平上下以相同幅度波动。
4)弱平稳的线性时间序列具有短期相关性(证明见参考书),即通常只有近期的序列值对现时值得影响比较明显,间隔越远的过去值对现时值得影响越小。至于这个间隔,也就是下面要提到的模型的阶数。
6.严平稳和弱平稳的关系
1)严平稳是一个很强的条件,难以用经验的方法验证,所以一般将弱平稳性作为模型的假设条件。
2)两者并不是严格的包含与被包含关系,但当时间序列是正态分布时,二者等价。
7.单位根非平稳序列(可转换为平稳序列的非平稳序列)
在金融数据中,通常假定资产收益率序列是弱平稳的。但还有一些研究对象,比如利率、汇率、资产的价格序列,往往不是平稳的。对于资产的价格序列,其非平稳性往往由于价格没有固定的水平,这样的非平稳序列叫做单位根(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等模型。
①自回归模型(AR)
用变量自身的历史时间数据对变量进行回归,从而预测变量未来的时间数据。
p阶(滞后值,可暂理解为每个移动窗口有p期)自回归公式即AR(p):
②移动平均模型(MA)
移动平均模型关注的是误差项的累加,能够有效消除预测中的随机波动。
可以看作是白噪声序列的简单推广,是白噪声序列的有限线性组合。也可以看作是参数受到限制的无穷阶AR模型。
③自回归移动平均模型(ARMA)
有时候,要用很多阶数的AR和MA模型(见后面的定阶问题),为解决这个问题提出ARMA模型。
对于金融中的收益率序列,直接使用ARMA模型的时候较少,但其概念与波动率建模很相关,GARCH模型可以认为是对{εt}的ARMA模型。
④自回归差分移动平均模型(ARIMA)
ARIMA比ARMA仅多了个"I",代表的含义可理解为 差分。
一些非平稳序列经过d次差分后,可以转化为平稳时间序列。我们对差分1次后的序列进行平稳性检验,若果是非平稳的,则继续差分。直到d次后检验为平稳序列。
⑤一般分析过程
1、 平稳性检验
ADF检验(单位根检验):这是一种检查数据稳定性的统计测试。
原假设(无效假设):时间序列是不稳定的。
2、 平稳化处理
平稳化的基本思路是:通过建模并估计趋势和季节性这些因素,并从时间序列中移除,来获得一个稳定的时间序列,然后再使用统计预测技术来处理时间序列,最后将预测得到的数据,通过加入趋势和季节性等约束,来还原到原始时间序列数据。
2.0 对数变换
对某些时间序列需要取对数处理,一是可以将一些指数增长的时间序列变成线性增长,二是可以稳定序列的波动性。对数变换在经济金融类时间序列中常用。
2.1 差分法
如果是单位根非平稳的(比如随机游走模型),可以对其进行差分化。它能让数据呈现一种更加平稳的趋势。差分阶数的选择通常越小越好,只要能够使得序列稳定就行。
2.2 平滑法
移动平均、指数加权移动平均
注:经差分或平滑后的数据可能因包含缺失值而不能使用检验,需要将缺失值去除
2.3 分解法
建立有关趋势和季节性的模型,并从模型中删除它们。
3 、建立模型:模型选择和模型的定阶
模型的选择即在AR、MA、ARMA、ARIMA中间如何选择。
模型的定阶即指定上面过程中产生的超参数p、q和d(差分的阶数)。
(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 、预测
如果之前进行了标准化、差分化等,需要进行还原:
标准化的还原要注意是log(x+1)还是log(x)。
1 、基础概念
波动率
在期权交易中,波动率是标的资产的收益率的条件标准差。之前的平稳序列假设方差为常数,但当序列的方差不是常数时,我们需要用波动率对其变化进行描述。
对于金融时间序列,波动率往往具有以下特征:
存在波动率聚集(volatility cluster)现象。 即波动率在一些 时间段 上高,一些时间段上低。
波动率以连续时间变化,很少发生跳跃。
波动率不会发散到无穷,而是在固定的范围内变化(统计学角度上说,其是平稳的)
杠杆效应:波动率对价格大幅上升和大幅下降的反应是不同的。
波动率模型/条件异方差模型
给资产收益率的波动率进行建模的模型叫做条件异方差模型。这些波动率模型试图刻画的数据有这样的特性: 它们是序列不相关或低阶序列相关的(比如股票的日收益率可能相关,但月收益率则无关),但又不是独立的 。波动率模型就是试图刻画序列的这种非独立性。
定义信息集F(t-1)是包含过去收益率的一切线性函数,假定F(t-1)给定,那么在此条件下时间序列yt的条件均值和条件方差分别表示为:
2. 怎么用excel对股票收盘价进行时间序列分析
最好附上内容
3. 非平稳时间序列可以预测股票走势吗
一般把非平稳时间序列转化为平稳时间序列的方法是取n阶差分法。
比如举个例子,假设xt本身是不平稳的时间序列,如果xt~I(1) ,也就是说x的1阶差分是平稳序列。
那么 xt的1阶差分dxt=x(t)-x(t-1) 就是平稳的序列 这时dt=x(t-1)
如果xt~I(2),就是说xt的2阶差分是平稳序列的话
xt的1n阶差分dxt=x(t)-x(t-1) 这时xt的1阶差分依然不平稳,
那么 对xt的1阶差分再次差分后,
xt的2阶差分ddxt=dxt-dxt(t-1)便是平稳序列 这时dt=-x(t-1)-dxt(t-1)
n阶的话可以依次类推一下。
4. 时间序列(time series)系列1—简介
笔者在工作中,接触到了客流数据,网络质量数据等,零零散散的对时间序列分析方法进行了学习和实践。
在平时的工作中,大多数公司都会有很多时序数据,也都离不开时序数据的挖掘。
所以现在整理分享出来,忘大家批评指正。
时间序列数据(time series data)是在不同时间上收集到的数据,用于描述现象随时间变化的情况。
时间序列是一种典型的数据,具有随时间变化的特征。在大多数场景中,都能见到的一种数据类型。
如客流数据,股票数据,销售额数据,网络日志,某些KPI指标等等内容。
一般情况下,时间序列数据可以分解为3个部分,如下图所示:
首先我们要有个目标,想通过时间序列数据完成什么样的目标,短期、中期、长期预测。然后需要尽可能的收集时间序列数据,数据越多,能够发现更多数据特征,预测会更准确。时间序列需要对数据中的缺失、异常、范围等进行处理。
常见的时间序列数据预测方法,笔者主要总结一下几种:
5. 对股票收盘价进行时间序列分析,预测其下一个交易日的收盘价,并与实际收盘价格进行对比
股票投资的分析这么复杂啊,先问问老师有依据这个买股票没,再回答。
6. 时间序列分析方法
时间序列是指一组在连续时间上测得的数据,其在数学上的定义是一组向量x(t), t=0,1,2,3,...,其中t表示数据所在的时间点,x(t)是一组按时间顺序(测得)排列的随机变量。包含单个变量的时间序列称为单变量时间序列,而包含多个变量的时间序列则称为多变量。
时间序列在很多方面多有涉及到,如天气预报,每天每个小时的气温,股票走势等等,在商业方面有诸多应用,如:
下面我们将通过一个航班数据来说明如何使用已有的工具来进行时间序列数据预测。常用来处理时间序列的包有三个:
对于基于AR、MA的方法一般需要数据预处理,因此本文分为三部分:
通过简单的初步处理以及可视化可以帮助我们有效快速的了解数据的分布(以及时间序列的趋势)。
观察数据的频率直方图以及密度分布图以洞察数据结构,从下图可以看出:
使用 statsmodels 对该时间序列进行分解,以了解该时间序列数据的各个部分,每个部分都代表着一种模式类别。借用 statsmodels 序列分解我们可以看到数据的主要趋势成分、季节成分和残差成分,这与我们上面的推测相符合。
如果一个时间序列的均值和方差随着时间变化保持稳定,则可以说这个时间序列是稳定的。
大多数时间序列模型都是在平稳序列的前提下进行建模的。造成这种情况的主要原因是序列可以有许多种(复杂的)非平稳的方式,而平稳性只有一种,更加的易于分析,易于建模。
在直觉上,如果一段时间序列在某一段时间序列内具有特定的行为,那么将来很可能具有相同的行为。譬如已连续观察一个星期都是六点出太阳,那么可以推测明天也是六点出太阳,误差非常小。
而且,与非平稳序列相比,平稳序列相关的理论更加成熟且易于实现。
一般可以通过以下几种方式来检验序列的平稳性:
如果时间序列是平稳性的,那么在ACF/PACF中观测点数据与之前数据点的相关性会急剧下降。
下图中的圆锥形阴影是置信区间,区间外的数据点说明其与观测数据本身具有强烈的相关性,这种相关性并非来自于统计波动。
PACF在计算X(t)和X(t-h)的相关性的时候,挖空在(t-h,t)上所有数据点对X(t)的影响,反应的是X(t)和X(t-h)之间真实的相关性(直接相关性)。
从下图可以看出,数据点的相关性并没有急剧下降,因此该序列是非平稳的。
如果序列是平稳的,那么其滑动均值/方差会随着时间的变化保持稳定。
但是从下图我们可以看到,随着时间的推移,均值呈现明显的上升趋势,而方差也呈现出波动式上升的趋势,因此该序列是非平稳的。
一般来讲p值小于0.05我们便认为其是显着性的,可以拒绝零假设。但是这里的p值为0.99明显是非显着性的,因此接受零假设,该序列是非平稳的。
从上面的平稳性检验我们可以知道该时间序列为非平稳序列。此外,通过上面1.3部分的序列分解我们也可以看到,该序列可分解为3部分:
我们可以使用数据转换来对那些较大的数据施加更大的惩罚,如取对数、开平方根、立方根、差分等,以达到序列平稳的目的。
滑动平均后数据失去了其原来的特点(波动式上升),这样损失的信息过多,肯定是无法作为后续模型的输入的。
差分是常用的将非平稳序列转换平稳序列的方法。ARIMA中的 'I' 便是指的差分,因此ARIMA是可以对非平稳序列进行处理的,其相当于先将非平稳序列通过差分转换为平稳序列再来使用ARMA进行建模。
一般差分是用某时刻数值减去上一时刻数值来得到新序列。但这里有一点区别,我们是使用当前时刻数值来减去其对应时刻的滑动均值。
我们来看看刚刚差分的结果怎么样。
让我们稍微总结下我们刚刚的步骤:
通过上面的3步我们成功的将一个非平稳序列转换成了一个平稳序列。上面使用的是最简单的滑动均值,下面我们试试指数滑动平均怎么样。
上面是最常用的指数滑动平均的定义,但是pandas实现的指数滑动平均好像与这个有一点区别,详细区别还得去查pandas文档。
指数滑动均值的效果看起来也很差。我们使用差分+指数滑动平均再来试试吧。
在上面我们通过 取log+(指数)滑动平均+差分 已经成功将非平稳序列转换为了平稳序列。
下面我们看看,转换后的平稳序列的各个成分是什么样的。不过这里我们使用的是最简单的差分,当前时刻的值等于原始序列当前时刻的值减去原始序列中上一时刻的值,即: x'(t) = x(t) - x(t-1)。
看起来挺不错,是个平稳序列的样子。不过,还是检验一下吧。
可以看到,趋势(Trend)部分已基本被去除,但是季节性(seasonal)部分还是很明显,而ARIMA是无法对含有seasonal的序列进行建模分析的。
在一开始我们提到了3个包均可以对时间序列进行建模。
为了简便,这里 pmdarima 和 statsmodels.tsa 直接使用最好的建模方法即SARIMA,该方法在ARIMA的基础上添加了额外功能,可以拟合seasonal部分以及额外添加的数据。
在使用ARIMA(Autoregressive Integrated Moving Average)模型前,我们先简单了解下这个模型。这个模型其实可以包括三部分,分别对应着三个参数(p, d, q):
因此ARIMA模型就是将AR和MA模型结合起来然后加上差分,克服了不能处理非平稳序列的问题。但是,需要注意的是,其仍然无法对seasonal进行拟合。
下面开始使用ARIMA来拟合数据。
(1) 先分训练集和验证集。需要注意的是这里使用的原始数据来进行建模而非转换后的数据。
(2)ARIMA一阶差分建模并预测
(3)对差分结果进行还原
先手动选择几组参数,然后参数搜索找到最佳值。需要注意的是,为了避免过拟合,这里的阶数一般不太建议取太大。
可视化看看结果怎么样吧。
(6)最后,我们还能对拟合好的模型进行诊断看看结果怎么样。
我们主要关心的是确保模型的残差(resial)部分互不相关,并且呈零均值正态分布。若季节性ARIMA(SARIMA)不满足这些属性,则表明它可以进一步改善。模型诊断根据下面的几个方面来判断残差是否符合正态分布:
同样的,为了方便,我们这里使用 pmdarima 中一个可以自动搜索最佳参数的方法 auto_arima 来进行建模。
一般来说,在实际生活和生产环节中,除了季节项,趋势项,剩余项之外,通常还有节假日的效应。所以,在prophet算法里面,作者同时考虑了以上四项,即:
上式中,
更多详细Prophet算法内容可以参考 Facebook 时间序列预测算法 Prophet 的研究 。
Prophet算法就是通过拟合这几项,然后把它们累加起来得到时间序列的预测值。
Prophet提供了直观且易于调整的参数:
Prophet对输入数据有要求:
关于 Prophet 的使用例子可以参考 Prophet example notebooks
下面使用 Prophet 来进行处理数据。
参考:
Facebook 时间序列预测算法 Prophet 的研究
Prophet example notebooks
auto_arima documentation for selecting best model
数据分析技术:时间序列分析的AR/MA/ARMA/ARIMA模型体系
https://github.com/advaitsave/Introction-to-Time-Series-forecasting-Python
时间序列分析
My First Time Series Comp (Added Prophet)
Prophet官方文档: https://facebookincubator.github.io
7. 如何用R 语言 建立 股票价格的时间序列
在下想用R语言对股票价格进行时间序列分析。
问题出在第一步,如何将股票价格转换为时间序列。
我想用的语句是 pri <- ts (data, start=(), frequency= )
但是我不知道frequency 项该如何填?
因为股票的交易日是一周五天的。 那么这个frequency 该如何设置呢?
我知道通常frequency= 12 为月度数据,frequency= 4 为季度数据,frequency= 1 为年度数据 但日数据怎么写我就不知道了
初学R语言,还望各位大侠多多帮助。
8. 在用时间序列分析股票时,如果连续两天收盘价一样,为什么要剔除一天的数据
同一收盘价影响相同