记录学习过程:
使用python的requests库爬取交易数据,得到的数据使用numpy进行神经网络搭建与处理,最后用
matplotlib用图形显示出来
获取交易数据:
给定股票代码,数据的开始和结束时间;下载后保存到CVS文件内
# 股票代码
code = '603825'
# 开始日期
start_date = '20180101'
# 结束日期
end_date = '20210522'
print(f'正在获取 {code} 从 {start_date} 到 {end_date} 的 k线数据......')
# 根据股票代码、开始日期、结束日期获取指定股票代码指定日期区间的k线数据
df = get_k_history(code, start_date, end_date)
# 保存k线数据到表格里面
df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None)
print(f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')
神经网络搭建与处理:
读出之前下载到CVS文件内的数据,进行归一化,网络模型搭建,反馈单元计算,从损失函数的最小梯度计算出权重的更新值,更新后进行新的一轮正向计算,如此反复。直到误差小于给定范围或者训练次数完毕。
#开盘 收盘 最高 最低 成交量 成交额 振幅 涨跌幅 涨跌额 换手率 3日量比 输出20日最大值 输出20日最小值 #T1 选取输入 开盘 收盘 最高 最低 换手率 3日量比 x = df[['开盘','收盘','最高','最低','换手率','3日量比']] y = df[['输出20日最小值','输出20日最大值']]
x_scaler = MinMaxScaler(feature_range=(-1,1))
y_scaler = MinMaxScaler(feature_range=(-1,1))
x = x_scaler.fit_transform(x)
y = y_scaler.fit_transform(y)
#对样本数据 x[735 rows x 6 columns]
sample_in =x.T
sample_out =y.T
#print(sample_in.shape)
#bp网络参数
#训练次数
max_epochs = 1000
learn_rate = 0.0001
#允许损失误差
mse_final =8e-3
sample_number = x.shape[0]
input_number = 6
output_number = 2
hidden_unit_number = 30
#学习训练超参
#[8 rows x 6 columns]
w1 = 0.5 * np.random.rand(hidden_unit_number,input_number)-0.1
#[8 rows x 1 columns]
b1 = 0.5 * np.random.rand(hidden_unit_number,1)-0.1
#[2 rows x 8 columns]
w2 = 0.5 * np.random.rand(output_number,hidden_unit_number)-0.1
#[2 rows x 1 columns]
b2 = 0.5 * np.random.rand(output_number,1)-0.1
def sigmoid(z):
#return 1.0 / (1 + np.exp(-z))
return ( np.exp(z) - np.exp(-z)) / ( np.exp(z) + np.exp(-z))
#print(sigmoid(0))
mse_history = []
for i in range(max_epochs):
#fp
hidden_out = sigmoid(np.dot(w1,sample_in)+b1)
network_out = np.dot(w2,hidden_out)+b2
#误差
err = sample_out - network_out
mse = np.average(np.square(err))
mse_history.append(mse)
if mse<mse_final:
break
#bp err=0.5*(t-o)^2
delta2 = -err
delta1 = np.dot(w2.transpose(),delta2) * hidden_out * (1 - hidden_out)
delta_w2 = np.dot(delta2,hidden_out.transpose())
delta_b2 = np.dot(delta2,np.ones((sample_number,1)))
delta_w1 = np.dot(delta1,sample_in.transpose())
delta_b1 = np.dot(delta1,np.ones((sample_number,1)))
#updata
w2 -= learn_rate * delta_w2
b2 -= learn_rate * delta_b2
w1 -= learn_rate * delta_w1
b1 -= learn_rate * delta_b1
print('所有误差',mse_history)
图形显示:
通过绘图函数把误差以及输入值和目标值显示出来。
n=max_epochs
x=np.linspace(-1,1,n).reshape(n,1)
plt.plot(x,mse_history,'k-',label=u'误差')
plt.show()
plt.plot(sample_out[1],'r-',label=u'sample_out1')
plt.plot(network_out[1],'g-',label=u'network_out1')
plt.show()
plt.plot(sample_out[0],'r-',label=u'sample_out0')
plt.plot(network_out[0],'g-',label=u'network_out0')
plt.show()
总结:
这是一个学习过程。这个神经网络模型不适用于分析有时间先后关系的数据,这种数据分析最好使用RNN或者LSTM。