|
|
原码奉献,希望楼主搞出点东东来!:*19*:
{版权所有:嘉兴·陈(uuxp.com),Mail:cyouwei@zj.com
本人不是做编程的,也不是搞神经网络的,不过是一时兴起,研究了小波分析和神经网络,
还有Matlab7编程,了解了一些基础知识,根据网上的一些免费源码,按照自己对Bp神经网络的理解,
改用飞狐的函数写出了下面的代码。虽然本人尽了最大的努力,但是仍旧不能完全保证此程序没有BUG,
也不能保证我已完全理解并运用前向网络和误差反传的精髓;我只是试图尽量接近原本,
尽量使用精简的飞狐代码完成基本相同的事情。如有发现BUG或者更好的建议,请发邮件给我。
任何人,只要不做商业用途,可以任意复制、转载、修改、完善本页代码,但请注明原有版权。
三层网络:输入层节点数=4,输出层节点数=1,隐含层节点数=隐含层
Sigmoid,Purelin,Trainlm
有一点是使用本公式的人必须了解的,神经网络是处理非线性数据的很好工具,股价波动我们认为是非线性的,
使用BPNN处理股价,每次学习循环都会得到一个不同的结果,所以不要指望同样的数据能够得到完全相同的结果,
要做的是,根据误差值和学习的结果做出预测准确程度的判断。}
INPUT: 数据类型(4,1,4,1),隐含层(3,2,20,1),学习次数(2,1,100,1);
VARIABLE: 样本数=100, 首K线=DATACOUNT-样本数-3;
IF 首K线 < 1 THEN BEGIN
DRAWTEXTEX(ISLASTBAR,0,10,20,'股票上市时间太短,Κ线数量不足');
EXIT; {数据不足,直接退出}
END;
VARIABLE: 数据=IF(数据类型=4,C,IF(数据类型=2,H,IF(数据类型=3,L,O))), 最大=HHV(数据,样本数+3);
VARIABLE: 预测[4]=0, 权值学习率=0.02, 阀值学习率=0.02, EPOCH=0, POS=0, I=0, J=0;
VARIABLE: 权值1[隐含层*4]=RAND(10000)/10000-0.5, 权值2[隐含层]=RAND(10000)/10000-0.5;
VARIABLE: 输出2[隐含层]=0, 阀值2[隐含层]=RAND(10000)/10000-0.5, 德特2[隐含层]=0;
VARIABLE: 输出3[样本数]=0, 阀值3=RAND(10000)/10000-0.5, 德特3=0, 误差=0, 要求误差=0.2;
数据:=数据/最大*2-1; {数据归一化}
FOR EPOCH=1 TO 学习次数*10 DO BEGIN {网络学习}
误差:=0;
FOR POS=1 TO 样本数 DO BEGIN
FOR J=1 TO 隐含层 DO BEGIN
西格玛:=0;
FOR I=1 TO 4 DO 西格玛:=西格玛+数据[首K线+POS+I-2]*权值1[(J-1)*隐含层+I];
输出2[J]:=1/(1+EXP(-西格玛-阀值2[J])); {隐含层输出}
END;
西格玛:=0;
FOR J=1 TO 隐含层 DO 西格玛:=西格玛+输出2[J]*权值2[J];
输出3[POS]:=西格玛-阀值3; {学习结果,输出层输出}
德特3:=数据[首K线+POS+3]-输出3[POS];
误差:=误差+德特3*德特3; {计算误差}
FOR J=1 TO 隐含层 DO BEGIN
权值2[J]:=权值2[J]+权值学习率*德特3*输出2[J]; {调整权值}
德特2[J]:=德特3*权值2[J]*输出2[J]*(1-输出2[J]);
FOR I=1 TO 4 DO 权值1[(J-1)*隐含层+I]:=权值1[(J-1)*隐含层+I]+权值学习率*德特2[J]*数据[首K线+POS+I-2];
END;
阀值3:=阀值3+阀值学习率*德特3; {调整阀值}
FOR J=1 TO 隐含层 DO 阀值2[J]:=阀值2[J]+阀值学习率*德特2[J];
END;
误差:=误差/2;
IF 误差<=要求误差 THEN BREAK; {误差达到要求就退出,避免过度学习}
END;
{版权所有:嘉兴·陈(uuxp.com),QQ:110036737,Mail:cyouwei@zj.com}
FOR POS=1 TO 4 DO 预测[POS]:=数据[首K线+样本数-1+POS]; {取预测数据}
FOR POS=1 TO 样本数 DO 数据[首K线+POS+3]:=输出3[POS]; {返回学习结果}
FOR POS=1 TO 5 DO BEGIN {进行预测,共5个结果}
FOR J=1 TO 隐含层 DO BEGIN
西格玛:=0;
FOR I=1 TO 4 DO 西格玛:=西格玛+预测[I]*权值1[(J-1)*隐含层+I];
输出2[J]:=1/(1+EXP(-西格玛-阀值2[J]));
END;
西格玛:=0;
FOR J=1 TO 隐含层 DO 西格玛:=西格玛+输出2[J]*权值2[J];
输出3[POS]:=西格玛-阀值3;
FOR I=1 TO 3 DO 预测[I]:=预测[I+1]; {更换预测数据,提供下一次simulate}
预测[I]:=输出3[POS];
END;
BPNN: (数据+1)/2*最大,COLORYELLOW; {学习结果}
{MABP: MA((数据+1)/2*最大,5);} {也可以做适当的平均}
误差值: 误差,COLORGRAY,LINETHICK0; {误差,要求不要过大或者过小;下面是预测结果}
DRAWTEXT(ISLASTBAR,(输出3[1]+1)/2*最大,'·'),ALIGN0,SHIFT1,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3[2]+1)/2*最大,'·'),ALIGN0,SHIFT2,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3[3]+1)/2*最大,'·'),ALIGN0,SHIFT3,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3[4]+1)/2*最大,'·'),ALIGN0,SHIFT4,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3[5]+1)/2*最大,'·'),ALIGN0,SHIFT5,COLORMAGENTA,PXUP8; |
|
|