搜索
楼主: hhk

[大盘交流] 辛苦写了一个神经网络程序,效果不太好(如图)

 关闭 [复制链接]

发表于 2007-12-16 09:14 | 显示全部楼层

回复 #54 qiannong 的帖子

人脑在理论上绝对超过bp、rbf、art、hopfield、svm、som。。。

但是某些方面人脑绝对不如电脑,比如下面的计算你能很快算出来吗?

77888888 ^ 77 = ?

人脑不能,电脑瞬间完成。

神经网络也是如此。
金币:
奖励:
热心:
注册时间:
2007-12-14

回复 使用道具 举报

发表于 2007-12-16 09:56 | 显示全部楼层
原帖由 hhk 于 2007-12-15 10:53 发表

cyouwei你好,看了你的分析非常的好,我其实也是用的BP网络,拟合的好可能是因为数据前期归一处理的结果,其实神经网络的好坏完全是在于你怎样使用它,它绝不是神秘的水晶球可以预测未来,其实我一直认为不应 ...



楼主好像不曾公开网络结构,偶连源码都公开了。

三层bp网络:输入层神经元4个,输出层神经元1个,隐含层神经元3-4个,
输入层到隐含层使用logsig函数,隐含层到输出层使用线性函数,学习算法是梯度下降法。
学习率均公开,误差计算方法等。
输入数据是前4天的股价,输出是第5天的股价,未加入成交量数据。
归一化使用了比较简单的hhv函数求最高值,略去了比较繁琐的循环。

楼主设计的网络结构是怎样的?可否说出来听听?

另:
1、拟合结果怎么看?是否含有未来?
神经网络的拟合,包括小波分析和傅立叶变换,得到的曲线都是在现有给定的所有数据基础上得到的,不是按照时间顺序从前到后依次得到的,他是全部数据趋势的反应,也就是说t=1时刻的拟合数据也要受到t=2以后时刻数据的影响,所以应该从两方面看这个拟合结果:首先他是现有数据趋势的很好描述,其次从拟合结果没办法直接对未来做出判断,因为不是拟合结果影响未来、而是未来影响现在的拟合结果。这也是有一部分人说飞狐的fft函数是未来函数的原因,其实这些人大部分是根据经验得出的判断,很少有人真正了解其中的道理。
我的结论是试图从拟合直接找出未来的趋势,不现实,含有未来;做通道,有点大炮打蚊子的感觉;用小波分析做的通道更好,神经网络反倒不如小波分析。

2、输入数据的问题:
输入数据我认为可以选择任何你能够想得到的东西,ohlc都可以,v也可以,其他的任何相加相乘的都可以,有关也好,无关的也行,神经网络处理这个是优势,他会自动调整权值,无关的输入不会造成太大的影响。
所以不必太过关心输入数据的变化,价位和成交量应该是最基本的输入。

3、做分类有可能是一个可行的方法,也可以简单说,股价走成什么样子,未来就有多大的机会涨跌几个点位;我也是猜测,还未做到。用bp和rbf都可以做分类,但是要在人为分类的基础上做,局限性很大,不太可行,这方面竞争网络似乎可以担当,art有希望。
金币:
奖励:
热心:
注册时间:
2007-12-14

回复 使用道具 举报

签到天数: 1 天

 楼主| 发表于 2007-12-16 11:44 | 显示全部楼层
原帖由 乎乎 于 2007-12-16 09:56 发表



楼主好像不曾公开网络结构,偶连源码都公开了。

三层bp网络:输入层神经元4个,输出层神经元1个,隐含层神经元3-4个,
输入层到隐含层使用logsig函数,隐含层到输出层使用线性函数,学习算法是梯度下 ...

输入层神经元1个,输出层神经元1个,隐含层神经元30个,很简单没有什么隐瞒啊
金币:
奖励:
热心:
注册时间:
2003-7-3

回复 使用道具 举报

发表于 2007-12-16 11:48 | 显示全部楼层
搞成 一个  OPENSOURCE的项目把。。发挥大家的力量估计能搞出好程序来。
金币:
奖励:
热心:
注册时间:
2007-10-22

回复 使用道具 举报

发表于 2007-12-16 13:03 | 显示全部楼层
原帖由 hhk 于 2007-12-16 11:44 发表

输入层神经元1个,输出层神经元1个,隐含层神经元30个,很简单没有什么隐瞒啊





输入是时间,输出是股价?

还是输入是第一天股价,输出是第二天股价?

我觉得输入太少了,加上隐含层神经元太多,所以只能做函数逼近,无法泛化.
金币:
奖励:
热心:
注册时间:
2007-12-14

回复 使用道具 举报

发表于 2007-12-16 13:07 | 显示全部楼层
原帖由 巴菲特牛 于 2007-12-16 11:48 发表
搞成 一个  OPENSOURCE的项目把。。发挥大家的力量估计能搞出好程序来。



源码早就有了一些,偶写的:

BP网络源码:

{三层网络:输入层节点数=4,输出层节点数=1,隐含层节点数=隐含层
Sigmoid,Purelin,Trainlm}
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.2, 阀值学习率=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
输出2[J]:=0;
FOR I=1 TO 4 DO 输出2[J]:=输出2[J]+数据[首K线+POS+I-2]*权值1[(J-1)*隐含层+I];
输出2[J]:=1/(1+EXP(-输出2[J]-阀值2[J])); {隐含层输出}
END;
输出3[POS]:=0;
FOR J=1 TO 隐含层 DO 输出3[POS]:=输出3[POS]+输出2[J]*权值2[J];
输出3[POS]:=输出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;
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
输出2[J]:=0;
FOR I=1 TO 4 DO 输出2[J]:=输出2[J]+预测[I]*权值1[(J-1)*隐含层+I];
输出2[J]:=1/(1+EXP(-输出2[J]-阀值2[J]));
END;
输出3[POS]:=0;
FOR J=1 TO 隐含层 DO 输出3[POS]:=输出3[POS]+输出2[J]*权值2[J];
输出3[POS]:=输出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;



RBF网络源码:

{输入层节点数=4,输出层节点数=1,隐含层节点数=隐含层,进行LBG处理}
INPUT: 数据类型(4,1,4,1),隐含层(4,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(数据,样本数+4);
VARIABLE: 预测[4]=0, 权值学习率=0.5, EPOCH=0, POS=0, 权值2[隐含层]=1, 输出2[隐含层]=0;
VARIABLE: 输出3[样本数]=0, 德特3=0, 误差=0, 要求误差=0.5;
VARIABLE: 重心[隐含层*4]=0, 距离[隐含层]=0, INCC[4]=0, INTT[样本数]=0, NOTEND=1;
VARIABLE: I=0, J=0, K=0, Z=0, M=0, N=0, EZ=0.001, TD=0, TD0=0, D0=0, S2=0, S1=0;
数据:=数据/最大; {数据归一化}
FOR I=1 TO 隐含层 DO BEGIN
INCC[I]:=I; FOR J=1 TO 4 DO 重心[(I-1)*隐含层+J]:=数据[首K线+I+J-2];
END;
WHILE NOTEND DO BEGIN
FOR I=1 TO 样本数 DO BEGIN
D0:=999999.9;
FOR J=1 TO 隐含层 DO BEGIN
S2:=0; FOR K=1 TO 4 DO S2:=S2+POW(数据[首K线+I+K-2]-重心[(J-1)*隐含层+K],2);
S2:=SQRT(S2);
IF S2<D0 THEN BEGIN D0:=S2; INTT[I]:=J; END;
END;
END;
FOR I=1 TO 隐含层 DO BEGIN
距离[I]:=999999;S2:=0;
FOR J=1 TO 样本数 DO BEGIN
IF INTT[J]=I THEN BEGIN
D0:=0;
FOR K=1 TO 样本数 DO BEGIN
IF INTT[K]=I AND J<>K THEN BEGIN
S2:=0;FOR Z=1 TO 4 DO S:=S+POW(数据[首K线+J+Z-2]-数据[首K线+K+Z-2],2);
S2:=SQRT(S2);
END;
END;
D0:=IF(D0+S2=0,1,D0+S2);
IF D0<距离[I] THEN BEGIN 距离[I]:=D0;INCC[I]:=J;FOR M=1 TO 4 DO 重心[(I-1)*隐含层+M]:=数据[首K线+J+M-2];END;
END;
END;
END;
TD:=0;FOR I=1 TO 隐含层 DO TD:=TD+重心[I];
IF ABS(TD-TD0)<EZ THEN NOTEND:=0; ELSE TD0:=TD;
END;
FOR EPOCH=1 TO 学习次数*10 DO BEGIN {网络学习}
误差:=0;
FOR POS=1 TO 样本数 DO BEGIN
FOR J=1 TO 隐含层 DO BEGIN
输出2[J]:=0;FOR I=1 TO 4 DO 输出2[J]:=输出2[J]+POW(数据[首K线+POS+I-2]-重心[(J-1)*隐含层+I],2);
输出2[J]:=1/(1+EXP(-输出2[J]/(2*POW(距离[J],2)))); {隐含层输出}
END;
输出3[POS]:=0; {学习结果,输出层输出}
FOR J=1 TO 隐含层 DO 输出3[POS]:=输出3[POS]+输出2[J]*权值2[J];
德特3:=数据[首K线+POS+3]-输出3[POS];误差:=误差+POW(德特3,2); {计算误差}
FOR J=1 TO 隐含层 DO 权值2[J]:=权值2[J]+权值学习率*德特3*输出2[J]*输出3[POS]; {调整权值}
END;
误差:=SQRT(误差);IF 误差<=要求误差 THEN BREAK; {误差达到要求就退出,避免过度学习}
END;
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
输出2[J]:=0;FOR I=1 TO 4 DO 输出2[J]:=输出2[J]+POW(预测[I]-重心[(J-1)*隐含层+I],2);
输出2[J]:=1/(1+EXP(-输出2[J]/(2*POW(距离[J],2))));
END;
输出3[POS]:=0;FOR J=1 TO 隐含层 DO 输出3[POS]:=输出3[POS]+输出2[J]*权值2[J];
FOR I=1 TO 3 DO 预测[I]:=预测[I+1]; {更换预测数据,提供下一次simulate}
预测[I]:=输出3[POS];
END;
BPNN: 数据*最大,COLORYELLOW; {学习结果}
{MABP: MA(数据*最大,5);} {也可以做适当的平均}
误差值: 误差,COLORGRAY,LINETHICK0; {误差,要求不要过大或者过小;下面是预测结果}
DRAWTEXT(ISLASTBAR,输出3[1]*最大,'·'),ALIGN0,SHIFT1,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[2]*最大,'·'),ALIGN0,SHIFT2,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[3]*最大,'·'),ALIGN0,SHIFT3,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[4]*最大,'·'),ALIGN0,SHIFT4,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3[5]*最大,'·'),ALIGN0,SHIFT5,COLORMAGENTA,PXUP8;
金币:
奖励:
热心:
注册时间:
2007-12-14

回复 使用道具 举报

签到天数: 1 天

 楼主| 发表于 2007-12-16 19:10 | 显示全部楼层
原帖由 乎乎 于 2007-12-16 13:03 发表





输入是时间,输出是股价?

还是输入是第一天股价,输出是第二天股价?

我觉得输入太少了,加上隐含层神经元太多,所以只能做函数逼近,无法泛化.

输入的是时间,如果输入价格的话就会把太多的随机因素带进去,把价格当成输出来训练。
金币:
奖励:
热心:
注册时间:
2003-7-3

回复 使用道具 举报

发表于 2007-12-16 19:46 | 显示全部楼层
输入的是时间,如果输入价格的话就会把太多的随机因素带进去,把价格当成输出来训练


这么做拟合效果比较好的,难怪你的bp网络也可以做出圆滑的趋势。

这个使用小波分析做,效果更好,比如我说过的使用sym8小波做3层分解,也可以使用db8小波做3层分解和重构。
金币:
奖励:
热心:
注册时间:
2007-12-14

回复 使用道具 举报

发表于 2007-12-19 17:38 | 显示全部楼层
以后不要再贴其他网站地址

[ 本帖最后由 飞舟 于 2007-12-20 09:21 编辑 ]
金币:
奖励:
热心:
注册时间:
2002-10-17

回复 使用道具 举报

签到天数: 1 天

发表于 2007-12-19 21:57 | 显示全部楼层
原帖由 hhk 于 2007-12-16 19:10 发表
输入的是时间

你是怎么把时间归一的?
金币:
奖励:
热心:
注册时间:
2003-11-6

回复 使用道具 举报

发表于 2007-12-20 08:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
金币:
奖励:
热心:
注册时间:
2007-12-19

回复 使用道具 举报

签到天数: 1 天

 楼主| 发表于 2007-12-20 09:22 | 显示全部楼层
原帖由 野狐禅 于 2007-12-19 21:57 发表

你是怎么把时间归一的?

把每个数据的时间除以训练数据的时间的最大值。其实也可用一个小于1的小数序列代替,把要外推的长度也算进来要小于1就行了。
金币:
奖励:
热心:
注册时间:
2003-7-3

回复 使用道具 举报

签到天数: 1 天

发表于 2007-12-20 09:56 | 显示全部楼层
原帖由 hhk 于 2007-12-20 09:22 发表
把每个数据的时间除以训练数据的时间的最大值。其实也可用一个小于1的小数序列代替,把要外推的长度也算进来要小于1就行了。

假设有 100 个数据,最新的一个时间就是 1,早一点的是 0.99, 这么推下去,一开始的时间就是 0.01. 如果外推的话,明天的时间是 1.01.

这样预测将来,是用了函数外推的概念。一般外推都是精度比较差的。
金币:
奖励:
热心:
注册时间:
2003-11-6

回复 使用道具 举报

签到天数: 2494 天

大盘不是我家开的

发表于 2007-12-20 10:20 | 显示全部楼层
集思广益,定获成功!:*19*:
金币:
奖励:
热心:
注册时间:
2007-10-25

回复 使用道具 举报

签到天数: 1 天

 楼主| 发表于 2007-12-20 12:42 | 显示全部楼层
原帖由 野狐禅 于 2007-12-20 09:56 发表

假设有 100 个数据,最新的一个时间就是 1,早一点的是 0.99, 这么推下去,一开始的时间就是 0.01. 如果外推的话,明天的时间是 1.01.

这样预测将来,是用了函数外推的概念。一般外推都是精度比较差的。

我是这样的:假设有 100 个数据,而你要外推(预测)未来30个,那么第一个就是1/(100+30),第二个2/(100+30),...,这样把整个输入域控制在1内。
金币:
奖励:
热心:
注册时间:
2003-7-3

回复 使用道具 举报

发表于 2007-12-20 12:44 | 显示全部楼层
想说的楼上已经说了,网络太慢,晚到了两分钟。呵呵。。。

[ 本帖最后由 sgp111 于 2007-12-20 12:52 编辑 ]
金币:
奖励:
热心:
注册时间:
2002-10-17

回复 使用道具 举报

签到天数: 1 天

发表于 2007-12-20 13:05 | 显示全部楼层
原帖由 hhk 于 2007-12-20 12:42 发表
我是这样的:假设有 100 个数据,而你要外推(预测)未来30个,那么第一个就是1/(100+30),第二个2/(100+30),...,这样把整个输入域控制在1内。

一般并不需要把输入严格地控制在 [0,1] 范围内,除了一些比较特殊的神经网络。主要问题还是函数外推。
金币:
奖励:
热心:
注册时间:
2003-11-6

回复 使用道具 举报

签到天数: 1 天

 楼主| 发表于 2007-12-20 13:15 | 显示全部楼层
贴一个外推的图大家看看,不太理想:
A01.JPG
紫色背景的为训练数据拟合,后面的是外推预测。

[ 本帖最后由 hhk 于 2007-12-20 13:27 编辑 ]
金币:
奖励:
热心:
注册时间:
2003-7-3

回复 使用道具 举报

发表于 2007-12-20 13:30 | 显示全部楼层
这个图的效果怎么和首页的图相差那么多??
金币:
奖励:
热心:
注册时间:
2002-10-17

回复 使用道具 举报

签到天数: 1 天

 楼主| 发表于 2007-12-20 13:33 | 显示全部楼层
贴一些有+-5%通道的图: A07.JPG A02.JPG A03.JPG A04.JPG A08.JPG

[ 本帖最后由 hhk 于 2007-12-20 13:45 编辑 ]
金币:
奖励:
热心:
注册时间:
2003-7-3

回复 使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

本站声明:1、本站所有广告均与MACD无关;2、MACD仅提供交流平台,网友发布信息非MACD观点与意思表达,因网友发布的信息造成任何后果,均与MACD无关。
MACD俱乐部(1997-2019)官方域名:macd.cn   MACD网校(2006-2019)官方域名:macdwx.com
值班热线[9:00—17:30]:18292674919   24小时网站应急电话:18292674919
找回密码、投诉QQ:89918815 友情链接QQ:95008905 广告商务联系QQ:17017506 电话:18292674919
增值电信业务经营许可证: 陕ICP19026207号—2  陕ICP备20004035号

举报|意见反馈|Archiver|手机版|小黑屋|MACD俱乐部 ( 陕ICP备20004035号 )

GMT+8, 2024-5-2 08:52 , Processed in 0.065890 second(s), 9 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表