近日,Medium 上出现了一篇题为《Neural networks for algorithmic trading: enhancing classic strategies》的文章,作者Alex Honchar在文章中通过一个实际预测用例总结了金融时序预测,使用神经网络真正改善了经典的移动平均线策略,提高了最终预测结果。
创新互联是一家以网络技术公司,为中小企业提供网站维护、网站设计制作、做网站、网站备案、服务器租用、申请域名、软件开发、小程序设计等企业互联网相关业务,是一家有着丰富的互联网运营推广经验的科技公司,有着多年的网站建站经验,致力于帮助中小企业在互联网让打出自已的品牌和口碑,让企业在互联网上打开一个面向全国乃至全球的业务窗口:建站联系热线:18980820575
在之前的 教程中,我们讨论了用于金融预测的人工神经网络,比较金融时序预测的不同架构,意识到如何通过正确的数据处理和正则化实现充分的预测,执行基于多变量时序的预测,并取得了非常好的波动率(volatility)预测结果,以及自定义损失函数的实现。在第6篇教程中,我们借助不同来源的数据进行设置和实验,用一个神经网络完成两个任务,优化超参数从而实现更优预测。
今天,我想借助一个实际的预测用例,对金融时序预测做个总结:我们将使用神经网络改善经典的移动平均线策略,证明它可以真正提升***的结果,并介绍了一些大家可能感兴趣的新的预测目标。
以下是之前的 6 篇教程:
你可以在 Github 查看神经网络训练的代码:
https://github.com/Rachnog/Deep-Trading/blob/master/strategy/skew.py。
主要内容
如上所述,我们能够预测完全不同的值,从股价变化到波动率。过去我们把这些预测看作是抽象的,甚至试图仅根据这些「上下」变动的预测进行交易。但是我们也知道,存在基于技术分析和金融指标的其他大量交易策略。比如,我们可以建立不同窗口的移动平均线(一个是长线,比如说 30 天,另一个是短线,很可能是 14 天),我们认为交叉点即代表趋势改变的时刻:
两条移动平均线交叉的示例
但是这一交易策略有个主要的缺点:在平滑区域,我们依然在那些无实际变化的点上做交易,从而遭受金钱损失。
平滑区域中移动平均线交叉的示例
我们如何通过机器学习解决这一问题?
让我们看看下面的策略假设:我们在移动平均线交叉处预测某些特征的变化。如果出现一个跳跃,我们便将其作为交易信号;否则就跳过它,因为我们不想在平滑区域损失钱。
我想尝试把偏度(skewness)作为预测目标,偏度即度量分布非对称性的指标。假设我们预测分布出现变化,这意味着当前的趋势(不只是平滑区域)将在未来发生改变。
分布偏度
输入数据
这里我们使用 pandas 和 PyTi 来生成更多指标,并将其作为输入。我们将使用 MACD、Ichimocku cloud、RSI、波动率等。所有这些值将形成多变量时序,并逐渐变得平滑,以方便之后在 MLP 中使用,或者停留在 CNN/RNN。
- nine_period_low = pd.rolling_min(pd.DataFrame(lowp), window= ROLLING / 2)
- ichimoku = (nine_period_high + nine_period_low) /2
- ichimokuichimoku = ichimoku.replace([np.inf, -np.inf], np.nan)
- ichimokuichimoku = 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(optoptimizer=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)介绍的回溯测试方法进行操作,下面是一些关键度量和图:
滚动平均策略(rolling mean strategy)的回溯测试结果
使用神经网络的结果
我们只使用「红色」和「橙色」交易信号,跳过绿色交易信号。我们可以看到,这样的策略少进行了 2 次交易,帮助我们稍微减少***回落,且最终收益几乎是原来的两倍!
使用神经网络的策略的回溯测试结果
可能的改进
看起来这个想法有点作用呢!我还想介绍一些可能有效的改进,大家可以自己试一下:
这篇文章介绍了如何使用神经网络实现金融时序预测,也暂时完结了该系列教程。坦白讲,我们无法使用神经网络来预测价格趋势。我们考虑不同的数据源和目标,认真处理过拟合和优化超参数。我们得出的结论是:
原文:
https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-enhancing-classic-strategies-a517f43109bf
【本文是专栏机构“机器之心”的原创译文,微信公众号“机器之心( id: almosthuman2014)”】
戳这里,看该作者更多好文
网站栏目:用于金融时序预测的神经网络:可改善移动平均线经典策略
浏览地址:http://www.csdahua.cn/qtweb/news4/250454.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网