时间序列模型
时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.处理与时间相关数据的方法叫做时间序列模型.
当一个平稳序列
X(t)
X
(
t
)
中混入噪声
Er(t)
E
r
(
t
)
,变成如图所示:
此时引入Rho系数
X(t)=Rho×X(t−1)+Er(t)
X
(
t
)
=
R
h
o
×
X
(
t
−
1
)
+
E
r
(
t
)
将
Rho
R
h
o
的值增加到0.5,将会得到如下图所示:
将
Rho
R
h
o
的值增加到0.9,如图.这样逐渐得到一个平稳时间序列.
移动平均/MA
移动平均/滑动平均(Moving average,MA)是一种简单平滑预测技术,当时间序列的数值由于受周期变动和随机波动的影响,起伏较大,不易显示出事件的发展趋势时,使用移动平均法可以消除这些因素的影响,显示出事件的发展方向与趋势.
移动平均可分以下几种:
- 简单移动平均(SMA):前n个数据的未加权均值.如K线图中的5天移动平均线即5天内收盘价的均值.
- 累计移动平均(CMA):数据以有序基准流的形式到达,用户希望获得所有直到当前基准点数据的平均值.详细解释见wikipedia:Cumulative moving average.
- 加权移动平均(WMA):为样本窗口内不同位置的变量分配不同的权重,各变量乘以对应的权重后求均值.即基准点与固定加权函数的卷积.
- 指数移动平均(EMA):也称为指数加权移动平均(Exponentially Weighted Moving Average),是一种无限脉冲响应滤波器,采用指数下降的加权因子.每个旧数据的权重都呈指数递减,且不达到零.
指数移动平均与加权移动平均对比:
WMA权重 N = 15
EMA权重 N = 15
指数移动平均/EMA
指数移动平均/EMA(或指数加权移动平均Exponentially Weighted Moving Average)是一种常用的序列数据处理方式.处理过程为:
α控制衰减速率,Yt表示时间t时的原始值,St表示经过EMA后的时间t的值.指数移动平均就是把一系列的离散数据点转化为更好的数据点,后面的数据点会记住前面的数据点的一些信息,离得越远记得越少.
在TensorFlow中提供了tf.train.ExponentialMovingAverage() 来实现移动平均模型,即通过采用指数衰减保持变量的平均值.
在训练/保存模型时,使用tf.train.ExponentialMovingAverage()取不同迭代次数模型参数的移动平均,可以使模型在测试数据上更加robust.可以移动平均后的模型在性能上通常会比最后一次迭代保存的模型要好一些,在一定上可以提高最终模型在测试数据上的表现.
tf.train.ExponentialMovingAverage()
tf.train.ExponentialMovingAverage()
- decay:衰减率.
- num_updates:变量更新次数计数.
- zero_debias:若为True,则使用张量初始化零移动平均值.
- name:在apply()中添加的操作名称的前缀名称.
tf.train.ExponentialMovingAverage()需要提供一个衰减率/decay.该衰减率用于控制模型更新的速度.ExponentialMovingAverage对每一个待更新训练学习的变量/variable都会维护一个影子变量/shadow variable.影子变量的初始值就是这个变量的初始值,每次更新影子变量的值更新为:
shadow_variable = decay * shadow_variable + (1 - decay) * variable
shadow_variable为影子变量,variable为待更新变量,decay为衰减率.
decay决定了模型更新速度,decay越大模型越趋于稳定.实际应用中,decay 一般会设为十分接近 1 的常数(0.99或0.999).为了使模型在训练初始阶段更新更快,ExponentialMovingAverage还提供了 num_updates参数来动态设置 decay 的大小.若ExponentialMovingAverage初始化时提供了num_updates参数,则每次使用的衰减率为:
min(decay, (1 + num_updates) / (10 + num_updates))
即在训练开始时衰减率较低,这使得移动均线移动更快.随着变量更新次数的增加,衰减率(1 + num_updates) / (10 + num_updates)逐渐变高,当增加到一定次数后最终(1 + num_updates) / (10 + num_updates)大于decay,衰减率变为decay.
apply(var_list=None) 保持变量的平均值.返回更新移动平均线的操作.var_list:变量或张量对象的列表.
average(var) 返回Variable持有的平均值var.
ExponentialMovingAverage使用示例
#!/usr/bin/python
# coding:utf-8
import tensorflow as tf
v1 = tf.Variable([1, 2, 0], dtype=tf.float32)
step = tf.Variable(tf.constant(0))
# 通过采用指数衰减保持变量的平均值
ema = tf.train.ExponentialMovingAverage(decay=0.99, num_updates=step)
maintain_average = ema.apply([v1])
with tf.Session() as sess:
# 初始的值都为[1, 2, 0]
sess.run(tf.global_variables_initializer())
print sess.run([v1, ema.average(v1)])
# # 把[1, 2, 0]变为[1, 2, 5]
sess.run(tf.assign(v1, [1, 2, 5]))
sess.run(maintain_average)
# decay=min(0.99, 1/10)=0.1, v1=0.1*0+0.9*5=4.5
print sess.run([v1, ema.average(v1)])
# steps=10000
sess.run(tf.assign(step, 10000))
# 把v1变为10
sess.run(tf.assign(v1, [1, 3, 10]))
sess.run(maintain_average)
# decay=min(0.99,(1+10000)/(10+10000))=0.99, v1=0.99*2+0.01*4=2.01
# decay=min(0.99,(1+10000)/(10+10000))=0.99, v1=0.99*4.5+0.01*10=4.555
print sess.run([v1, ema.average(v1)])
sess.run(maintain_average)
print sess.run([v1, ema.average(v1)])
输出:
[array([ 1., 2., 0.], dtype=float32), array([ 1., 2., 0.], dtype=float32)]
[array([ 1., 2., 5.], dtype=float32), array([ 1. , 2. , 4.5], dtype=float32)]
[array([ 1., 3., 10.], dtype=float32), array([ 1. , 2.00999999, 4.55499983], dtype=float32)]
[array([ 1., 3., 10.], dtype=float32), array([ 1. , 2.01990008, 4.60944986], dtype=float32)]
参考:
TensorFlow-API-ExponentialMovingAverage
A Complete Tutorial on Time Series Modeling in R
《Tensorflow实战Google深度学习框架》4.4.3滑动平均模型.