python做股票分析,Python 股票分析
本文主要详细介绍如何使用Python和SimpleRNN实现股票预测效果。文中的样例代码讲解的很详细,对我们学习很有帮助,有需要的可以参考一下。
00-1010 1、数据来源2、代码实现3、完整的代码原理,请查看之前的文章。
目录
SH600519.csv是tushare模块下载的SH600519贵州茅台的日k线数据。在本例中,仅使用其列C数据(如图所示):
用连续 60 天的开盘价,预测第 61 天的开盘价。
1、数据源
按照六步法:导入相关模块——将贵州茅台的日k线数据读入变量茅台,取变量茅台中前2126天的开盘价作为训练数据,取变量茅台中后300天的开盘价作为测试数据;然后对开盘价进行归一化,使送入神经网络的数据分布在0和1之间;
接下来,建立空列表以分别接收训练集输入特征、训练集标签、测试集输入特征和测试集标签;
继续构建数据。用for循环遍历整个训练数据,每连续60天的数据作为输入特征x_train,第61天的数据作为对应的标签y_train,共生成2066组训练数据,然后对训练数据的顺序进行置乱并转换成数组格式再转换成RNN输入所需的维数;
类似地,使用for循环遍历整个测试数据,总共生成240组测试数据。测试集不需要乱序,但是需要转换成数组格式,然后转换成RNN输入所需的维数。
用序列建立神经网络;
第一层,循环计算层设置80个内存,每一个时间步将h t h_t ht推至下一层,使用0.2 Dropout;
第二个循环计算层有100个set内存,只有最后一个时间步把h t h_t ht推到下一层,用0.2 Dropout;
由于输出值是第61天的开盘价,只有一个数,所以全连接密集是1-编译配置训练法。使用adam优化器并使用均方误差损失函数。在股票预测代码中,只需要观察loss,训练迭代打印时只打印loss,所以不需要给metrics赋值-设置断点继续训练,fit执行训练过程-summary打印出网络结构和参数统计。
执行损失可视化和参数错误报告。
做股票预测。用Predict预测测试集数据,然后将预测值和真实值从归一化值转换为真实值,最后用红线画出真实值曲线,用蓝线画出预测值曲线。
为了对模型进行评价,给出了三个评价指标:均方误差、均方根误差和平均绝对误差。这些误差越小,预测值就越接近真实值。
Rn股票预测亏损曲线:
Rn股票预测曲线3360
Rn股票预测评估指数:
模型摘要:
2、代码实现
将numpy作为np导入
将张量流作为tf导入
从tensorflow.keras.layers导入Dropout,Dense,SimpleRNN
将matplotlib.pyplot作为plt导入
导入操作系统
进口熊猫作为pd
从sklearn .预处理导入MinMaxScaler
从sklearn.metrics导入均方
d_error, mean_absolute_error
import math
# 读取股票文件
maotai = pd.read_csv(./SH600519.csv)
# 前(2426-300=2126)天的开盘价作为训练集,表格从0开始计数,2:3 是提取[2:3)列,前闭后开,故提取出C列开盘价
training_set = maotai.iloc[0:2426 - 300, 2:3].values
# 后300天的开盘价作为测试集
test_set = maotai.iloc[2426 - 300:, 2:3].values
# 归一化
sc = MinMaxScaler(feature_range=(0, 1)) # 定义归一化:归一化到(0,1)之间
training_set_scaled = sc.fit_transform(training_set) # 求得训练集的最大值,最小值这些训练集固有的属性,并在训练集上进行归一化
test_set = sc.transform(test_set) # 利用训练集的属性对测试集进行归一化
x_train = []
y_train = []
x_test = []
y_test = []
# 测试集:csv表格中前2426-300=2126天数据
# 利用for循环,遍历整个训练集,提取训练集中连续60天的开盘价作为输入特征x_train,第61天的数据作为标签,for循环共构建2426-300-60=2066组数据。
for i in range(60, len(training_set_scaled)):
x_train.append(training_set_scaled[i - 60:i, 0])
y_train.append(training_set_scaled[i, 0])
# 对训练集进行打乱
np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)
# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)
# 使x_train符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]。
# 此处整个数据集送入,送入样本数为x_train.shape[0]即2066组数据;输入60个开盘价,预测出第61天的开盘价,循环核时间展开步数为60; 每个时间步送入的特征是某一天的开盘价,只有1个数据,故每个时间步输入特征个数为1
x_train = np.reshape(x_train, (x_train.shape[0], 60, 1))
# 测试集:csv表格中后300天数据
# 利用for循环,遍历整个测试集,提取测试集中连续60天的开盘价作为输入特征x_test,第61天的数据作为标签y_test,for循环共构建300-60=240组数据。
for i in range(60, len(test_set)):
x_test.append(test_set[i - 60:i, 0])
y_test.append(test_set[i, 0])
# 测试集变array并reshape为符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]
x_test, y_test = np.array(x_test), np.array(y_test)
x_test = np.reshape(x_test, (x_test.shape[0], 60, 1))
model = tf.keras.Sequential([
SimpleRNN(80, return_sequences=True),# 第一层循环计算层:记忆体设定80个,每个时间步推送ht给下一层
Dropout(0.2), #使用0.2的Dropout
SimpleRNN(100),# 第二层循环计算层,设定记忆体100个
Dropout(0.2), #
Dense(1) # 由于输出值是第61天的开盘价,只有一个数,所以Dense是1
])
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss=mean_squared_error) # 损失函数用均方误差
# 该应用只观测loss数值,不观测准确率,所以删去metrics选项,一会在每个epoch迭代显示时只显示loss值
checkpoint_save_path = "./checkpoint/rnn_stock.ckpt"
if os.path.exists(checkpoint_save_path + .index):
print(-------------load the model-----------------)
model.load_weights(checkpoint_save_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
save_weights_only=True,
save_best_only=True,
monitor=val_loss)
history = model.fit(x_train, y_train, batch_size=64, epochs=50, validation_data=(x_test, y_test), validation_freq=1,
callbacks=[cp_callback])
model.summary()
file = open(./weights.txt, w) # 参数提取
for v in model.trainable_variables:
file.write(str(v.name) + \n)
file.write(str(v.shape) + \n)
file.write(str(v.numpy()) + \n)
file.close()
loss = history.history[loss]
val_loss = history.history[val_loss]
plt.plot(loss, label=Training Loss)
plt.plot(val_loss, label=Validation Loss)
plt.title(Training and Validation Loss)
plt.legend()
plt.show()
################## predict ######################
# 测试集输入模型进行预测
predicted_stock_price = model.predict(x_test)
# 对预测数据还原---从(0,1)反归一化到原始范围
predicted_stock_price = sc.inverse_transform(predicted_stock_price)
# 对真实数据还原---从(0,1)反归一化到原始范围
real_stock_price = sc.inverse_transform(test_set[60:])
# 画出真实数据和预测数据的对比曲线
plt.plot(real_stock_price, color=red, label=MaoTai Stock Price)
plt.plot(predicted_stock_price, color=blue, label=Predicted MaoTai Stock Price)
plt.title(MaoTai Stock Price Prediction)
plt.xlabel(Time)
plt.ylabel(MaoTai Stock Price)
plt.legend()
plt.show()
##########evaluate##############
# calculate MSE 均方误差 ---> E[(预测值-真实值)^2] (预测值减真实值求平方后求均值)
mse = mean_squared_error(predicted_stock_price, real_stock_price)
# calculate RMSE 均方根误差--->sqrt[MSE] (对均方误差开方)
rmse = math.sqrt(mean_squared_error(predicted_stock_price, real_stock_price))
# calculate MAE 平均绝对误差----->E[预测值-真实值](预测值减真实值求绝对值后求均值)
mae = mean_absolute_error(predicted_stock_price, real_stock_price)
print(均方误差: %.6f % mse)
print(均方根误差: %.6f % rmse)
print(平均绝对误差: %.6f % mae)
以上就是Python+SimpleRNN实现股票预测详解的详细内容,更多关于Python SimpleRNN股票预测的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。