python做股票分析,Python 股票分析

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: