0.概述
2NDN神经网络建模仿真工具是一个可视化的神经网络建模应用开发平台,她基于可连接组件的模块化结构实现,可扩展性极强,可用于各种行业的运营管理和系统分析 ,尤其是生产效率改善的有效工具。在企业、学校和政府机构得到广泛应用,尤其适合高校建立系统仿真实验室。
> 以下通过一个案例--快速构建基于时间序列的股票预测模型为例,详细介绍2NDN的操作步骤。
1.案例说明
股票趋势预测代表经济预测中的一种特定类型,它具有其独有的特点。因为实际操作中我们不需要准确地知道下一天的收盘价,只需知道被观测市场的走向(升或降),从而用来决定我们的交易操作(长期/短期-买入/卖出)。我们所希望的是利用历史价格数据预测将来中短期(从2到10或15天)内的价格走势。因而我们的神经网络也不需要预测下一个交易日的准确收盘价,我们从预测的趋势上去发现我们的交易策略。
换句话说,我们需要预测的是市场的拐点。请看下图:
这是一只股票的日K曲线,我们要成功进行股市操作就要根据红色箭头来交易,在最低点买进,在最高点卖出。一个好的交易系统应当只是真正的拐点出现时给出提示,避免生成虚假信号,例如,象篮色箭头所指部分,市场只下降了几个百分点就马上又继续上升。
可见,我们所要设计的神经网络不需要预测市场的日准确收盘价,我们只对正确预测拐点感兴趣。
2.神经网络建模
打开2ndn神经网络设计工具,在主界面中通过拖拉方式添加下图所示的图元,这样神经网络模型就建好了,2ndn会自动的随机设置连接的权系数。 当然这个网络目前还没有进行训练,没有任何实际的功能。
用户也可以直接打开随应用程序附带的示例程序,C:Program Files2NDNSampleFinancePreFinancePre.ser(假如系统安装在C:Program Files2NDN),选择文件FinancePre.ser后,示例程序则在主界面中打开,如下图所示:
下面对设计器中的各图元说明如下:
① Yahoo输入 (Input Data)
用于神经网络从yahoo接收金融市场得来的金融数据,设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
其中“符号”是指特定股票的代号。如600728.SS是指新太科技股份有限600728的股票。这个代号必须是由Yahoo定义的代号。“时期”指从Yahoo获取股票市值的周期,‘Daily’获取每天收市记录的股票市值,‘Monthly’获取每月月初记录的股票市值,‘Yearly’获取每年年初记录的股票市值。
“选择列”可选:
第一列:Open
第二列:High
第三列:Low
第四列:Close
第五列:Volume
第六列:Adjusted close
对于特定的股票代码,你必须根据所需的列来设置"选择列"。如果你希望将open,high及volume列作为输入,则需将‘1-2,5’写到“选择列”。
其它设置参考2ndn帮助文档说明。
② 规范化 (DeltaNorm1)
在此对输入样本数据进行归一化处理,设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
说明:若输入最大/最小值设置为0,表示自动取相应节点的最大/最小值。
下图为经归一化处理后进行查验的结果:
③ Delay (Delay Input Layer)
这里,我们使用YahooFinance输入组件从Yahoo获取股票价格的时间序列,将其与一个延时层相连。设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
这个组件的属性面板中,除"行数"之外,还可以设置"taps值"参数,它是指我们用来提供给神经网络的时间窗口的大小。
如果设taps值为5,我们就得到一个尺寸为6的时间窗口,由下面的值组成:
[x(t), x(t-1), x(t-2), x(t-3), x(t-4), x(t-5)]
请记住时间窗口的尺寸等于taps+1,因为延时层还同时输出时间序列的当前值x(t)。
选中该图元,鼠标右键弹出快捷菜单,选"查验":
④ Sigmoid (Hidden Layer)
网络隐层, 设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
⑤ Sigmoid (Output Layer)
网络输出层,设置方法参见④。
⑥ 图表 (NetOutput)
这个组件用来在测试阶段显示出网络的预测结果曲线。设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
说明:X轴最大值要大于网络所使用的金融数据有天数。
⑦ 训练 (Teacher)
神经网络训练层,属性设置如下:
⑧ Yahoo输入 (Desired Data)
用于神经网络从yahoo接收金融市场得来的金融数据,用于生成训练网络的拐点信息。设置方法同" ① Yahoo输入 (Input Data) ",如下:
下图为经归一化处理后的结果:
⑨ 规范化 (DeltaNorm2)
在此对训练目标样本数据进行归一化处理,设置方法同"② 规范化 (DeltaNorm1)"。
⑩ 拐点抽取 (TurningPnts)
生成用来训练网络的拐点信息,属性设置如下:
"最小改变率"属性用来指示两拐点之间的最小变化率,来生成相应的信号。它不能设置太小值,否则会生成太多的信号(其中很多都是错误信号)。
算法如下:
当市场价格上升超过期望的变化率时,前面一个低点就被标注为'买'信号,相应的输出值设为0。
当市场价格下降超过期望的变化率时,前面一个高点就被标注为'卖'信号,相应的输出值设为+1。
上述两点之间的日期对应的期望值以插值到0与+1的方式进行规范化。
⑾图表 (RMSE Error)
均方误差曲线,用来显示训练过程中的误差变化情况。设置方法:鼠标选中该图元,右键弹出快捷菜单,点击<属性>,弹出下面的对话框:
说明:X轴最大值要大于网络所使用的金融数据有天数。将"显示"设置为"True"时,将打开图表显示。
3、神经网络训练
我们使用2007-6-1到2007-8-1的数据训练网络:将两个yahoo输入插件的时间段都设为2007-6-1至2007-8-1。打开控制面板,设置学习率为0.3,动量常数为0.3,训练样本数为41(该值可通过查验样本得到),训练步数为1000次,均方误差为0.001,是否训练设置为True,是否验证设置为False,是否指导设置为True,预测学习数设置为6(该值为taps+1),是否均方误差设置为True。点击【运行】开始训练。控制面板上会显示训练的进度和收敛情况。如果权值参数选择不合理的话有可能造成网络不能收敛。这时可以选择【工具】->【初始化】,重新随机生成初始的权系数。
4、神经网络测试
网络训练完成后,就可以对生成的网络模型进行测试了,我们使用2007-7-1到2007-9-1的数据作为测试数据,对该时间段内的股票价格拐点进行预测,测试时,将两个yahoo输入插件的时间段都设为2007-7-1到2007-9-1。打开控制面板,设置测试样本数(这里为42),训练步数为1次,是否训练设置为False,是否验证设置为True。点击【运行】开始测试,预测结果将自动在图表插件中显示出来。
下面是2007-7-1到2007-9-1的股票实际价格走势:
下图是神经网络根据历史数据作出的拐点预测曲线:
可以看出,该网络模型能够将绝大部分的股票走势的拐点正确预测出来,效果非常理想。
5、高级应用(把完成训练的神经网络移植到第三方应用中)
为了在第三方应用程序中使用训练好的神经网络,可以把训练好的网络输出到文件中,然后在程序中读取这个文件,以实现对未知对象的预测。选择【文件】->【导出模型…】,把当前神经网络保存到文件中。然后就可以在程序中使用了。
下面是从文件中读取神经网络的代码:
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/2ndn/sample/FinancePre/FinancePre.snet"));
Object obj = ois.readObject();
System.out.println("obj is " + obj);
ois.close();
NeuralNet net = (NeuralNet) obj;
然后在程序中就可以使用了。