突发奇想想写一个神经网络的策略,于是随便找了一支股票用 python 实现了一下,股票和特征都有限,仅作为参考,有空还会尝试下全部股票池的策略和加入更多的因子作为特征,特别地,由于我经常犯未来函数的错误,希望大家帮我检查下。所谓神经网络就是多个特征交叉影响结果的数据统计模型,因为 python 有直接的包,具体细节就不说了。本文用的是 pybrain 的包,虽然用的算法比较慢,但是比较灵活简单。
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')
import seaborn as sns
sns.set_style('white')
因为铜币不够导致篇幅有限,余下的请看:
https://uqer.io/community/share/57a883b3228e5b9b98a88f24本文选的是 000001.XSHE 平安银行这只股票(就只是单纯随便选而已),选取了波动率指标: EMV ,短期和长期均线指标: EMA5 和 EMA60 , MA5 和 MA60 ,动量和反转指标: REVS5 和 REVS20 ,成交量指标: VEMA5 ,财务指标: PE ,能量指标: Elder ,这 12 个指标作为输入值,下一日股票的涨跌幅作为输出值。
考虑到样本的容量需要保证,但是太久远的数据可能参考性不大,本文选取 2012-2015 这三年的输入和输出总共 627 组样本作为训练集。
因为铜币不够导致篇幅有限,余下的请看:
https://uqer.io/community/share/57a883b3228e5b9b98a88f24这里对数据进行了中心化处理,保证不同参数的可比性。
这里定义了 Sigmoid 函数其作用是将取值为 R 的输入映射到[-1,1]上,以满足神经网络模型的输入需要。
这一步是训练模型,本文设定的模型除了输入和输出层外,含有两个隐藏层,每个隐藏层含有 13 个单元,并且设定了迭代次数为 500 次,理论上迭代次数应该越多越好,但实际上后面的迭代带来的误差缩小已经微乎其微。
另外这里的 momentum 的大小是解跳出局部最优的步长,太大就很难收敛,太小就容易陷入局部最优。 weightdecay 指的是单次权重改变的步长,太大也会不容易收敛,太小就比较慢。
此模型训练结果每次都不一样,可以多训练几次找到误差相对较小的保存下来。
话不多说,上图咯
本文选取 2015-2016 年作为测试集,将模型用于测试集的效果,可以看出还是有一定的跟踪效果的。
这是买入卖出信号,红色表示买入,绿色表示卖出。
这是策略的回测结果,可见策略在股市平稳波动是效果较好,而出现突发性的上涨和下跌是效果较差。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/309368
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.