经过两周的试验,神经网络的尝试算是有了初步的结论(体会)。做了一个专家组形式的预测系统(或者唬人点叫强分类器?),专家组包含6个神经网络,各自提供预测,最后得到汇总的结果。这个文章分享的,应算是最关键的东西了。如果不嫌弃,欢迎转载,注明出自turnal博客就好啦。
买了本《matlab神经网络30个案例分析》作为参考。作为一本快速参考的书籍,确实不错。matlab做神经网络真是太方便了。下面简要介绍一下我最近的尝试,过程包括两个主要部分,数据提取和网络测试。
1. 数据提取。想要得到好的结果,模型的选择和相应的数据提取是关键。其次是选择合适的神经网络结构。如果模型是根本错误的,什么结构都不管用(也许不能排除瞎猫碰上死耗子的情况,但是概率太低太低)。我的理念比较简单,从过去的价格变化预测较短期未来的趋势。提取的是价格变化,而不是价格本身。为了过滤随机毛刺,同时尽量贴近k线走势,使用移动3日平均。
数据设计:
【A】最近7个的MA(3)(3日移动平均)变化历史,例如,今日MA(3) - 昨日MA(3)则为最近一个变化,前一个变化即 昨日MA(3) - 前日MA(3)。以此类推。
【B】除去7个上一数据已经覆盖的k线,再选取5个粗MA(3)变化率。粗MA(3)计算方法为,当日MA(3) - N日前MA(3)。如此就能再覆盖5 x N 个k线。这主要是为了能大致反映过往走势,又不会让数据变得过于庞大。输入数据维数过于庞大,会增加网络复杂度,主要问题不在于会增加网络训练时间,而是当输入数据维数太大,而结果样本就会显得相对较少。虽然网络训练花费更多时间,但其实它更容易得到糊弄人的结果。
【C】今日最低价,最高价,收盘价与今日MA(3)的差
【D】这部分是供预测的值。一个代表接下来2天MA(3)是否连续走高,1表示走高,-1表示其中至少一天走低。另一个代表未来2天MA(3)是否连续走低,-1表示走低,1表示至少一天走高。这样做的目的是降低网络的训练难度。如果它真能判断接下来的涨跌,我们再考虑让它判断更精确的诸如下一个收盘价之类的东西。
网络结构:
BP神经网络。这个纯粹是实验经验。假设价格走势真的有某种隐含的规律,并且能反映到提取的数据里,那么选择不同的神经网络不应该产生太大的差距。有些曲线拟合能力很强,理论上可以拟合任何曲线、结果的网络,在价格时间序列预测中不适宜直接应用。因为无论如何,价格波动随机成份都是非常大。这种可以无限拟合历史数据的,其实是用了非常多的自由度去迎合历史。类似超级富豪把彩票组合全部买下来,必然能中奖。但是他提供的彩票选号建议没有任何作用。
专家组:
共6个网络,3个预测【D】数据上涨部分,3个预测【D】数据下跌部分。如果6个输出均是-1,则代表下跌概率很大(严格讲是MA(3)的下跌),反之输出都是+1,则代表上涨概率很大。
测试结果:
3个预测上涨的,单个正确率约75%,整体正确率约为80%
3个预测下跌的,单个正确率约75%,整体正确率约为80%
反应快的人也许马上看出问题。如果单个正确率是70%,组合起来的正确率不该这么低。这三个网络,隐藏层的节点数目不同,独立训练,并没有沟通,为什么会如此一致?这主要是使用移动平均导致的“明显规律”。具体原因读者可以思考下。