时间序列是人工智能(AI)的经典应用领域。 随着目前金融科技和人工智能的火热,全球金融市场的金融时间序列如指数、外汇汇率、黄金价格、利息、股票、期货等特别应用了以深度学习(DL)为首的现代人工智能模型不断进行分析和预测。
来源:NoSimpler Analytics
所以不出所料,越来越多的专业和非专业公司以及一些主要金融机构(银行,经纪,基金,人工智能公司,金融科技公司等)正在部署或至少试验AI模型和算法来预测这些真实世界中的时间序列,希望比使用已经应用了数十载的经典数学模型如线性回归或更高阶回归模型(见上图),ARIMA,ARFIMA,VAR模型等等更有效。
我将在一系列文章中讨论如今哪些现代AI模型和算法更适用,并保证在分析和预测时间序列方面取得可量化的进展。另一方面,哪些模型可能不会从长远来讲带来任何统计上显着的进步。
我试图对各种AI模型的使用和优点/缺点及其相关问题进行客观的评估和判断。
这篇文章适用于拥有一定的金融和人工智能背景但对AI模型几乎没有实际经验的读者。 因此,我将避免详细的数学讨论和复杂的数学统计论证,而是专注于分享我多年来将各种AI模型(甚至我自己的模型)应用于复杂的金融应用程序所获得的见解。
显而易见的首选:深度学习?
许多公司现在通过使用一些标准的深度学习网络(见上图)和相关模型(如卷积网,强化学习,对抗性学习模型等)参与应用AI。通常来说,几乎所有的关于人工智能的文章或评论都或多或少的提到,并对这些技术和模型不吝赞美之词。
没有必要再继续表扬这些模型了,我将主要关注金融领域中,特别是预测领域使用深度学习和相关模型时遇到的问题。
如果你想学习和理解深度学习带来的问题,以获得更客观的观点或做出更复杂的投资决策,那么我希望让你了解,深度学习你真的能指望什么,以及关于深度学习的初步见解。
操作问题:批量处理
传统的深度学习模型需要在批量处理模式下进行训练(即使一些公司正在研究不再以批量处理模式操作的变体,绝大多数深度学习模型仍在使用中)。 这意味着,需要对这些模型需要经过训练、验证和测试,再停止这一训练过程,以便投入使用。
部署后,深度学习模型无法再调整或继续学习。 如果这些模型的性能出现问题,就必须离线并重新训练。 这样做的问题是,整个过程不仅会干扰操作(除非你有一个备用版本的深度学习网络,在主模型重新训练的同时继续工作),同时也并不能保证新训练出来的模型比原先被替换的模型表现更好。
通过重新训练来纠正现有的深度学习模型并非易事(请参阅下面讨论的大多数问题),它需要要从头开始整个部署过程。 重新训练深度学习模型不像修补或修复软件中的错误,它更像是一个完整的新开发项目,我们却并不知道错误的确切位置。
反向传播:经典梯度下降算法
来源:Lazy Programmer网站
深度学习模型使用训练算法(称为反向传播),使用了数学中的经典梯度下降算法。 这已不是什么新的概念,并已在数学领域中研究了数十年。 因此,深度学习并不是什么新鲜事,它是公关和营销新包装下的旧数学优化模型。其关键和已知问题是它们不能保证找到它们的参数(权重)的全局最优解,因此它们在搜索时很容易陷入局部最优、而不是全局最优的参数集。 这意味着,当应用于时间序列分析和预测时,它们无法保证它们能够生成最佳预测结果。
学习和计算的成本
来源:Victor Lavrenko, 2014
这些网络的训练计算成本非常高,深度学习网络中单个权重的计算要求算法能迭代求解各种复杂的传递函数的链式微分方程。然而,复杂的深度学习网络可能至少有一百万甚至更多这样的自适应权重,并且单个权重需要针对每个训练示例进行重新调整。
例如,如果时间序列拥有1,000个值或数据点(例如3年以上的股票图表,以每日交易收盘价为一个数据条目),对于一个一百万权重节点的深度学习网络需要进行1000次计算,所以计算量会达到10亿次!而这仅仅是对整个网络节点的一次训练而已。实际上,网络可能需要显示数百或数千倍的所有训练示例,从而保证最终调整得到的权重在测试集上的预测结果在既定的误差容忍范围内。为了在合理的时间范围内(只用几天甚至几小时,而非几个月或是几年的时间)实现如此大量的计算,深度学习网络通常需要在大型服务器或大量并行运算的电脑上进行训练,或者两者结合。
为了解决训练的时间问题,通常会使用一些实用的技巧。 例如:使用非常简单的算法训练网络几个周期,在每个周期中仅训练部分权重,使用遗传算法预先设置权重,而不是随机分配权重或用一些近似网络结构的算法。但所有这些都不是科学的方法,而且大多数只是无指导的试验和错误 - 技巧可能在某些情况下起作用,也可能完全不起作用,不能保证成功或确保减少时间和精力。即使这些或类似的技巧以某种方式起作用,你可能也不会理解它们实际工作的原因和方法,这也不是很有用(另见下文)。
深度学习网络的结构与设计 - 充分反复试错
来源:Github, 用于视觉识别的CS231n卷积神经网络
深度学习网络的应用和时间序列预测的另一个主要问题是如何找到网络的最佳整体设计和结构。没有已知的理论来决定如何设计最佳网络。这在实践中是一个大问题,因为没有指导例如网络应该具有多少层,每层有多少神经元,神经元应该使用什么传递函数,激活的阈值或神经元的层应该是多少等等。这时候资深的工程师可能会有很大的帮助,因为他们对深度学习模型在不同场景的应用有着丰富的经验,因此能更好地“猜测到”每个环节优化模型性能的关键所在。
显然,深度学习网络的整体结构也对计算成本和工作量产生重大影响。你可以使用具有数百万权重的小型或大型网络,但是不能保证更大或更复杂的网络比神经元更少、层数更少的小而简单的网络表现更好(参见下面对过拟合和欠拟合的讨论)。
最好的设计开发方法似乎是,从一个相当小的网络开始并训练它,看看可以实现什么样的结果,然后从那里开始用额外的神经元、层、连接等缓慢扩大网络直到预测结果接近一个更合理可接受的水平。
再次强调这一点:在深度学习网络中需要设置和学习许多参数,这些参数既没有理论指导也没有任何实际指导 - 主要是通过大量试错来寻找最佳方法设置这些深度学习网络。有一些近似方法(例如使用某种遗传算法来找到深度学习网络架构和结构的最佳启动配置)但是它们通常需要额外的计算时间和资源才能添加到已经非常昂贵且耗时的网络处理中。
如果有足够的资金和大量服务器,你可以同时在不同的深度学习网络进行多次学习试验,然后选择性能最佳的网络再次进行训练,并与其他的优质网络进行对比(一种最适合的深度学习网络的生存方式)。
来源: Silver, D. etal. Nature Vol 529, 2016 Bob van den Hoek, 2016
这就是谷歌/DeepMind(AlphaGO)最终找到击败人类围棋冠军的方法。这种寻找最佳网络架构和参数集的演化方法通常可用于深度学习网络的任何类型的应用,并且可能产生不错的结果 - 但请记住,如果使用这种方法,可能会产生巨大的计算成本和工作量,而我们并不是谷歌。
来源:(CMP305) Deep Learning on AWS Made EasyCmp305
即使找到并确定了良好的起始网络结构和一组良好的初始权重问题,仍然需要找到最佳匹配的深度学习网络整体培训方法。
深度学习网络处理时间序列预测的标准和直观的训练方法是选择和定义数据点上的“滑动窗口”(见下图)。 需要选择数据点的固定时间窗口(比如代表大约一个月训练数据的某个股票的连续收盘价格的20天),将训练集切割成固定模块以馈送到网络的输入层并且预期的预测日期的数据(比如第21天的收盘价)被放在输出神经元上。在整个时间序列中重复执行此操作,直到达到可用训练天数的最终日期。 这种训练方法的期望是,无论何时将来连续20天的时间窗口数据输入网络,深度学习模型都将学习预测这些信息输入第21天的数据。
来源:https://www.obitko.com/tutorials/neural-network-prediction/neural-network-training.html
(c) Marek Obitko, 1999
很明显,窗口的宽度在这里至关重要。 它可以是连续20天或30天,或60天,180天 - 或任何其他数字吗?窗口的宽度仅受可用数据集的长度和大小的限制 - 但除此之外,它可以采用任何大小。除了极少数情况之外,它们对于如何选择最佳窗口宽度没有理论指导。另外,为什么要使用连续日期窗口进行培训?一次也可以使用非连续句点或非连续日期的组合,并在输入窗口中添加一些其他日期。没有理由证实这样做的结果不会一样好,更好或更糟。
如何在训练期间应用训练样本和滑动窗口?必须应用某个序列,但是哪一个?我们假设最简单的解决方案是窗口从整个系列的时间序列开始到其结束平滑滑动。但是,我们根本不清楚这是否必要或者是否有帮助。 窗口也可以仅以随机顺序应用,从一个开始日期跳到一些随机的其他日期。然而,对于权重的调整,应用训练样本的确切顺序可以对权重调整产生实质性影响,从而对预测结果产生重大影响!
过拟合与欠拟合 - 何时应停止训练?
假设呈现训练数据的顺序以及数据的窗口问题已经解决,但何时应该停止深度学习网络训练仍然很难确定。
来源: https://www.scielo.br/scielo.php?script=sci_arttext&pid=S1678-58782010000200007
J. Braz. Soc. Mech. Sci. & Eng. vol.32 no.2 Rio de Janeiro Apr./June 2010
我们如何决定训练得到的深度学习网络已经能够达到我们任务的目的,从而停止训练?乍一看,这似乎是一个容易解决的问题:只需跟随深度学习网络的整体输出(预测)错误的发展。只要错误率在下降,就继续学习。一旦错误恢复,就停止训练。但是这种方法不起作用,正如我上面已经解释的那样,因为深度学习网络遵循梯度下降模型,该模型很容易陷入局部最优。
另一种方法是在网络达到某个绝对成功水平后停止学习,例如错误率低于10%或5%,或任何看似合理且可接受的程度。但是,这也不是一个好方法。如果深度学习网络可以在90%或更多测试用例中正确解决问题,这可能只意味着网络太大而且权重太大。
来源: https://www.semanticscholar.org/paper/Machine-Learning-for-Medical-Imaging.-Erickson-Korfiatis/474d8f5a80ca3dc56ed7b149a1fb09edc71931b2
Erickson, Bradley James et al. “Machine Learning for Medical Imaging.” Radiographics : a review publication of the Radiological Society of North America, Inc 37 2 (2017): 505-515.
当网络中具有太多权重时,它几乎只能以分布式方式将所有输入数据的相关特征存储在权重中(这种效应称为“过拟合” - 见图)。 这意味着,深度学习网络几乎“用心学习数据”。
关键问题是,这样的网络可能不会很好地覆盖全部数据。它们可能大部分只能识别与训练样本完全相似或近似的数据,但是对不同的数据集可能识别表现不佳。
因此,过拟合意味着深度学习网络无法从他们学到的东西中得到全面的概括。然而,这是大多数应用程序所需要的功能,也是人工智能模型为什么“智能”的功能 - 否则只需使用一个非常简单的Excel工作表并定义一个简单的容忍误差(比如从训练数据中偏离1%)而作出预测。
相反,称之为“欠拟合”的效果也是可能存在。深度学习网络可能没有能力以所需的精度对输入模式进行分类。
在测试中经常看到的深度学习网络“欠拟合“的典型结果和效果,甚至是关于深度学习预测成功的发表论文中见到的,是欠拟合深度学习网络生成的预测曲线看起来像时间序列本身的副本,只是转移到右边,有个延迟(见上图中的蓝线)。
这种效果通常由深度学习网络在“检测”隐含规则时产生,该隐含规则通常对第一眼看到的某些时间序列产生良好的预测。 当n + 1数据点更可能等于或非常类似于第n个数据点(前一点)时,此规则适用。这展示了统计效应,即在许多现实世界时间序列(也是许多金融时间序列)中,相邻的数据一定有相应实质性的变化的可能性,比在一定的范围内找到固定相邻数据的可能性小很多。
例如,通过预测同一个位置连续两天的某些天气模式(温度,降雨,湿度等)可以容易地生成天气预报。这可能很容易产生70+%的预测成功率,因为大多数地方的剧烈天气变化通常相对较少。明天的天气往往跟今天的天气很像。我们通常不会意识到这个简单的统计规则,因为我们大多只是有意识地注意到天气确实在变化,而在天气稳定时就很难留意。但是这个作为预测基础的规则是无用的 - 因为大多数天气预测的关键点是在天气实际发生明显变化时提前发现并预测天数和时间!
因此,过拟合既不好也不合适。这给我们留下了什么?两种情况都比较容易检测。在欠拟合情况下,预测误差范围通常会过高并且在测试期间已经超过可接受的水平。过度拟合更难以检测。乍一看,高成功率令人欣慰,大多数公司都认为这是成功的标志,而不是失败。但这只是表明深度学习模型缺乏经验。错误率非常低 - 尤其是对比人类处理时的结果数据- 更多的应是怀疑而不是满足的标志。 在任何现实世界的情况下,成功率超过90%左右表示方法,概念或数据损坏 - 而不是成功。
这会产生非常严重的问题,尤其在需要非常高的成功率的区域里部署AI模型。例如,在许多安全相关的应用(例如自动驾驶汽车),医学(癌症诊断)或时间序列预测中,或者如果AI模型应用于例如高频交易这类必须在毫秒内采取行动,且不可能在交易大量资金时有人监督或有其他安全机制。
总结这些个问题:一般来说,没有理论或实际指南来决定何时停止深度学习网络的培训。最好的方法是让经验丰富的工程师做出判断。然而,考虑到上述论点,深度学习网络的90+%的正确率都令人担忧而不是满意!
深度学习成功案例 - 假新闻?还是更糟?
每当听到深度学习网络在执行某项任务中比所有竞争对手或人类更好时,都应该持非常怀疑态度并仔细阅读此类公告,并寻找背后的既得利益。最好把这些公告想象成是特朗普发的。
来源:Technology Review
一个令人震惊的例子是,最近一些中国研究人员声称深度学习网络可以通过人脸识别罪犯(见上图!是的,通过人脸来识别并有90+%的正确性。
使用有偏见的数据
上述荒谬的人脸识别功能的例子引出了另一个关键问题(也扩展到其他学习模型):训练和测试数据的选择,质量和使用。
在这种情况下,怎样才能解释90%以上的成功率(假设作者没有作弊和夸大他们的结果)?答案在于数据集训练的整理和收集过程。研究人员使用了两组图片来训练深度学习网络。第一组是一组罪犯的照片,第二组是随机选择的“正常人”。现在,每天都能很容易获得普通人的照片,通过社交网站就可以得到编译后的照片数据。
然而,你怎么能得到1000张罪犯的照片呢?唯一的办法就是与警方或政府当局达成某种协议。但这些图片将被高度标准化,大部分照片是在罪犯被捕后被拍摄下来,或者在警察局或政府监狱里拍摄。
而这正是造成问题和所谓高“成功率”的原因。深度神经网络真正检测到的并不是罪犯面部的独特特征,而是照片设置的一些一般特征,比如使用的光线(强度、颜色、光源角度、阴影等),一些共同特征的背景拍照(可能是与犯罪分子相同的背景墙纹理或颜色,因为它们是在一些政府建筑物中拍摄的,与非犯罪分子的图片相比,可能在每张照片中都有所不同)或其他一些不相关的特征,比如罪犯穿的衣服(监狱服装),都具有一定的统计意义。
这个例子很好地说明了,收集训练和测试数据这样一个“简单”的任务是如何决定深度学习的结果和成功率的。这是“垃圾进,垃圾出”原则的经典例子。然而,在许多情况下,检测“垃圾”部分并不是像上面的例子一样简单。
要想知道研究人员在人脸识别的例子中哪里出了问题相对容易。但当你考虑金融应用时,比如具有数千个数据点的时间序列预测,这些数据点都是在一定范围内的普通数字,事情可能会变得更加复杂。分析这样的数字训练数据,看看它们是否包含某种偏差或噪声(随机或不随机),在数学上是非常困难的。事实上,在数据集中发现这些隐藏的但具有统计学意义的特性正是深度网络应该做的事情!
深度学习和缺失的时间概念
现在,让我们离开数据问题领域,继续讨论深度学习领域中最后一个也是最关键的一个限制。深度学习领域缺少时间概念,但这通常没有被认真考虑过。即使是经验丰富的工程师也经常忽略这个问题。深度学习网络没有“理解”和处理时间概念的机制或特性!
当将一组与时间相关的连续数据点放入网络的输入层(例如股票收盘价的前20天)时,深度学习网络无法识别这些数据点是否是时间序列或只是一些时间戳。在任何时间点它都会认为输入的时间序列数据是同时获取得到的。
深度学习网络并不“理解”输入数据和滑动时间窗口的数据里包含了时间维度。如果它看到了20天的股票价格,然后又看到了另外20天,它就无法意识到它们是按顺序出现的,即使它们在训练过程中一直显示在一起。深度学习网络可以将任何输入看作是电影的一个画面,但是它不能及时地将两个不同的画面联系起来,并且意识到一个画面是后来的一些画面的先决条件。对于深度学习网络,每个电影帧都是独立于其他帧的。
深度学习网络将两个不同的输入看作是两个不同的训练样本,输入阵列与期望输出预测值(s)之间存在两种不同的潜在关联。深度学习网络永远只是试着将一组输入数据(前20天)和预测的输出结果(21日的)以及另外一组输入和对应的预期输出联系起来— 但它从未思考过时间序列分析中非常关键的两组数据的先后顺序。
但是,深度学习网络可以很容易地学习“继承者”的概念,进而学习时间概念。例如,一个网络可以通过将它显示为输入帧n和期望输出帧n+1,然后将输入帧n+1和期望输出帧n+2等来训练。通过这种方式,它似乎能够学习并预测当显示某个输入帧n+k时将会发生什么。但请注意,这是非常容易发生误导的。 如果你给网络提供一个它在训练期间没有看到的电影的帧,它将不会从电影中生成后继帧,而只会给出从所有先前看到一些统计相关的像素混合出来的像素点。
这就是为什么深度学习网络甚至不能可靠地学习最简单的时间序列的继承函数,即自然数的序列:1,2,3,4,5,6……等等。本系列的训练总是需要停止在某个有限的最大数目N,即使任意数量的净产生正确的继任者k(小于N)为k + 1。完全不清楚如果我们遇到一个比N大,却又从没在训练样本中观测到的继承者会发生什么,例如输入第120,000,000个素数,我们得到的输出是一个非P的继承者的可能性非常的高。
对于任何时间相关模式,深度学习网络的主要限制是在大多数情况下反对使用深度学习进行时间序列分析或预测的杀手论证(它们仍然可以用于检测时间序列中的模式,例如“肩头形成”或其他更复杂的模式,但前提是这些模式在输入数据的整体统计中很好地表示,而与它们的时序关系无关)。
来源:Hochreiter & Schmidhuber, 1997
已经提出并创建了若干深度网络的变体以掩盖或补偿这种主要限制。 其中一个最着名的例子是LSTM(长短期存储器,见右图)模型,它为过去的输入引入了一种存储器,并为其提供了定时组件,并且还允许反馈环路创建另一个潜在的时间编码。 然而,这些替代的深度学习变体模型本身也存在问题和其他限制,我现在不想在这里讨论。 我将在另一篇文章中评估和讨论其中一些模型。
卷积深度学习网络
来源:CUDA-ConvNet: Open- Source GPU accelerated code by [Krizhevsky etal,, NIPS 2012]
深度学习领域最重要的变种与扩展就是所谓的卷积网络。 这些是在输入被馈送到深度学习网络本身之前,已经经过一个或者多个预处理层的处理的神经网络。这在许多应用程序中都很有意义。
在时间序列中,人们通常可以轻松地检测到一些简单的规律,例如一般的潜在趋势(例如股票市场的上涨,下跌,横盘)或总是在相同时间间隔内出现的季节性影响。 如果原始数据在没有预处理的情况下被送入DL网络,则可能需要大量的计算资源来检测和过滤掉该系列的这些简单组件。 因此,大多数卷积层充当数据的过滤器,因此深度学习网络可用于识别时间序列中难以识别的模式(见下图)。
来源:https://github.com/eseifert/gral.wiki.git, GRAL, Java Graphing
使用卷积的优点是卷积层也可以通过反向传播导数进行训练和自动化训练,早期的情况并非如此,卷积必须手工编程并针对每个应用进行定制(参见图片如下)。
来源:https://www.slideshare.net/kuwajima/cnnbp, Hiroshi Kuwajima, 2014
如今使用卷积的优点是卷积层也可以通过反向传播衍生物进行训练并自动化(在早期的情况下,卷积必须是针对每个应用进行手工编程和定制的情况)。
使用深度学习网络的开源软件包并非免费的午餐
深度学习网络大热,这吸引了许多公司已经开始使用相应的模型甚至使用了完整的深度学习软件包,因为它们是免费提供的,现在通常也可以作为开源提供。
来源:https://www.kdnuggets.com/2017/03/getting-started-deep-learning.html
KDNuggets, Getting Started with Deep Learning
Matthew Rubashkin, Silicon Valley Data Science
但请注意:在我看来,在这个领域活跃的所有大型互联网、移动和社交网络公司都在推动并进一步大量使用这些深度网络(如微软,谷歌,亚马逊,Facebook等)。 它们将这些作为开源软件包免费赠送,但它们同时提供了运行这些软件包的云服务 - 但显然这些服务不是免费的!
大型企业不仅希望你依赖于他们的产品和基础设施,还希望你使用他们的系统,以便他们进一步扩展到新的应用领域(如FinTech)和获取新客户。(这类似于在谷歌免费赠送其Android移动操作系统之后 - 这是一个有计划的举措,因为他们现在基本上拥有并控制着整个移动操作系统市场,比任何像Apple这样的竞争对手都有巨大的优势。)
来源:https://www.kdnuggets.com/2017/03/getting-started-deep-learning.html
KDNuggets, Getting Started with Deep Learning
Matthew Rubashkin, Silicon Valley Data Science
对于深度学习开源软件包来说,天下没有免费午餐 - 随着时间的推移你会越来越依赖他们的系统,而且在投入了大量的精力和资金之后,你可能需要付出更高的成本。 你必须要考虑这些免费工具的提供商可能随时修改其开源许可证和条款,让这些成为你的劣势。
结论
深度学习网络及其变体是可以使用的,并且应该在更多的领域中推广。深度学习已经在这些领域中取得了具有良好且有价值的结果,而这些结果很难通过任何其他技术实现。
但是由于上述原因,我并不建议在时间序列预测应用程序中使用它们。最关键的原因是:过高的计算成本和努力,大量非偏见训练数据的需求,过拟合或欠拟合的问题,缺乏处理和表示深度学习网络时间依赖性的机制、以及需要设置或学习的大量参数。
公平对待深度学习网络,我上面提到的一些论点(例如需要无偏的数据)也适用于AI中的所有其他数据驱动的学习模型。 然而,大多数其他有趣的时间序列分析和预测模型并没有过于夸张,在我看来仍然需要更多关注,以了解它们的全部潜力。
我将讨论在后续帖子中使用其他AI模型进行时间序列预测。
2017年4月24日,写于香港