回复 #54 qiannong 的帖子
人脑在理论上绝对超过bp、rbf、art、hopfield、svm、som。。。但是某些方面人脑绝对不如电脑,比如下面的计算你能很快算出来吗?
77888888 ^ 77 = ?
人脑不能,电脑瞬间完成。
神经网络也是如此。 原帖由 hhk 于 2007-12-15 10:53 发表 http://bbs.macd.cn/static/image/common/back.gif
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-16 09:56 发表 http://bbs.macd.cn/static/image/common/back.gif
楼主好像不曾公开网络结构,偶连源码都公开了。
三层bp网络:输入层神经元4个,输出层神经元1个,隐含层神经元3-4个,
输入层到隐含层使用logsig函数,隐含层到输出层使用线性函数,学习算法是梯度下 ...
输入层神经元1个,输出层神经元1个,隐含层神经元30个,很简单没有什么隐瞒啊 搞成 一个OPENSOURCE的项目把。。发挥大家的力量估计能搞出好程序来。 原帖由 hhk 于 2007-12-16 11:44 发表 http://bbs.macd.cn/static/image/common/back.gif
输入层神经元1个,输出层神经元1个,隐含层神经元30个,很简单没有什么隐瞒啊
输入是时间,输出是股价?
还是输入是第一天股价,输出是第二天股价?
我觉得输入太少了,加上隐含层神经元太多,所以只能做函数逼近,无法泛化. 原帖由 巴菲特牛 于 2007-12-16 11:48 发表 http://bbs.macd.cn/static/image/common/back.gif
搞成 一个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: 预测=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:=0;
FOR I=1 TO 4 DO 输出2:=输出2+数据[首K线+POS+I-2]*权值1[(J-1)*隐含层+I];
输出2:=1/(1+EXP(-输出2-阀值2)); {隐含层输出}
END;
输出3:=0;
FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;
输出3:=输出3-阀值3; {学习结果,输出层输出}
德特3:=数据[首K线+POS+3]-输出3;
误差:=误差+德特3*德特3; {计算误差}
FOR J=1 TO 隐含层 DO BEGIN
权值2:=权值2+权值学习率*德特3*输出2; {调整权值}
德特2:=德特3*权值2*输出2*(1-输出2);
FOR I=1 TO 4 DO 权值1[(J-1)*隐含层+I]:=权值1[(J-1)*隐含层+I]+权值学习率*德特2*数据[首K线+POS+I-2];
END;
阀值3:=阀值3+阀值学习率*德特3; {调整阀值}
FOR J=1 TO 隐含层 DO 阀值2:=阀值2+阀值学习率*德特2;
END;
误差:=误差/2;
IF 误差<=要求误差 THEN BREAK; {误差达到要求就退出,避免过度学习}
END;
FOR POS=1 TO 4 DO 预测:=数据[首K线+样本数-1+POS]; {取预测数据}
FOR POS=1 TO 样本数 DO 数据[首K线+POS+3]:=输出3;{返回学习结果}
FOR POS=1 TO 5 DO BEGIN {进行预测,共5个结果}
FOR J=1 TO 隐含层 DO BEGIN
输出2:=0;
FOR I=1 TO 4 DO 输出2:=输出2+预测*权值1[(J-1)*隐含层+I];
输出2:=1/(1+EXP(-输出2-阀值2));
END;
输出3:=0;
FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;
输出3:=输出3-阀值3;
FOR I=1 TO 3 DO 预测:=预测; {更换预测数据,提供下一次simulate}
预测:=输出3;
END;
BPNN: (数据+1)/2*最大,COLORYELLOW; {学习结果}
{MABP: MA((数据+1)/2*最大,5);} {也可以做适当的平均}
误差值: 误差,COLORGRAY,LINETHICK0; {误差,要求不要过大或者过小;下面是预测结果}
DRAWTEXT(ISLASTBAR,(输出3+1)/2*最大,'·'),ALIGN0,SHIFT1,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3+1)/2*最大,'·'),ALIGN0,SHIFT2,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3+1)/2*最大,'·'),ALIGN0,SHIFT3,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3+1)/2*最大,'·'),ALIGN0,SHIFT4,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,(输出3+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: 预测=0, 权值学习率=0.5, EPOCH=0, POS=0, 权值2[隐含层]=1, 输出2[隐含层]=0;
VARIABLE: 输出3[样本数]=0, 德特3=0, 误差=0, 要求误差=0.5;
VARIABLE: 重心[隐含层*4]=0, 距离[隐含层]=0, INCC=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; 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:=J; END;
END;
END;
FOR I=1 TO 隐含层 DO BEGIN
距离:=999999;S2:=0;
FOR J=1 TO 样本数 DO BEGIN
IF INTT=I THEN BEGIN
D0:=0;
FOR K=1 TO 样本数 DO BEGIN
IF INTT=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<距离 THEN BEGIN 距离:=D0;INCC:=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+重心;
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:=0;FOR I=1 TO 4 DO 输出2:=输出2+POW(数据[首K线+POS+I-2]-重心[(J-1)*隐含层+I],2);
输出2:=1/(1+EXP(-输出2/(2*POW(距离,2)))); {隐含层输出}
END;
输出3:=0; {学习结果,输出层输出}
FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;
德特3:=数据[首K线+POS+3]-输出3;误差:=误差+POW(德特3,2); {计算误差}
FOR J=1 TO 隐含层 DO 权值2:=权值2+权值学习率*德特3*输出2*输出3; {调整权值}
END;
误差:=SQRT(误差);IF 误差<=要求误差 THEN BREAK; {误差达到要求就退出,避免过度学习}
END;
FOR POS=1 TO 4 DO 预测:=数据[首K线+样本数-1+POS]; {取预测数据}
FOR POS=1 TO 样本数 DO 数据[首K线+POS+3]:=输出3;{返回学习结果}
FOR POS=1 TO 5 DO BEGIN {进行预测,共5个结果}
FOR J=1 TO 隐含层 DO BEGIN
输出2:=0;FOR I=1 TO 4 DO 输出2:=输出2+POW(预测-重心[(J-1)*隐含层+I],2);
输出2:=1/(1+EXP(-输出2/(2*POW(距离,2))));
END;
输出3:=0;FOR J=1 TO 隐含层 DO 输出3:=输出3+输出2*权值2;
FOR I=1 TO 3 DO 预测:=预测; {更换预测数据,提供下一次simulate}
预测:=输出3;
END;
BPNN: 数据*最大,COLORYELLOW; {学习结果}
{MABP: MA(数据*最大,5);} {也可以做适当的平均}
误差值: 误差,COLORGRAY,LINETHICK0; {误差,要求不要过大或者过小;下面是预测结果}
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT1,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT2,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT3,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT4,COLORMAGENTA,PXUP8;
DRAWTEXT(ISLASTBAR,输出3*最大,'·'),ALIGN0,SHIFT5,COLORMAGENTA,PXUP8; 原帖由 乎乎 于 2007-12-16 13:03 发表 http://bbs.macd.cn/static/image/common/back.gif
输入是时间,输出是股价?
还是输入是第一天股价,输出是第二天股价?
我觉得输入太少了,加上隐含层神经元太多,所以只能做函数逼近,无法泛化.
输入的是时间,如果输入价格的话就会把太多的随机因素带进去,把价格当成输出来训练。 输入的是时间,如果输入价格的话就会把太多的随机因素带进去,把价格当成输出来训练
这么做拟合效果比较好的,难怪你的bp网络也可以做出圆滑的趋势。
这个使用小波分析做,效果更好,比如我说过的使用sym8小波做3层分解,也可以使用db8小波做3层分解和重构。 以后不要再贴其他网站地址
[ 本帖最后由 飞舟 于 2007-12-20 09:21 编辑 ] 原帖由 hhk 于 2007-12-16 19:10 发表 http://bbs.macd.cn/static/image/common/back.gif
输入的是时间
你是怎么把时间归一的? 原帖由 野狐禅 于 2007-12-19 21:57 发表 http://bbs.macd.cn/static/image/common/back.gif
你是怎么把时间归一的?
把每个数据的时间除以训练数据的时间的最大值。其实也可用一个小于1的小数序列代替,把要外推的长度也算进来要小于1就行了。 原帖由 hhk 于 2007-12-20 09:22 发表 http://bbs.macd.cn/static/image/common/back.gif
把每个数据的时间除以训练数据的时间的最大值。其实也可用一个小于1的小数序列代替,把要外推的长度也算进来要小于1就行了。
假设有 100 个数据,最新的一个时间就是 1,早一点的是 0.99, 这么推下去,一开始的时间就是 0.01. 如果外推的话,明天的时间是 1.01.
这样预测将来,是用了函数外推的概念。一般外推都是精度比较差的。 集思广益,定获成功!:*19*: 原帖由 野狐禅 于 2007-12-20 09:56 发表 http://bbs.macd.cn/static/image/common/back.gif
假设有 100 个数据,最新的一个时间就是 1,早一点的是 0.99, 这么推下去,一开始的时间就是 0.01. 如果外推的话,明天的时间是 1.01.
这样预测将来,是用了函数外推的概念。一般外推都是精度比较差的。
我是这样的:假设有 100 个数据,而你要外推(预测)未来30个,那么第一个就是1/(100+30),第二个2/(100+30),...,这样把整个输入域控制在1内。 想说的楼上已经说了,网络太慢,晚到了两分钟。呵呵。。。
[ 本帖最后由 sgp111 于 2007-12-20 12:52 编辑 ] 原帖由 hhk 于 2007-12-20 12:42 发表 http://bbs.macd.cn/static/image/common/back.gif
我是这样的:假设有 100 个数据,而你要外推(预测)未来30个,那么第一个就是1/(100+30),第二个2/(100+30),...,这样把整个输入域控制在1内。
一般并不需要把输入严格地控制在 范围内,除了一些比较特殊的神经网络。主要问题还是函数外推。 贴一个外推的图大家看看,不太理想:
紫色背景的为训练数据拟合,后面的是外推预测。
[ 本帖最后由 hhk 于 2007-12-20 13:27 编辑 ] 这个图的效果怎么和首页的图相差那么多?? 贴一些有+-5%通道的图:
[ 本帖最后由 hhk 于 2007-12-20 13:45 编辑 ]