翔子 发表于 2009-1-10 23:19:00

BP神经网络飞狐源码

{三层网络:输入层节点数=4,输出层节点数=1,隐含层节点数=隐含层
Sigmoid,Purelin,Trainlm}

INPUT: 隐含层(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: 数据=(C+O)/2, 最大=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;

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;

{版权所有:嘉兴·陈(uuxp.com),QQ:110036737,Mail:cyouwei@zj.com}
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: 数据*最大,COLORYELLOW; {学习结果}
误差值: 误差,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;




另一个


IF DATACOUNT<13 THEN EXIT;
MA10:MA(C,10),COLORYELLOW; VARIABLE:NN=IF(DATACOUNT>333,333,0),输入=0,输出=0,系数=IF(MA10<2,3000,IF(MA10<10,300,IF(MA10<300,20,IF(MA10>5000,0.2,1)))),BP10=LN(MA10*系数);
输入:=BP10;输入:=BP10;输入:=BP10;
BP10:=EXP(57.8216/(1+EXP(0.5025-REF(BP10,3)*0.0064+REF(BP10,2)*0.0048+REF(BP10,1)*0.0715-BP10*0.1391))+5.0204/(1+EXP(7.7208-REF(BP10,3)*0.1444+REF(BP10,2)*0.8042+REF(BP10,1)*1.9757-BP10*0.1118))-21.6498)/系数;

上涨信号:=REF(BP10>MA10,1);下跌信号:=REF(BP10<MA10,1);
上涨成功率:COUNT(上涨信号 AND MA10>REF(MA10,1),NN)/COUNT(上涨信号,NN)*100,LINETHICK0;
下跌成功率:COUNT(下跌信号 AND MA10<REF(MA10,1),NN)/COUNT(下跌信号,NN)*100,LINETHICK0;

输入:=LN(BP10*系数);
FOR POS=1 TO 3 DO BEGIN
输出:=57.8216/(1+EXP(0.5025-输入*0.0064+输入*0.0048+输入*0.0715-输入*0.1391))+5.0204/(1+EXP(7.7208-输入*0.1444+输入*0.8042+输入*1.9757-输入*0.1118))-21.6498;
输入:=输入;输入:=输入;输入:=输入;输入:=输出;输出:=EXP(输出)/系数;
END;
预测:BP10,COLORRED;
DRAWTEXT(ISLASTBAR,BP10,'·'),ALIGN0,SHIFT1,COLORYELLOW,PXUP8;
DRAWTEXT(ISLASTBAR,输出,'·'),ALIGN0,SHIFT2,COLORYELLOW,PXUP8;
DRAWTEXT(ISLASTBAR,输出,'·'),ALIGN0,SHIFT3,COLORYELLOW,PXUP8;
DRAWTEXT(ISLASTBAR,输出,'·'),ALIGN0,SHIFT4,COLORYELLOW,PXUP8;
DRAWTEXT(ISLASTBAR AND BP10-MA10>0,MA10,'↑'),ALIGN1,COLORRED,PXDN20;
DRAWTEXT(ISLASTBAR AND BP10-MA10=0,MA10,'→'),ALIGN1,COLORRED;
DRAWTEXT(ISLASTBAR AND BP10-MA10<0,MA10,'↓'),ALIGN1,COLORRED,PXUP20;
{
DRAWTEXT(上涨信号 AND MA10>REF(MA10,1),MA10,'↑'),ALIGN0,COLORRED,PXDN20;
DRAWTEXT(上涨信号 AND MA10<REF(MA10,1),MA10,'↑'),ALIGN0,COLORGREEN,PXDN20;
DRAWTEXT(下跌信号 AND MA10<REF(MA10,1),MA10,'↓'),ALIGN0,COLORRED,PXUP30;
DRAWTEXT(下跌信号 AND MA10>REF(MA10,1),MA10,'↓'),ALIGN0,COLORGREEN,PXUP30;
}





INPUT: 数据类型(4,1,6,1),输入层节点数(4,1,10,1),隐含层节点数(3,2,20,1),学习次数(2,1,100,1);
vbs:=SCRIPTTYPE(0);
P1Close:=if(数据类型=1,open,if(数据类型=2,high,if(数据类型=3,low,if(数据类型=4,CLOSE,if(数据类型=5,(o+c)/2,(o+h+l+c)/4)))));
yucez:=CLOSE;
误差:=0;
最大:=sysparam(4);
PClose:=P1Close/最大;
firstkk:=sysparam(2)-1;
lastkk:=sysparam(3)-1;
if lastkk - firstkk - 输入层节点数 + 1 <= 1 Or datacount < 5 then begin
drawtextex(islastbar,0,10,20,'主图可见K线数量不足,请增加K线数量或者更换其他股票');
exit;
end;
<%
on error resume next
Dim xxsl, Node(4), sNum, p(), t(), p1(), eee
Dim pp, pplen, epochs, firstk, lastk, yuce
firstk = FFL.VarData("firstkk"): lastk = FFL.VarData("lastkk")
pp = FFL.VarData("PClose"): pplen = UBound(pp): If lastk > pplen Then lastk = pplen
Node(1) = FFL.VarData("输入层节点数"): sNum = lastk - firstk - Node(1) + 1
epochs = FFL.VarData("学习次数") * 10: Node(2) = FFL.VarData("隐含层节点数")
yuce = FFL.VarData("yucez"): Node(3) = 1
Set bpn = New BpNeuralNet: bpn.init 3, Node
ReDim p(sNum, Node(1)), t(sNum, Node(3)), p1(Node(1))
For iq = 1 To sNum
For jq = 1 To Node(1)
p(iq, jq) = pp(firstk + iq + jq - 2)
Next
t(iq, 1) = pp(firstk + iq + jq - 2)
Next
For iil = 1 To epochs
eee = bpn.train(p, t, sNum)
Next
For ii = 1 To sNum
For jj = 1 To Node(1)
p1(jj) = pp(firstk + ii + jj - 2)
Next
t(ii, 1) = bpn.simulate(p1)
Next
For ii = 1 To sNum
pp(firstk + Node(1) + ii - 1) = t(ii, 1)
Next
For jj = 1 To Node(1)
p1(jj) = pp(lastk + jj - Node(1))
Next
For ii = 0 To 4
yuce(ii) = bpn.simulate(p1)
For jj = 1 To Node(1) - 1
p1(jj) = p1(jj + 1)
Next
p1(Node(1)) = yuce(ii)
Next
FFL.VarData("PClose") = pp
FFL.VarData("误差") = eee
FFL.VarData("yucez") = yuce
'*****************************
Class BpNeuralNet
Dim nNum(), iRange(), x(), o, mLN, w()
Dim d_w(), rate_w, rate_b, b(), dlE(), yd, e
Public Function init(Layer0, node0())
on error resume next
ReDim nNum(Layer0): mLN = 0
For i = 1 To Layer0
nNum(i) = node0(i): If nNum(i) > mLN Then mLN = nNum(i)
Next
ReDim x(3, mLN), iRange(nNum(1), 2), w(3, mLN, mLN)
ReDim b(3, mLN), dlE(3, mLN), d_w(3, mLN, mLN)
For i = 1 To nNum(1)
For j = 1 To nNum(2)
w(1, i, j) = (Rnd() - 0.5) * 2 / Sqr(nNum(1))
d_w(1, i, j) = 0: iRange(i, 1) = 0: iRange(i, 2) = 1
Next
Next
For i = 1 To nNum(2)
b(2, i) = (Rnd() - 0.5) * 2 / Sqr(nNum(1)): d_w(2, i, 1) = 0
w(2, i, 1) = (Rnd() - 0.5) * 2 / Sqr(nNum(2))
Next
b(3, 1) = (Rnd() - 0.5) * 2 / Sqr(nNum(2))
rate_w = 0.02: rate_b = 0.02: e = 0
End Function
Public Function train(p(), t(), sNum)
on error resume next
Dim dtmp: e = 0
For ism = 1 To sNum
For i = 1 To nNum(1)
If Abs(p(ism, i)) > iRange(i, 2) Then iRange(i, 2) = Abs(p(ism, i))
Next
Next
For ism = 1 To sNum
For i = 1 To nNum(1)
x(1, i) = p(ism, i) / iRange(i, 2)
Next
yd = t(ism, 1)
For j = 1 To nNum(2)
o = 0
For i = 1 To nNum(1)
o = o + w(1, i, j) * x(1, i)
Next
x(2, j) = hanshu(o + b(2, j))
Next
o = 0
For j = 1 To nNum(2)
o = o + w(2, j, 1) * x(2, j)
Next
x(3, 1) = o - b(3, 1): dlE(3, 1) = yd - x(3, 1): e = e + (yd - x(3, 1)) ^ 2
For j = 1 To nNum(2)
dtmp = rate_w * dlE(3, 1) * x(2, j) + 0
w(2, j, 1) = w(2, j, 1) + dtmp: d_w(2, j, 1) = dtmp
Next
For j = 1 To nNum(2)
dlE(2, j) = dlE(3, 1) * w(2, j, 1) * x(2, j) * (1 - x(2, j))
For i = 1 To nNum(1)
dtmp = rate_w * dlE(2, j) * x(1, i)
w(1, i, j) = w(1, i, j) + dtmp: d_w(1, i, j) = dtmp
Next
Next
For l = 3 To 2 Step -1
For k = 1 To nNum(l)
b(l, k) = b(l, k) + rate_b * dlE(l, k)
Next
Next
Next
e = e / 2: train = e
End Function
Public Function simulate(psim())
on error resume next
For i = 1 To nNum(1)
x(1, i) = psim(i) / iRange(i, 2)
Next
For j = 1 To nNum(2)
o = 0
For i = 1 To nNum(1)
o = o + w(1, i, j) * x(1, i)
Next
x(2, j) = hanshu(o + b(2, j))
Next
o = 0
For j = 1 To nNum(2)
o = o + w(2, j, 1) * x(2, j)
Next
simulate = o - b(3, 1)
End Function
Function hanshu(f)
hanshu = 1 / (1 + Exp(-f))
End Function
End Class
%>
If 误差 > 0 Then begin
网络拟合:PClose*最大,coloryellow;
误差值:误差*最大,linethick0,colorgray;

drawtext(islastbar,yucez*最大,'·'),align0,shift1,colorMAGENTA,PXUP8;
drawtext(islastbar,yucez*最大,'·'),align0,shift2,colorMAGENTA,PXUP8;
drawtext(islastbar,yucez*最大,'·'),align0,shift3,colorMAGENTA,PXUP8;
drawtext(islastbar,yucez*最大,'·'),align0,shift4,colorMAGENTA,PXUP8;
drawtext(islastbar,yucez*最大,'·'),align0,shift5,colorMAGENTA,PXUP8;

end;
页: [1]
查看完整版本: BP神经网络飞狐源码