-
Notifications
You must be signed in to change notification settings - Fork 2
/
bp_network_stock_case.py
168 lines (131 loc) · 5.57 KB
/
bp_network_stock_case.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# -*- coding: utf-8 -*-
"""
Created on Sun Jun 25 19:21:32 2017
@author: laizhenzhou@126.com
"""
from numpy import *
import tushare as ts
import matplotlib.pyplot as plt
import pb_network
#调用中国联通的股票的历史数据。X是前30天的每日涨跌百分比,Y是后一天的涨跌逻辑值。
#trainSetLen :训练样本集的长度
#testSetLen: 测试样本集的长度
#dateOffset: 测试样本集和训练样本集之间的间隔。 【训练样本时间分布】【dateOffset】【测试样本集时间分布】
# 如果dateOffset = 0,表示从训练样本集后面开始的第一天开始预测testSetLen天的涨跌情况。
def createStockDataSet1(trainSetLen, testSetLen, dateOffset):
df = ts.get_hist_data('600030',start='2015-01-01'); #600030股票代码, #20150101其实时间,结束时间默认是今天
print('测试样本最新数据时间:')
print df.ix[0].name
#dateLen = df.shape[0];
historyDateLen = 30;
inputTrainDataSet = zeros((historyDateLen,trainSetLen));
ouputTrainDataSet = zeros((1,trainSetLen));
inputTestDataSet = zeros((historyDateLen,testSetLen));
ouputTestDataSet = zeros((1,testSetLen));
predictData = zeros((historyDateLen,1));
k = 0;
for i in range(1+dateOffset+testSetLen,trainSetLen+dateOffset+testSetLen):
inputTrainDataSet[:,k] = df['p_change'][i+1:i+historyDateLen+1];
if df['p_change'][i] >= 0:
ouputTrainDataSet[:,k] = 1;
else:
ouputTrainDataSet[:,k] = 0;
k = k+1;
k = 0;
for i in range(1+dateOffset,testSetLen+dateOffset):
inputTestDataSet[:,k] = df['p_change'][i+1:i+historyDateLen+1];
if df['p_change'][i] >= 0:
ouputTestDataSet[:,k] = 1;
else:
ouputTestDataSet[:,k] = 0;
k = k+1;
predictData = df['p_change'][0:historyDateLen];
print df
print predictData
return inputTrainDataSet,ouputTrainDataSet,inputTestDataSet,ouputTestDataSet,predictData
#-----------生成测试数据集----------------
trainSetLen = 100
testSetLen = 10
dateOffset = 0
inputDataSet,ouputDataSet,inputTestDataSet,ouputTestDataSet,predictData = createStockDataSet1(trainSetLen,testSetLen,dateOffset)
print('\n训练数据集的输入集合,样本个数(%d):' %trainSetLen)
print inputDataSet
print('\n训练数据集的输出结合,样本个数(%d):' %trainSetLen)
print ouputDataSet
#-----------设置神经网络------------------
#隐层神经元个数
intermediateLayerNum = 20;
#最多迭代次数
maxIterNum = 100;
#最小的迭代误差
minLossRatio = 0.0001;
#学习速率系数 (0,1]
LeanRatio = 0.2;
#-----------训练神经网络-------------------
w12,w23,theta2,theta3,iterIdx,lossRatio = trainBpNetwork(inputDataSet,ouputDataSet,intermediateLayerNum,maxIterNum,minLossRatio,LeanRatio);
# 给出最终的测试输入对应的预测输出
finalOutput = zeros(ouputDataSet.shape);
finalOutputLogic = zeros(ouputDataSet.shape);
for n in range(finalOutput.shape[1]):
inputData = inputDataSet[:,n];
ouputData = ouputDataSet[:,n];
layer2Ouput,layer3Ouput = runBpNetwork(inputData,w12,w23,theta2,theta3);
finalOutput[:,n] = layer3Ouput;
for i in range(finalOutput.shape[1]):
if finalOutput[0,i] >= 0.5:
finalOutputLogic[0,i] = 1;
else:
finalOutputLogic[0,i] = 0;
print('\n最终的训练集的涨跌预测输出')
print finalOutputLogic
errCnt = 0;
for i in range(finalOutput.shape[1]):
if finalOutputLogic[0,i] != ouputDataSet[0,i]:
errCnt = errCnt + 1;
print('\n最终训练集错误拟合次数,失误比率')
print errCnt,errCnt * 1.0/finalOutput.shape[1]
print('\n最终的训练集的拟合预测输出')
print finalOutput
#print('\n最终12层之间的权重系数矩阵:')
#print w12
#print('\n最终23层之间的权重系数矩阵:')
#print w23
#print('\n最终第2层的偏置系数:')
#print theta2
#print('\n最终第3层的偏置系数:')
#print theta3
print('\n一共进行了的迭代次数: %d' %iterIdx)
print('\n拟合误差比率: %f' %lossRatio)
plt.figure() #创建一个新的画布
plt.plot(ouputDataSet[0,:])
plt.hold
plt.plot(finalOutput[0,:])
plt.title(u'真实涨跌走势',fontproperties='SimHei')
plt.ylabel(u'涨跌',fontproperties='SimHei')
plt.xlabel(u'时间',fontproperties='SimHei')
plt.grid()
#-----------使用测试样本进行预测测试---------------------
predictTestOutput = zeros(ouputTestDataSet.shape);
predictTestOutputLogic = zeros(ouputTestDataSet.shape);
predictErrCnt = 0;
for n in range(testSetLen):
inputData = inputTestDataSet[:,n];
ouputData = ouputTestDataSet[:,n];
layer2Ouput,layer3Ouput = runBpNetwork(inputData,w12,w23,theta2,theta3);
predictTestOutput[:,n] = layer3Ouput;
if predictTestOutput[0,n] >= 0.5:
predictTestOutputLogic[0,n] = 1;
else:
predictTestOutputLogic[0,n] = 0;
if predictTestOutputLogic[0,n] != ouputTestDataSet[0,n]:
predictErrCnt = predictErrCnt + 1;
print('\n测试数据集(%d天)的真实涨跌(0跌,1涨):' %testSetLen)
print ouputTestDataSet
print('\n测试数据集(%d天)的预测涨跌(0跌,1涨):' %testSetLen)
print predictTestOutputLogic
errRate = predictErrCnt*100.0/testSetLen
print('\n错误预测次数:%d,预测失误百分比:%.1f' %(predictErrCnt,errRate))
#------------------预测明天的涨跌-----------------------
layer2Ouput,layer3Ouput = runBpNetwork(predictData,w12,w23,theta2,theta3);
print('\n明天的涨跌:%.2f, %d' %(layer3Ouput,(layer3Ouput>=0.5)))
#print predictTestOutput