近日,一篇名为《Neural networks for algorithmic trading: enhancing classic strategies》的文章出现在Medium上,作者AlexHonchar通过一个实际的预测用例Forecasting总结了金融时间序列,神经网络的使用确实改进了经典的移动平均策略,改进了最终的预测结果。在之前的教程中,我们讨论了用于金融预测的人工神经网络,比较了金融时间序列预测的不同架构,实现了如何通过适当的数据处理和正则化来实现充分的预测,进行了基于多变量时间序列的预测,并取得了非常好的波动率预测结果,以及自定义损失函数的实现。在第六篇教程中,我们设置并试验了不同来源的数据,使用神经网络完成两项任务,并优化超参数以实现更好的预测。今天,我想借助一个实际的预测用例来总结一下金融时间序列预测:我们将使用神经网络来改进经典的移动平均策略,证明它确实可以提高***的结果,并介绍一些您可能会觉得有趣的想法。一个新的感兴趣的预测目标。以下是之前的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),它是分布不对称性的度量,作为预测的目标。假设我们预测分布发生变化,这意味着当前趋势(不仅仅是平滑区域)将在未来发生变化。DistributionSkewnessInputData这里我们使用pandas和PyTi来生成更多的指标作为输入。我们将使用MACD、Ichimocku云、RSI、波动率等。所有这些值将形成一个多变量时间序列,逐渐平滑以供以后在MLP中使用,或者卡在CNN/RNN中。nine_period_low=pd.rolling_min(pd.DataFrame(lowp),window=ROLLING/2)ichimoku=(nine_period_high+nine_period_low)/2ichimokuichimoku=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/volatility2volatility=[v[0]forvinvolatility]rolling_skewness=pd.DataFrame(closep).rolling(ROLLING).skew().valuesrolling_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神经网络以常规方式训练,让我们检查一下偏度预测如何改进(不改进)移动平均策略。我们根据2012年到2016年的AAPL价格训练了一个神经网络,然后在2016-2017年的数据上对其进行了测试(测试教程:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589)。训练完成后,我绘制了收盘价、移动平均线和交叉点的垂直线:红色和橙色线是我们想要交易的点,绿色线是我们不想交易的点.看起来不完美,我们用回测的方法来判断。哪个移动平均线交点有用?不使用神经网络的结果我使用了这篇文章(https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-1-2-correct-time-series-forecasting-backtesting-9776bfd9e589),以下是一些关键指标和图表:[('TotalReturn','1.66%'),('SharpeRatio','16.27'),('MaxDrawdown','2.28%'),('DrawdownDuration','204')]信号:9订单:9成交:9滚动均值策略的回测结果使用神经网络的结果,我们仅使用“红色”和“橙色”交易信号,跳过绿色交易信号。我们可以看到,该策略减少了2笔交易,帮助我们略微减少了回调,最终几乎使我们的回报翻了一番![('TotalReturn','3.07%'),('SharpeRatio','27.99'),('MaxDrawdown','1.91%'),('DrawdownDuration','102')]信号:7Orders:7Fills:7backtestresultsforstrategiesusingneuralnetworkspossible这个想法似乎有些效果!我还想介绍一些可能有效的改进,您可以自己尝试:不同的指标策略:MACD、RSI将出色优化的交易策略与建议的方法相结合尝试预测不同的时间序列特征:Hurst指数、自相关系数或其他统计矩本篇介绍如何使用神经网络实现金融时间序列预测,也是暂时完成本系列教程。坦率地说,我们不能使用神经网络来预测价格趋势。我们考虑不同的数据源和目标,谨慎处理过度拟合并优化超参数。我们的结论是:处理过拟合时要小心!99%的case都需要处理过拟合,别信了你得到80%的准确率,出问题了。。。试试用收盘价或者返回其他因素,比如波动率,偏度等。如果你有不同的数据来源,然后使用多模态学习。不要忘记找出正确的超参数!创建一个结合了几种经典策略的策略,并在回测之前将其构建在机器学习之上。原文:https://medium.com/machine-learning-world/neural-networks-for-algorithmic-trading-enhancing-classic-strategies-a517f43109bf【本文为机器之心专栏原文翻译,微信公众号《机器之心(id:almosthuman2014)》】点此阅读作者更多好文
