时间序列分析(一) 如何判断序列是否平稳
成都创新互联公司作为成都网站建设公司,专注网站建设、网站设计,有关企业网站设计方案、改版、费用等问题,行业涉及广告制作等多个领域,已为上千家企业服务,得到了客户的尊重与认可。
序列平稳不平稳,一般采用两种方法:
第一种:看图法
图是指时序图,例如(eviews画滴):
分析:什么样的图不平稳,先说下什么是平稳,平稳就是围绕着一个常数上下波动。
看看上面这个图,很明显的增长趋势,不平稳。
第二种:自相关系数和偏相关系数
还以上面的序列为例:用eviews得到自相关和偏相关图,Q统计量和伴随概率。
分析:判断平稳与否的话,用自相关图和偏相关图就可以了。
平稳的序列的自相关图和偏相关图不是拖尾就是截尾。截尾就是在某阶之后,系数都为 0 ,怎么理解呢,看上面偏相关的图,当阶数为 1 的时候,系数值还是很大, 0.914. 二阶长的时候突然就变成了 0.050. 后面的值都很小,认为是趋于 0 ,这种状况就是截尾。再就是拖尾,拖尾就是有一个衰减的趋势,但是不都为 0 。
自相关图既不是拖尾也不是截尾。以上的图的自相关是一个三角对称的形式,这种趋势是单调趋势的典型图形。
下面是通过自相关的其他功能
如果自相关是拖尾,偏相关截尾,则用 AR 算法
如果自相关截尾,偏相关拖尾,则用 MA 算法
如果自相关和偏相关都是拖尾,则用 ARMA 算法, ARIMA 是 ARMA 算法的扩展版,用法类似 。
不平稳,怎么办?
答案是差分
还是上面那个序列,两种方法都证明他是不靠谱的,不平稳的。确定不平稳后,依次进行1阶、2阶、3阶...差分,直到平稳位置。先来个一阶差分,上图。
从图上看,一阶差分的效果不错,看着是平稳的。
指数平滑(Exponential smoothing)是除了 ARIMA 之外的另一种被广泛使用的时间序列预测方法(关于 ARIMA,请参考 时间序列模型简介 )。 指数平滑即指数移动平均(exponential moving average),是以指数式递减加权的移动平均。各数值的权重随时间指数式递减,越近期的数据权重越高。常用的指数平滑方法有一次指数平滑、二次指数平滑和三次指数平滑。
一次指数平滑又叫简单指数平滑(simple exponential smoothing, SES),适合用来预测没有明显趋势和季节性的时间序列。其预测结果是一条水平的直线。模型形如:
其中 是真实值, 为预测值, 为平滑值, 。
定义残差 ,其中 ,则可以通过优化方法得到 和 。
使用 python 的 statsmodels 可以方便地应用该模型:
效果如图:
Holt 扩展了简单指数平滑,使其可以用来预测带有趋势的时间序列。直观地看,就是对平滑值的一阶差分(可以理解为斜率)也作一次平滑。模型的预测结果是一条斜率不为0的直线。模型形如:
其中 , 。
效果如图:
Holt's linear trend method 得到的预测结果是一条直线,即认为未来的趋势是固定的。对于短期有趋势、长期趋于稳定的序列,可以引入一个阻尼系数 ,将模型改写为
为了描述时间序列的季节性,Holt 和 Winters 进一步扩展了 Holt's linear trend method,得到了三次指数平滑模型,也就是通常说的 Holt-Winters’ 模型。我们用 表示“季节”的周期。根据季节部分和非季节部分的组合方式不同,Holt-Winters’ 又可以分为加法模型和乘法模型。
加法模型形如:
其中 , , 。 是 的整数部分。
效果如图:
乘法模型形如:
效果如图:
Holt-Winters’ 模型的趋势部分同样可以引入阻尼系数 ,这里不再赘述。
参数优化的方法是最小化误差平方和或最大化似然函数。模型选择可以根据信息量准则,常用的有 AIC 和 BIC等。
AIC 即 Akaike information criterion, 定义为
其中 是似然函数, 是参数数量。用 AIC 选择模型时要求似然函数大,同时对参数数量作了惩罚,在似然函数相近的情况下选择复杂度低的模型。
BIC 即 Bayesian information criterion,定义为
其中 是样本数量。当 时, ,因此当样本量较大时 BIC 对模型复杂度的惩罚比 AIC 更严厉。
线性的指数平滑方法可以看作是 ARIMA 的特例。例如简单指数平滑等价于 ARIMA(0, 1, 1),Holt's linear trend method 等价于 ARIMA(0, 2, 2),而 Damped trend methods 等价于 ARIMA(1, 1, 2) 等。
我们不妨来验证一下。
可以改写为
亦即
两边同时加上 ,得
而 ARIMA(p, d, q) 可以表示为
其中 是滞后算子(Lag operator), 。
考虑 ARIMA(0, 1, 1)
即
亦即
令 ,则两者等价。
非线性的指数平滑方法则没有对应的 ARIMA 表示。
[1] Hyndman, Rob J., and George Athanasopoulos. Forecasting: principles and practice. OTexts, 2014.
[2] Exponential smoothing - Wikipedia
[3] Introduction to ARIMA models - Duke
1、complex()
返回一个形如 a+bj 的复数,传入参数分为三种情况:
参数为空时,返回0j;参数为字符串时,将字符串表达式解释为复数形式并返回;参数为两个整数(a,b)时,返回 a+bj;参数只有一个整数 a 时,虚部 b 默认为0,函数返回 a+0j。
2、dir()
不提供参数时,返回当前本地范围内的名称列表;提供一个参数时,返回该对象包含的全部属性。
3、divmod(a,b)
a -- 代表被除数,整数或浮点数;b -- 代表除数,整数或浮点数;根据 除法运算 计算 a,b 之间的商和余数,函数返回一个元组(p,q) ,p 代表商 a//b ,q 代表余数 a%b。
4、enumerate(iterable,start=0)
iterable -- 一个可迭代对象,列表、元组序列等;start -- 计数索引值,默认初始为0‘该函数返回枚举对象是个迭代器,利用 next() 方法依次返回元素值,每个元素以元组形式存在,包含一个计数元素(起始为 start )和 iterable 中对应的元素值。
a = 2/13
Prices = [0.0] #prices of everyday
EMAs = [0.0] # ems of everyday
def ema ( N , Price) :
Prices.append(Price)
if N=1:
EMAs.append(Price)
else :
EMAs.append((1-a)*EMAs[N-1] + a*Price)
ema(1,1)
ema(2,3)
print (EMAs[1])
print (EMAs[2])
【常见的内置函数】
1、enumerate(iterable,start=0)
是python的内置函数,是枚举、列举的意思,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
2、zip(*iterables,strict=False)
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*号操作符,可以将元组解压为列表。
3、filter(function,iterable)
filter是将一个序列进行过滤,返回迭代器的对象,去除不满足条件的序列。
4、isinstance(object,classinfo)
是用来判断某一个变量或者是对象是不是属于某种类型的一个函数,如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例,
返回True。如果object不是一个给定类型的的对象, 则返回结果总是False
5、eval(expression[,globals[,locals]])
用来将字符串str当成有效的表达式来求值并返回计算结果,表达式解析参数expression并作为Python表达式进行求值(从技术上说是一个条件列表),采用globals和locals字典作为全局和局部命名空间。
【常用的句式】
1、format字符串格式化
format把字符串当成一个模板,通过传入的参数进行格式化,非常实用且强大。
2、连接字符串
常使用+连接两个字符串。
3、if...else条件语句
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。其中if...else语句用来执行需要判断的情形。
4、for...in、while循环语句
循环语句就是遍历一个序列,循环去执行某个操作,Python中的循环语句有for和while。
5、import导入其他脚本的功能
有时需要使用另一个python文件中的脚本,这其实很简单,就像使用import关键字导入任何模块一样。