全解用 Python 建立能源市场算法交易的机器学习框架
(点击上方公号,快速关注我们)
编译:数据派 - 笪洁琼 ,冯羽 , 英文:SIMON KUTTRUF
前言
人工智能的新突破每天都成为头条新闻。在金融领域,机器学习的广泛运用和强大的应用,客户们并不了解。事实上,很少有像金融行业那样具有深厚历史、清楚明了和结构化数据的领域——这使得它成为了“学习机器”的一个早期标志,在这个领域取得了巨大的成功,而且还在继续。
大约三年前,我参与了为能源市场的价格预测和算法交易开发机器学习(ML)模型,特别是在欧洲的碳排放证书市场。在这篇文章中,我想要分享一些我在我的ML项目中发现的相关知识、方法和见解。
我的重点不是在技术细节上,而是在模型选择背后的一般考虑因素,在经典的学术教科书或新技术的在线教程中很少讨论。
在算法交易的例子中,我展示了一些“交易技巧”,你可能会发现,当你把机器学习应用到现实生活中的环境中,比如一个孤独的求知者或者你的同事们,可能会觉得这是有用的。
能源交易市场
欧洲碳排放证书(EU ETS)的市场是在2005年京都议定书之后确立的,作为欧盟气候政策的一个重要支柱,通过一项“总量控制和贸易”计划对欧洲约一半的人为二氧化碳排放进行监管。这一机制为各国政府提供了控制温室气体排放总量的控制(“上限”),同时承认了对市场力量(“交易”)的排放权的有效分配。其基本理念是对污染定价:该计划所涵盖的每一个工业设施都必须被监测并报告其温室气体排放的确切数量,然后通过交付配额来抵消各自的排放量(以吨为单位)。
这些“污染权”被拍卖或免费发放给工业企业,然后可以在场外交易或在中央市场上进行交易,以便按需求和供应灵活定价。
由于环境政策的减排目标限制了每年的总供应量,一些污染者不得不选择减少污染的措施(“减排”),比如在烟囱里安装额外的过滤器。这些污染者的边际减排成本低于目前许可证的市场价格(例如,由于他们的特定的过滤设备很便宜),他们可以将多余的污染配额出售给那些面临更高边际减排成本的污染者,并获取利润。
在一个完全有效的排放交易市场中,许可证的均衡价格将以最终减排单位的边际减排成本为基础,以满足限额供应上限设定的总体减排目标。
考虑到具体行业的减排成本的不确定性,该工具允许政府控制排放总量,而排放许可证的实际价格则根据需求方市场力量的变化而波动,包括:
市场对未来政策变化的预期
即将举行的拍卖许可证的规模、价格和持续拍卖的覆盖比率(见图1)
市场参与者的投机
银行行为(一年内发放的许可证在同一政策阶段的所有年份都有效)
其他能源商品的价格关系
为了举例说明后者,假设每个热量单位的天然气价格低于布伦特原油的价格。
电力生产商和公用事业公司将转而使用这种更少碳的燃料,从而降低了对碳排放的需求。
因此,在这些时期,配额的价格也会下降(见图2)。
图1:下午2点的高覆盖拍卖的看涨信号,很快打破了一个看跌的趋势
图2:2017年欧盟与英国天然气的标准30日(绝对和标准化)
一个全面的模型需要反映所有这些因素。虽然我们可以安全地假定模式中观察到丰富的历史市场数据延续到现在,并将持续到未来(这是必要条件,不可或缺的假设,对于任何分析模型),很明显,这个设置,对于任何试图建立基于通用市场信念、基于经济物理学基本的关系或状态空间概念的模型,都过于复杂。
机器学习的应用
所以这是一个用来释放机器学习力量的案例。如何利用机器学习呢?
下面是一个使用监督学习的交易系统的典型工作流程图:
1.获取数据
财务时间序列的良好来源是你想要交易的交易所的API,AlphaVantage或Quandl的API。
数据的规模至少应该和你想要建模并最终预测的规模相同。你的预测范围是什么?
长期的范围将需要额外的输入因素,比如市场公告、政策前景,基于twitter关联数据的情绪分析等等。如果你在短期的游戏,甚至基于纯市场信号的高频交易数据,您可能想要包括各种长度的平均值为模型提供历史背景和趋势,特别是如果你的学习算法没有像周期性神经网络或LSTMs那样的显式记忆单元。
技术分析中使用的所有常见的指标(如相对强弱指数(RSI),平均趋向指标(ADX),布林线(Bollinger Bands),MACD(平滑异同移动平均线))是基于某种数量(价格、成交量)的移动平均线——即使你不相信简单的交易规则,该模型将帮助并反映了大多数市场参与者包括他们的交易行为。
您的计算能力可能是一个限制因素,特别是在您的ML模型将与硬编码、快速且独特的市场制造或套利者的算法相抗衡的情况下。
部署专门的云服务器或像H2O和TensorFlow这样的ML平台,可以让您在不同的服务器上进行计算。
清理数据(你如何插补空白?),绘制它,同它一起玩耍——你已经发现了交易机会,趋势,异常吗?
2. 监督模型训练
将您的数据划分为训练、验证(用于参数调优、特征选择等)和测试的补充集。这实际上比听起来要复杂得多:最理想的情况是,测试集应该尽可能地与当前的市场状态“相似”,验证和测试集应该遵循相同的分布。
否则,您可能会浪费精力在验证集上调整模型参数,结果却发现它对测试集的泛化是很糟糕的。遵循“市场机制”的概念,也就是在特定的商品组合中,特定组合商品的延长期支配着你的目标工具价格动态——有必要首先有一个聚类算法的无监督学习发现定义相关性数据,然后评估属于同一集群的验证集和测试集的模型性能(参见图3——在这个项目中,集群使得预测性能提高了8%)。
图3按照聚类算法(彩色部分是EUA结算价格)确定的一致市场周期
在早期,决定并建立一个单一的评价指标。追逐太多不同的指标只会导致混乱。
在算法交易的正文中,一个合适的衡量标准是“利润和损失”(PnL),因为它用实际的动荡大小(“相关性”)对分类精度(价格上升/下降)进行加权。它符合您可能考虑的交易策略的度量标准。观察训练和验证集的模型性能,如果训练集上的错误,即“模型偏差”,是很高的,你可能需要允许更多的模型参数(例如在深度学习模型中增加更多的层/神经元)。
如果模型缺乏泛化(“训练集的模型过度拟合),也就是验证集和训练集上的性能差异(“模型方差”)很高,你可能需要添加更多的数据训练集,减少最相关的特性,添加正则化(如L2,L1或中止)或早期停止(在梯度下降优化)。仔细检查模型出错的情况将有助于识别任何潜在的和可避免的模型偏差,参见图4。
图4错误分析——价格变动与预测信心(大于0.5:上升,<0.5:下降)
建立你的目标表现:对于市场预测,75%的分类精度实际上是相当不错的——比随机预测要好50%(50%的精度)。这个基线与其他ML应用程序非常不同,比如对象或语音识别,它们在一个封闭的环境中运行,其中影响建模目标的因素可以清楚地识别出来(图像像素的RGB通道,声音样本的波频率)。
3. 交易策略
定义你的交易策略:一套根据模型输出定义具体交易内涵的规则:如根据一个给定预测的模型置信度的阈值,设置你在市场上的头寸,头寸的大小,以及在给定的市场状态下,你持有一个头寸的时间。策略通常会附带一些需要优化的自由参数(下一步)。
在本文讨论的监督学习的背景下,这是一个相当于手动基于反向测试和网格搜索的过程(下面列出了一些缺点)。
4. 回溯测试&最优化
现在,我们可以看到这些数字——你的交易系统,或者预测模型和给定的交易策略之间的相互作用,在一套完整的历史市场数据上表现如何?
在这里,步骤2(模型训练)中使用的测试集可以成为调优策略参数的验证集。
遗传算法可以让你探索政策空间,从第一代的100个随机选择的政策参数开始,迭代地剔除80个最差的执行者,让20个幸存者每人产生4个后代。
或者,您可以在多维参数空间中使用网格搜索:从策略参数的一些看似合理的值开始,您可以通过逐一改变参数值来达到最优设置。
您在这里的性能评价是您最终希望在交易策略中优化的,例如PnL或一些导出量,如投资回报、夏普比率(sharperation)、风险价值、Beta系数等等,参见图5。
图5 PnL和夏普比率用于各种交易策略
防止将参数过度拟合到验证集的一个很好的方法是交叉验证,它使用“向前测试”(WTF:Walk-Forward-Test)来验证您方法的鲁棒性:优化验证段上的策略参数,在验证段之后的数据上及时测试它们,将验证段向前移动,以包含测试数据,重复。这里的基本假设是,最近的过去比更遥远的过去更能衡量未来。
5. 模拟和实盘交易
在您的策略上线之前,冻结所有系统参数和实时测试,就好像实际上是根据您的交易算法的输出来排列您的订单一样。这一重要步骤被称为纸交易,是检验你方法有效性的关键试金石。
你可能会注意到,在你的历史数据中,你实际上使用的值在给定的时间内是不可能达到的,例如计算移动平均值。如果你的策略看起来仍然很有希望,恭喜你——是时候去上线了!虽然您可以从手动下单开始,但不要低估了将您的策略与交易API结合在一起的管理和技术能力。
实际应用中存在的问题
这里展示的典型工作流程有一些严重的缺点:
对于衍生品合约,如基础上的期货,历史数据通常会报告一天的收盘价或选择的时间间隔和结算价格,这是在区间内实现的所有交易中合同的平均价格。但这不大可能是你可以通过购买或卖出订单的价格,根据订单数量的动态不同,在不同的价格/要价水平上有不同的交易量。所以你的模型预测从第2步开始,是指理论价格,但很可能不是你要下注的价格。
更详细的建模方法需要考虑到订单簿的实际结构和动态。
开发策略(步骤3)不是基于机器学习的模型的一部分,而是由直觉、经验或简单的启发式指导的手工过程。当模型预测价格上涨时,你会下一个购买订单(“长线”)。
但是你买了多少量?你使用什么置信度阈值?面对不利的市场环境,你能坚持多久?
反馈来得很晚:在你第一次看到你的策略的表现之前,你需要经历第1-3步。
预测模型和策略的参数是独立优化的,即使模型和策略实际上是相互关联的。
在这个框架中探索策略参数的空间是通过低效的数值优化来完成的,而不是通过对预测机器学习模型的强大梯度优化。
强化学习的框架整合了上面的步骤2和步骤3,将交易建模为一个代理(交易者)与环境(市场、订单簿)的交互,通过其操作(下订单)来优化奖励(如返回)。
虽然还处于早期阶段,但最近的研究表明,这是一个值得探索的途径——“需要做进一步的研究”。
后记
参见维基百科,关于“限量及交易”机制的广泛讨论,以及关于欧盟市场框架的更具体信息的维基百科。史密斯,环境经济学(牛津大学出版社,2011),对市场环境政策的历史和影响进行了很好的介绍:
欧盟市场(EU ETS)维基链接:
https://en.wikipedia.org/wiki/European_Union_Emission_Trading_Scheme
排污权交易(Emissions Trading)维基链接:
https://en.wikipedia.org/wiki/Emissions_trading
Denny Britz的博客文章更详细地介绍了订单簿的机制,以及算法交易中强化学习方法的前景:
Denny Britz’ 博客地址 :
http://www.wildml.com/2018/02/introduction-to-learning-to-trade-with-reinforcement-learning/
原文标题:A Machine Learning framework for Algorithmic trading on Energy markets
原文链接:https://towardsdatascience.com/https-medium-com-skuttruf-machine-learning-in-finance-algorithmic-trading-on-energy-markets-cb68f7471475
【关于投稿】
如果大家有原创好文投稿,请直接给公号发送留言。
① 留言格式:
【投稿】+《 文章标题》+ 文章链接
② 示例:
【投稿】《不要自称是程序员,我十多年的 IT 职场总结》:
http://blog.jobbole.com/94148/
③ 最后请附上您的个人简介哈~
看完本文有收获?请转发分享给更多人
关注「Python开发者」,提升Python技能