用于金融时序预测的神经网络:可改善经典的移动平均线策略

近日,Medium 上出现了一篇题为《Neural networks for algorithmic trading: enhancing classic strategies》的文章,作者 Alex Honchar 在文章中通过一个实际预测用例总结了金融时序预测,并通过神经网络真正改善了经典的移动平均交易策略,提高了最终预测结果。

在之前的 5 篇教程中,我们讨论了用于金融预测的人工神经网络,比较金融时序预测的不同架构,意识到如何通过正确的数据处理和正则化实现充分的预测,执行基于多变量时序的预测,并取得了非常好的波动率(volatility)预测结果,以及自定义损失函数的实现。在第 6 篇教程中,我们借助不同来源的数据进行设置和实验,用一个神经网络完成两个任务,优化超参数从而实现更优预测。

今天,我想借助一个实际的预测用例,对金融时序预测做个总结:我们将使用神经网络改善经典的移动平均线策略,证明它可以真正提升最后的结果,并介绍了一些大家可能感兴趣的新的预测目标。

以下是之前的 6 篇教程:

  • 简单的时序预测:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-part-one-simple-time-series-forecasting-f992daa1045a
  • 正确的一维时序+回溯测试:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589
  • 多变量时序预测:https://medium.com/@alexrachnog/neural-networks-for-algorithmic-trading-2-1-multivariate-time-series-ab016ce70f57
  • 波动率预测与自定义损失:https://codeburst.io/neural-networks-for-algorithmic-trading-volatility-forecasting-and-custom-loss-functions-c030e316ea7e
  • 多任务与多模态学习:https://becominghuman.ai/neural-networks-for-algorithmic-trading-multimodal-and-multitask-deep-learning-5498e0098caf
  • 超参数优化:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-hyperparameters-optimization-cb2b4a29b8ee 你可以在 Github 查看神经网络训练的代码:https://github.com/Rachnog/Deep-Trading/blob/master/strategy/skew.py。

主要思想

如上所述,我们能够预测完全不同的值,从股价变化到波动率。过去我们把这些预测看作是抽象的,甚至试图仅根据这些「上下」变动的预测进行交易。但是我们也知道,存在基于技术分析和金融指标的其他大量交易策略。比如,我们可以建立不同窗口的移动平均线(一个是长线,比如说 30 天,另一个是短线,很可能是 14 天),我们认为交叉点即代表趋势改变的时刻:

两条移动平均线交叉的示例

但是这一交易策略有个主要的缺点:在平滑区域,我们依然在那些无实际变化的点上做交易,从而遭受金钱损失。

平滑区域中移动平均线交叉的示例

我们如何通过机器学习解决这一问题?

让我们看看下面的策略假设:我们在移动平均线交叉处预测某些特征的变化。如果出现一个跳跃,我们便将其作为交易信号;否则就跳过它,因为我们不想在平滑区域损失钱。

我想尝试把偏度(skewness)作为预测目标,偏度即度量分布非对称性的指标。假设我们预测分布出现变化,这意味着当前的趋势(不只是平滑区域)将在未来发生改变。

image.png

分布偏度

输入数据

这里我们使用 pandas 和 PyTi 来生成更多指标,并将其作为输入。我们将使用 MACD、Ichimocku cloud、RSI、波动率等。所有这些值将形成多变量时序,并逐渐变得平滑,以方便之后在 MLP 中使用,或者停留在 CNN/RNN。

nine_period_high = pd.rolling_max(pd.DataFrame(highp), window= ROLLING / 2) nine_period_low = pd.rolling_min(pd.DataFrame(lowp), window= ROLLING / 2) ichimoku = (nine_period_high + nine_period_low) /2 ichimoku = ichimoku.replace([np.inf, -np.inf], np.nan) ichimoku = ichimoku.fillna(0.).values.tolist() macd_indie = moving_average_convergence(pd.DataFrame(closep)) wpr = williams_percent_r(closep) rsi = relative_strength_index(closep, ROLLING / 2) volatility1 = pd.DataFrame(closep).rolling(ROLLING).std().values#.tolist()volatility2 = pd.DataFrame(closep).rolling(ROLLING).var().values#.tolist()volatility = volatility1 / volatility2 volatility = [v[0] for v in volatility] rolling_skewness = pd.DataFrame(closep).rolling(ROLLING).skew().values rolling_kurtosis = pd.DataFrame(closep).rolling(ROLLING).kurt().values

我把获取的指标特征和 OHLCV 元组串联起来,以生成最终向量。

网络架构

这里,我想展示如何训练正则化 MLP 用于时序预测:

main_input = Input(shape=(len(X[0]), ), name='main_input') x = GaussianNoise(0.05)(main_input) x = Dense(64, activation='relu')(x) x = GaussianNoise(0.05)(x) output = Dense(1, activation = "linear", name = "out")(x) final_model = Model(inputs=[main_input], outputs=[output]) opt = Adam(lr=0.002) final_model.compile(optimizer=opt, loss='mse')

这里比较新奇的地方在于向输入和神经网络单个层的输出中添加了小噪声。这样神经网络的运行和 L2 正则化类似,其数学解释请参见 https://www.deeplearningbook.org。

示例来自 http://www.deeplearningbook.org/contents/regularization.html

神经网络按照常规方式进行训练,我们来检查一下偏度预测如何改善(不改善)移动平均线策略(moving averages strategy)。

我们基于 2012 到 2016 年的 AAPL 价格训练神经网络,然后在 2016-2017 年的数据上进行测试(测试教程:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589)。

训练完成后,我绘制了收盘价、移动平均线和交叉点处的垂直线:红线和橙线是我们想要进行交易的点,绿线是我们不想进行交易的点。看起来并不完美,我们用回溯检验的方法来判断。

哪一种移动平均线交叉(moving average intersection)有用?

未使用神经网络的结果

我使用这篇文章(https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589)介绍的回溯测试方法进行操作,下面是一些关键度量和图:

[(『总收益率』, 『1.66%』),

(『夏普指数』, 『16.27』),

(『最大回撤』, 『2.28%』),

(『回撤时间』, 『204』)]

Signals: 9

Orders: 9

Fills: 9

滑动平均策略(rolling mean strategy)的回溯测试结果

使用神经网络的结果

我们只使用「红色」和「橙色」交易信号,跳过绿色交易信号。我们可以看到,这样的策略少进行了 2 次交易,帮助我们稍微减少首次回落,且最终收益几乎是原来的两倍!

[(『总收益率』, 『3.07%』),

(『夏普指数』, 『27.99』),

(『最大回撤』, 『1.91%』),

(『回撤时间, 『102』)]

Signals: 7

Orders: 7

Fills: 7

使用神经网络的策略的回测测速结果。

可能的改进

看起来这个想法有点作用呢!我还想介绍一些可能有效的改进,大家可以自己试一下:

不同的指标策略:MACD、RSI

将能够极好优化的交易策略与提出的方法相结合。

试着预测不同的时序特征:赫斯特指数(Hurst exponent)、自相关系数(autocorrelation coefficient),或者其他的统计动差(statistical moment)。

这篇文章介绍了如何使用神经网络实现金融时序预测,也暂时完结了该系列教程。坦白讲,我们无法使用神经网络来预测价格趋势。

我们考虑不同的数据源和目标,认真处理过拟合和优化超参数。我们得出的结论是:

处理过拟合时要小心!99% 的案例都需要处理过拟合,如果准确率达到 80% 就不要相信了,肯定是哪里出错了……

尝试使用收盘价或收益以外的其他因素,比如波动率、偏度等。

如果你有不同的数据源,那就使用多模态学习。

不要忘记找出合适的超参数!

创建一个由多个经典策略组合而成的策略,并将其建立在机器学习之上,然后再进行回溯测试。

原文发布于微信公众号 - 人工智能LeadAI(atleadai)

原文发表时间:2018-01-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏达观数据

达观数据推荐算法实现:协同过滤之item embedding

推荐系统本质是在用户需求不明确的情况下,解决信息过载的问题,联系用户和信息,一方面帮助用户发现对自己有价值的信息,另一方面让信息能够展现在对它感兴趣的用户面前,...

3706
来自专栏SnailTyan

Dilated Convolutions——扩张卷积

1. 扩张卷积 Dilated Convolutions,翻译为扩张卷积或空洞卷积。扩张卷积与普通的卷积相比,除了卷积核的大小以外,还有一个扩张率(dilati...

2870
来自专栏机器学习之旅

基于Tensorflow的神经网络解决用户流失概率问题

注意,已经很多很多人和我说最后的loss不变,大家的数据都不一样,如果发现loss不变请降低learning_rate = 1e-6,就可以解决,还有问题的话,...

583
来自专栏TonyZhou的专栏

CTR 预估模型的进化之路

笔者对各大厂商 CTR 预估模型的优缺点进行对比,并结合自身的使用和理解,梳理出一条 CTR 预估模型的发展脉络,希望帮助到有需要的同学。

8.3K3
来自专栏AI科技大本营的专栏

如何一夜暴富?这里有一份比特币价格预测指南

图片来源:Hacker News 翻译 | AI科技大本营(rgznai100) 参与 | 王赫 编辑 | Donna 近年来,以比特币为代表的加密数字货币一直...

3152
来自专栏CDA数据分析师

如何利用机器学习进行海量数据挖掘

互联网的海量数据不可能靠人工一个个处理,只能依靠计算机批量处理。最初的做法是人为设定好一些规则,由机器来执行。但特征一多规则就很难制定,即使定下了规则也没法根据...

1847
来自专栏人工智能LeadAI

基于Tensorflow的神经网络解决用户流失概率问题

前言 用户流失一直都是公司非常重视的一个问题,也是AAARR中的Retention的核心问题,所以各大算法竞赛都很关注。比如最近的:KKBOX的会员流失预测算法...

50114
来自专栏小小挖掘机

推荐系统遇上深度学习(十九)--探秘阿里之完整空间多任务模型ESSM

阿里近几年公开的推荐领域算法有许多,既有传统领域的探索如MLR算法,还有深度学习领域的探索如entire-space multi-task model,Deep...

1104
来自专栏大数据文摘

论文Express | 美图云+中科院AAAI2018:视频语义理解的类脑智能

872
来自专栏琦小虾的Binary

背景提取算法——帧间差分法、背景差分法、ViBe算法、ViBe+算法

背景提取算法——帧间差分法、背景差分法、ViBe算法、ViBe+算法 背景提取是在视频图像序列中提取出背景,背景就是场景中静止不动的景物。因为摄像机不动,因此图...

46010

扫描关注云+社区