量化交易软件策略:利用指数平滑法进行时间序列预测
简介
目前较为知名的预测方法林林总总,这些方法仅基于时间序列过去值的分析,也就是说,其采用的原则通常用于技术分析。这些方法主要使用外推方案,其中在某特定时间延迟处识别的序列属性超出了其限制。
同时,它还假定未来的序列属性与过去和当前相同。一种更为复杂的外推方案在预测中不太常用,该方案涉及到对于序列特性中变化动态的研究,并适当注意到预测区间内的此类动态。
基于外推的最具知名度的预测方法,可能就是采用 自回归求和移动平均线模型 (ARIMA) 的方法。而上述方法之所以流行,主要是因为 Box 和 Jenkins 的作品中提出并开发了求和 ARIMA 集成模型。当然,除了 Box 与 Jenkins 引入的模型之外,还有其他模型和预测方法。
编辑切换为居中
本文将简单介绍一下更简单的模型 - 由 Holt 和 Brown 早在 Box 与 Jenkins 作品问世之前就提出的 指数平滑模型。
尽管还有更加简单明晰的数学工具,但利用指数平滑模型预测产生的结果通常与使用 ARIMA 模型的结果差不多。这毫不奇怪,因为指数平滑模型就是 ARIMA 模型的一个特例。换句话说,本文研究的每种指数平滑模型都有一个对等的 ARIMA 模型。但本文不会研究这些等效模型,大家了解下就好。
我们都清楚,在每种特定情况下进行预测都需要一套独有的方法,而且通常都涉及到大量的流程。
例如:
缺失值与离群值时间序列分析。上述值的调整。
趋势及其类型的识别。序列周期性的确定。
序列稳定性的检查。
序列预处理分析(取对数、差分等)。
模型选择。
模型参数确定。基于选定模型的预测。
模型预测精确度评估。
选定模型误差分析。
确定选定模型是否合适,如有必要,更换模型并返回前项。
很明显,这还远非有效预测所需操作的完整列表。
要强调的是,模型参数确定和预测结果的获取,只是总体预测过程中的一小部分。但要在一篇文章里通过一种方式涵盖与预测相关的全部问题,似乎是不可能的。
因此,本文仅论述指数平滑模型,且使用未预处理过的货币报价作为测试序列。当然,随之而来的问题,本文中并不会一一作答,而只会涉及那些对于模型的研究有必要的问题。
1. 稳定性
外推法概念本身就恰当地暗示了所研究过程的未来发展与过去和现在别无二致。换句话说,它涉及到的是过程的稳定性。从预测的角度来看,平稳的过程极具吸引力,但遗憾的是它并不存在,因为任何实际过程在其发展的过程中都会面临变化。
在实际过程中,随着时间的推移,无论是预期、方差还是分布都会出现显著差异,但特性变化非常慢的过程可能归结于平稳的过程。这里所说的“非常慢”,是指过程特性在有限观测区间内的变化似乎无关紧要、可以忽略。
很明显,可用的观测区间越短(短样本),就越有可能对过程整体的稳定性做出错误决定。另一方面,如果我们更想了解过程以后的状态,同时计划做一个短期预测,则在某些情况下减少样本量可能会提高预测精确度。
如果过程有所变化,在观测区间内确定的序列参数就会有所不同,并超过其限制范围。因此,预测区间越长,序列特性变异对于预测误差的影响就越强。有鉴于此,赫兹量化必须将自己局限于单纯的短期预测;预测区间内如有大幅缩减,则能预计缓慢变化的序列特性,而不会导致相当大的预测误差。
此外,序列参数的变异还会导致按观测区间进行估测时获取的值采用平均值,因为此区间内的参数未能保持恒定。因此,获得的参数值不再与此区间的最后时刻相关,但却会由此反映出某个特定的平均值。遗憾的是,要完全消除这种恼人的现象是不可能的。但是,只要模型参数估计(研究区间)中涉及到的观测区间长度缩减到可能的程度,就能减少这种现象的发生。
同时,研究区间并不能无限制地缩短,因为极度缩减一定会降低序列参数估计的精确度。要在序列特性变异相关误差的影响与由于研究区间内极端缩减导致的误差增加之间寻求一种折中。
上述所有内容均完全适用于利用指数平滑模型所做的预测,因为它们像 ARIMA 模型一样,都是基于过程稳定性的假设。但是,为简单起见,下文中我们还是按照惯例,假设研究中的所有序列参数在观测区间内都会发生缓慢且可忽略的变化。
因此,本文要处理的是基于指数平滑模型、与带有缓慢变化特性的序列短期预测相关的问题。这里所说的“短期预测”是指提前一个、两个或更多时间区间进行的预测,而不是经济学中通常所理解的短于一年周期的预测。
2. 测试序列
到撰写本文时,此前保存的针对 M1、M5、M30 和 H1 的 EURRUR、EURUSD、USDJPY 和 XAUUSD 报价均已用到。每一份保存文件中都包含了 1100 个 "open" 值。最早的值位于文件开头,而最新值则位于文件末尾。文件中保存的最后一个值,对应的是文件创建的时间。包含测试序列的文件均利用 HistoryToCSV.mq5 脚本创建。而其借以创建的数据文件和脚本则位于本文末尾处的 Files.zip 存档中。
前面提到过,本文使用的已保存报价均未经过预处理,尽管这样存在明显问题,我仍想提醒您注意一下。比如说:一天当中的 EURRUR_H1 报价包含 12 到 13 个柱,而周五的 XAUUSD 报价包含的柱则比一周中的其他天少一个。上述示例表明,报价是利用不规则采样区间生成的;对于专为使用正确时间序列(意味着有个统一的量化区间)而设计的算法而言,这完全不能接受。
即便是利用外推法重现缺失的报价值,关于周末报价缺失的问题仍有讨论余地。赫兹量化通过推测得知,周末在全球范围发生的事件与工作日发生的事件对于世界经济的影响别无两样。革命、自然灾害、引人注目的丑闻、政府更迭等等,为数众多的此类大小事件随时都可能发生。如果这种事件发生在周六,其对世界市场的影响,几乎不亚于某个工作日发生的事件的影响。
很可能正是这些事件导致了一周工作结束后报价缺口的频现。很显然,就算外汇市场不运营,这个世界还是会按其自有的规则持续运转。对于是否应重现周末对应报价中的值(旨在对其进行技术分析),以及这样做有何益处,目前尚不明确。
这些问题明显超出了本文范畴,但初步来看,似乎没有任何制品的序列更适于分析,至少在判断周期(季节性)分量方面是这样。
用于未来分析的数据的初步准备,其重要性如何高估都不过分;就本例而言,它与报价一样都是一个重大的独立问题。而其于终端中的显示方式,一般来说不太适于技术分析。除了上述缺口相关问题之外,还存在许多其他问题。
比如说,生成报价时,某个固定时间点会被赋予不属于其的 "open" 和 "close" 值;这些值对应订单号的生成时间,而不是选定时间框架图表的某个固定时刻,然而众所周知,订单号有时非常罕见。
完全无视采样定理再举一例,因为就算是在一个分钟区间内,也没人可以担保采样率满足上述定理(更不必说其他更大的区间了)。而且,大家要记住,变量点差在某些情况下可能与报价值重叠出现。
好了,赫兹量化还是不管本文范畴之外的这些问题了,还是回到我们的主题上吧。
3. 指数平滑
我们先来看看最简单的模型
,
其中:
X(t) – (模拟的)研究过程;
L(t) – 变量过程级别;
r(t)– 零均值随机变量。
可以看出,此模型由两个分量的和构成;我们特别感兴趣的是过程级别 L(t),所以试着把它挑出来。
众所周知,随机序列求平均数可能会导致方差减少,即缩小其与平均值的偏差范围。因此我们可以假设,如果简单模型所描述的过程接受平均化(平滑),我们可能不具备完全摆脱随机分量 r(t) 的能力,但至少可以实现相当程度的弱化,并由此挑出目标级别 L(t)。
为此,我们会采用一种简单的指数平滑法 (SES)。
在这个著名的公式中,平滑程度通过 alpha 系数(从 0 到 1)的设置进行定义。如将 alpha 设置为零,则输入序列 X 的新进值不会对平滑结果造成任何影响。任何时间点的平滑结果都会是一个恒定值。
因此,在这种极端情况中,不受欢迎的随机分量会被完全抑制,而所研究的过程等级也会被平滑为一条水平直线。如将 alpha 系数设置为一,则输入序列根本不会受到平滑的影响。在这种情况下,研究中的级别 L(t) 不会失真,随机分量也不会受到抑制。
显而易见,如果选择 alpha 值,则同时还要满足相互冲突方面的要求。一方面,alpha 值要接近零,才能有效抑制随机分量 r(t)。而另一方面,alpha 值的设置最好还要接近一,才能让我们感兴趣的 L(t) 分量不失真。要获得最优 alpha 值,我们需要找到一个标准,并依据它对该值进行优化。
确定该标准时请记住,本文要论述的是预测,而不仅仅是序列的平滑。
就该简单指数平滑模型而言,在这种情况下,通常都是将在某指定时间获取的值
视为在采取任意步骤之前的预测。
编辑
其中
是时间 t 处提前 m 步的预测。
因此,对于时间 t 处序列值的预测,就会成为在上一步完成时进行的提前一步预测
在这种情况下,可以将某个提前一步预测的误差用作 alpha 系数值优化的标准
因此,通过在整个样本范围内实现这些误差平方和的最小化,我们就可以确定某指定序列 alpha 系数的最优值。当然,alpha 最优值也就是误差平方和最小的那一个。
图 1 显示了提前一步预测误差平方和与测试序列 USDJPY M1 某片断 alpha 系数值的对比图。
编辑
图 1. 简单指数平滑法
效果图上的最小值几乎无法辨别,近似大概 0.8 的 alpha 值。但简单指数平滑法并不总是该图所示的这种情况。当我们尝试获取本文中使用的测试序列片断 alpha 最优值时,通常都会见到一张 alpha 值持续下跌到一的图。
平滑系数值如此之高,表明该简单模型并不足以完全描述我们的测试序列(报价)。其中原因是过程级别 L(t) 变化过快,或是过程中出现了一个趋势。
我们再加入一个分量,让这个模型复杂一点
,
其中:
X(t) – (模拟的)研究过程;
L(t) - 变量过程级别;
T(t) - 线性趋势;
r(t)- 零均值随机变量。
大家都知道,线性回归系数可通过序列的双平滑来确定:
至于以这种方式获取的系数 a1 和 a2,时间 t 处的提前 m 步预测将等于
编辑
要注意的是,上述公式也采用了相同的 alpha 系数执行第一次平滑和重复平滑。此模型被称为线性增长附加的单一参数模型。
赫兹量化来说明下该简单模型与线性增长模型之间的区别。
假定所研究过程在很长一段时间内都显示为一个恒定分量,即在图表上显示为一条水平直线,但在某处开始呈现出线性趋势。对于利用上述模型生成的该过程的预测,请参见图 2。
编辑
图 2. 模型对比
可以看出,简单指数平滑模型明显落后于线性变化输入序列,而且,利用该模型所做的预测还在进一步拉大差距。如果使用线性增长模型,我们就会看到一个非常不同的图案。趋势出现后,该模型就像是要努力赶上线性变化序列似的,且其预测结果与变化输入值的方向也更为贴近。
如果指定示例中的平滑系数较高,则线性增长模型就能够在指定时间内“触碰到”该输入信号,且其预测结果也将与输入序列几乎一致。
尽管处于稳定状态下的线性增长模型在面对线性趋势时显示了良好效果,但也容易看出,它是花了一段时间才“赶上”这个趋势的。因此,如果趋势频繁变化,该模型与输入序列之间就会存在一段差距。此外,如果趋势未呈线性增长、而是呈平方律增长,则线性增长模型就无法“赶上”该趋势了。尽管有这些缺点,但在面对线性趋势的时候,该模型还是要优于简单指数平滑模型。
前面提到过,赫兹量化使用了一种线性增长的单一参数模型。为了找到测试序列 USDJPY M1 某片断 alpha 参数的最优值,让我们来绘制一个提前一步预测误差的平方和与 alpha 系数值的对比图。
此图以图 1 中相同的序列片断为基础,如图 3 所示。
编辑
图 3. 线性增长模型
对比图 1 中的结果,可发现本例中 alpha 系数的最优值已减至 0.4 左右。该模型中第一次与第二次平滑的系数相同,尽管理论上来讲,两者的值可以不同。至于包含两个不同平滑系数的线性增长模型,我们稍后再深入探讨。
赫兹量化谈到的两种指数平滑模型在赫兹量化中都有着以指数形式存在的类似物。这就是众所周知的 EMA 和 DEMA - 原本设计用于序列值的平滑而非预测之用。
要注意的是,使用 DEMA 指标时,所显示的是 a1 系数对应的一个值,而非提前一步预测值。在这种情况下,不会计算或使用 a2 系数(参见上述线性增长模型公式)。此外,平滑系统则会以对应周期 n 的形式来计算
例如,等于 0.8 的 alpha 将对应约等于 2 的 n;如果 alpha 为 0.4,则 n 等于 4。
4. 初始值
前面提到过,平滑系数值要在应用指数平滑法后以某种方式获取。但这样看似还不够。由于指数平滑法中的当前值是根据前一个值计算的,所以会存在该值在时间零点尚不存在的情况。换句话说,对于线性增长模型中 S 或 S1 与 S2 的初始值,要通过某种方式在时间零点处计算得出。
要解决获取初始值的问题并不总是轻而易举。如果(就像在 赫兹量化中使用报价的情况下)我们有一段很长时间的可用历史数据,且初始值未准确确定,则指数平滑曲线就有时间在到达某个当前点之前保持稳定,同时也已纠正了我们的初始误差。大约需要 10 到 200 个(有时更多)周期,具体取决于平滑系数值。
在这种情况下,粗略估算一下初始值,再在目标时间周期之前启动指数平滑过程的 200-300 个周期就足够了。不过,比如说可用样本包含 100 个值,其难度就好增大。
有关初始值选择的文献中,有着各种各样的建议。比如说,简单指数平滑法中的初始值可以等同于序列中的第一个元素,或是被计算为序列中以平滑随机离群值为目的的三四个初始元素的平均值。线性增长模型中的初始值 S1 与 S2 可基于以下假设,即预测曲线的初始级别应相当于序列中第一个元素、且线性趋势的斜率应为零。
虽然还可以在与初始值选择相关的不同来源中发现更多建议,但没有人可以确保在平滑算法的早期阶段中没有显著误差。在为了达到稳定状态而需要大量周期、并使用低值平滑系数时,这一点尤其明显。
因此,为了将初始值选择相关问题的影响降至最低(尤其是针对短序列),我们有时会采用一种方法,其中涉及到搜索导致预测误差最少的此类值。这就是一个针对初始值(整个序列内以小幅增量变化)计算预测误差的问题。
在所有初始值可能组合的范围内计算误差之后,即可选择最适合的变量。但这种方法非常费力,需要进行大量计算,所以几乎从未被直接使用。
所述问题与某个多变量函数最小值的优化或搜索有关。此类问题可利用各种专为大幅缩小所需计算范围而开发的算法来解决。我们会在稍后的预测中重新探讨平滑参数和初始值的优化问题。
5. 预测精确度评估
预测流程与模型初始值或参数的选择,引发了预测精确度评估这一问题。在比较两种不同模型或确定所获预测的一致性时,精确度评估也很重要。虽然针对预测精确度评估的知名估算法非常多,但其中任何一种算法都要求在每一步了解预测误差的情况。
前面已经提到,时间 t 处的提前一步预测误差等于
其中:
– 时间 t 处的输入序列值;
– 在前一步所做的时间 t 处的预测。
最常见的预测精确度评估法很可能就是利用均方误差 (MSE) 来评估:
其中 n 为序列中的元素数。
有时也有人指出,对于较大值偶尔出现的单个误差的极端敏感也是 MSE 的一项劣势。其原因是在计算 MSE 时对其误差值求平方。作为替代方案,在这种情况下使用平均绝对误差 (MAE) 也不错。
这里的均方误差由误差的绝对值所取代。人们认为利用 MAE 得到的估算更为稳定。
比如,两种估算方法都非常适合采用不同模型参数或模型进行的相同序列预测精确度的评估,但它们对于从不同序列中接收到的预测结果的对比似乎没什么用处。
此外,这些估算值并不能明确表明预测结果的质量。比如说,我们不能说所获得的 0,03 或任何其他值的 MAE 是好是坏。
要想对比不同序列的预测精确度,我们可以使用相对评估法 RelMSE 和 RelMAE:
编辑
这里将获取的预测精确度估算值除以通过预测测试方法计算出的各个估算值。作为一种测试方法,它适合使用所谓的朴素法,即暗示过程的未来值将与当前值相等。
编辑
如果预测误差的平均值与利用朴素法获得的误差值相等,则相对估算值将等于一。如果相对估算值小于一,则意味着平均来讲,该预测误差值小于朴素法中的相应值。换句话说,预测结果的精确度要高于使用朴素法时的精确度。反之,如果相对估算值大于一,则预测结果的精确度一般要低于预测时使用的朴素法。
这些评估还适用于提前两步或更多步的预测精确度估测。计算中的提前一步预测误差需要替换成相应提前步骤的数量的预测误差值。
比如说,下表中就包含利用线性增长单一参数模型中 RelMAE 估算出的提前一步预测误差,而这些错误都是利用每个测试序列的最后 200 个值计算出来的。