当前位置:   article > 正文

使用LSTM预测股票_lstm股票预测

lstm股票预测

利用LSTM工具的神经网络算法预测未来一天的股票涨跌

最终测试得分,加大数据量可以提高结果精确度,

  1. ##########################导入所需库##########################
  2. import pandas as pd
  3. import numpy as np
  4. from numpy import log
  5. from sklearn.preprocessing import MinMaxScaler
  6. from tensorflow.keras.models import Sequential
  7. from tensorflow.keras.layers import LSTM, Dense
  8. #import tensorflow.keras
  9. from sklearn.metrics import r2_score
  10. import random
  11. import matplotlib.pyplot as plt
  12. #############################################################
  13. ####################设置中文、负号正常显示#####################
  14. plt.rcParams['font.sans-serif'] = ['SimHei']
  15. plt.rcParams['axes.unicode_minus'] = False
  16. #############################################################
  17. ################## 配置文件读写函数库调用封装 ##################
  18. import os
  19. import configparser
  20. def process_config(A, file_name, section_name, key_name, new_value):
  21. # 获取当前py文件所在的文件夹路径
  22. current_folder = os.path.dirname(os.path.abspath(__file__))
  23. # 拼接配置文件路径
  24. config_file_path = os.path.join(current_folder, file_name)
  25. # 创建一个配置文件解析器对象
  26. config = configparser.ConfigParser()
  27. # 读取配置文件
  28. config.read(config_file_path)
  29. if A == 'R_value':
  30. # 获取指定section下的key对应的value
  31. value = config.get(section_name, key_name)
  32. return value
  33. elif A == 'W_value':
  34. # 修改指定section下的key对应的value
  35. config.set(section_name, key_name, new_value)
  36. with open(config_file_path, 'w') as configfile:
  37. config.write(configfile)
  38. elif A == 'W_new_section':
  39. # 添加一个新的section
  40. config.add_section(section_name)
  41. with open(config_file_path, 'w') as configfile:
  42. config.write(configfile)
  43. elif A == 'W_new_key':
  44. # 在新的section下添加一个key-value对
  45. config.set(section_name, key_name, new_value)
  46. with open(config_file_path, 'w') as configfile:
  47. config.write(configfile)
  48. else:
  49. pass
  50. # 调用方法:
  51. # 1. 读取指定section下的key对应的value:`process_config('R_value', 'config.ini', 'section_name', 'key_name', None)`
  52. # 2. 修改指定section下的key对应的value:`process_config('W_value', 'config.ini', 'section_name', 'key_name', 'new_value')`
  53. # 3. 添加一个新的section:`process_config('W_new_section', 'config.ini', 'section_name', None, None)`
  54. # 4. 在新的section下添加一个key-value对:`process_config('W_new_key', 'config.ini', 'section_name', 'key_name', 'new_value')`
  55. ##############################################################
  56. ############# 全局参数,所有要调整的参数都在这里 ###################################
  57. token = process_config('R_value', 'config.ini', 'section_token', 'tushare_token', None) #在网站tushare注册用户并获取数据的密钥 注册网址:https://tushare.pro/register?reg=641623
  58. ts_code = '603178.SH' # 股票代码
  59. start_date = '19901101' # 起始日期
  60. end_date = '20241201' # 结束日期
  61. dim = 300 # 输出维度数,也是LSTM的网络节点数
  62. epochs = 100 # 训练代数,可以理解为训练次数
  63. days = 30 # 读取多少天的数据作为一次预测。例如读取20天的历史数据来预测未来1天的情况
  64. batch_size = days*1 # 训练批次大小,就是一次性读取多少个样本进行一运算,越大运算速度越快,但是占用内存和显存越多,根据自己的机器性能设置。同时该参数还决定梯度下降算法的下降步长数。
  65. split_ratio = 0.6 #0.9代表选90%作为训练数据,10%测试数据
  66. ### 开始构建网络 ###
  67. n_steps = days # 输入张量的维度数
  68. n_features = 7 # 输入张量的维度
  69. model_2 = Sequential()
  70. # 激活函数用relu
  71. model_2.add(LSTM(dim, activation='relu', input_shape=(n_steps, n_features)))
  72. # 输出层使用全连接层,只要一个输出节点
  73. model_2.add(Dense(1))
  74. # 选择优化器和损失函数,优化器为线性规划算法,损失函数使用的是高维空间测定距离函数
  75. model_2.compile(optimizer='rmsprop', loss='mse')
  76. #################################################################################
  77. ######## 从tushare获取数据 ########
  78. import tushare as ts
  79. # 封装tushare接口
  80. def get_stock_data(ts_code, start_date, end_date):
  81. pro = ts.pro_api(token)
  82. df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
  83. return df
  84. data = get_stock_data(ts_code, start_date, end_date)
  85. data = data.iloc[::-1] # dataframe反转,因为接口的第一条数据是最新行情,我们希望最新行情在后面
  86. print(data)
  87. data_ = data[['open', 'close', 'high', 'low','pct_chg','vol']]
  88. data_['日收益率'] = log(data_[['close']]).diff(-1)
  89. data_.dropna(axis=0, inplace=True)
  90. data_.to_csv("123.csv")
  91. print(data_)
  92. ########### 加工数据 ###########
  93. def processData(data, lb):
  94. X, Y = [], []
  95. for i in range(len(data) - lb - 1):
  96. X.append(data[i:(i + lb), 0])
  97. try:
  98. Y.append(data[(i + 2 + lb), 0])
  99. except:
  100. Y.append(data[(i + lb), 0])
  101. return np.array(X), np.array(Y)
  102. def pData(data, lb):
  103. X = []
  104. for i in range(len(data) - lb - 1):
  105. X.append(data[i:(i + lb)])
  106. return np.array(X)
  107. ##################################
  108. close = data_['close']
  109. cl = np.array(close)
  110. max_close = cl.max() # 数据归一化之前,保存原始数据最大值,恢复元数据时用得到
  111. min_close = cl.min() # 数据归一化之前,保存原始数据最小值,恢复元数据时用得到
  112. cl = cl.reshape(cl.shape[0], 1)
  113. scl = MinMaxScaler()
  114. sc2 = MinMaxScaler()
  115. cl = scl.fit_transform(cl)
  116. # 生成标签
  117. _,y = processData(cl, days)
  118. X = data_.values
  119. plt.plot(X[int(X.shape[0] * 0.90):].reshape(-1,1),label='y_test') # 假设 X 是一个包含数据的数组,X.shape[0] 表示 X 的长度
  120. # plt.legend() # 显示图例 # int(X.shape[0] * 0.90) 表示取 X 中最后 10% 的数据作为绘图数据
  121. plt.show() # 显示图形 # reshape(-1, 1) 将数据转换为列向量形式
  122. X = sc2.fit_transform(X) # label='y_test' 为折线图添加标签
  123. X = pData(X, days)
  124. ########## (split_ratio)训练数据分割,如0.9代表选90%作为训练数据,10%测试数据 ##########
  125. y_train, y_test = y[:int(y.shape[0] * split_ratio)], y[int(y.shape[0] * split_ratio):]
  126. x_train, x_test = X[:int(X.shape[0] * split_ratio)], X[int(X.shape[0] * split_ratio):]
  127. print("++++++++++++++++++++", type(x_test))
  128. ######################################################################################
  129. History = model_2.fit(x_train, y_train, batch_size=batch_size, epochs=epochs,validation_data=(x_test, y_test), shuffle=False)
  130. plt.plot(History.history['loss'], label='loss')
  131. plt.plot(History.history['val_loss'], label='val loss')
  132. plt.legend(loc='best')
  133. plt.title('The loss values of real and predict')
  134. #plt.savefig('D:/mojin/self/try/LSTM/result/真实值与预测值的loss值.jpg')
  135. #plt.show()
  136. #####################
  137. #####将测试集中的所有切片以序列的方式进行预测,查看预测结果与真实值的拟合情况#####
  138. y_pred = model_2.predict(x_test)
  139. fig = plt.gcf()
  140. plt.figure(figsize=(8, 4))
  141. y_test = y_test.reshape(-1,1)
  142. y_test = np.multiply(y_test, max_close - min_close)
  143. y_test = np.add(y_test, min_close) # 还原原来数据归一化之前的数值
  144. y_pred = np.multiply(y_pred, max_close - min_close)
  145. y_pred = np.add(y_pred, min_close) # 还原原来数据归一化之前的数值
  146. plt.plot(y_test.reshape(-1,1),label='真实值')
  147. plt.plot(y_pred,label='预测值')
  148. plt.title('Predict of test data')
  149. plt.text(100, 0.4, s='测试集R2:%.3f' % (r2_score(y_test.reshape(-1,1), y_pred)))
  150. plt.legend(loc='best')
  151. print("测试最大值:%.2f " % max_close,"测试最小值:%.2f " % min_close)
  152. plt.show()
  153. ############################################################################
  154. train_score = np.sqrt(np.mean((model_2.predict(x_train) - y_train) ** 2))
  155. test_score = np.sqrt(np.mean((y_pred - y_test) ** 2))
  156. print('训练得分: %.2f RMSE' % train_score)
  157. print('测试得分: %.2f RMSE' % test_score)
  158. ######### 预测数据 ##############
  159. a = x_test[len(x_test)-1]
  160. Xt = model_2.predict(a.reshape(1, days, n_features)) #预测数据只需要调用这个函数就行, a 的数值可以任意构建
  161. print("预测数据: ")
  162. print(a)
  163. print("预测结果: ", Xt)
  164. # 还原原来数据归一化之前的数值
  165. print("预测归一化之前的数值:", Xt[0][0] * (max_close - min_close) + min_close)

训练结果如下:

该代码参考编写:LSTM预测未来一天股票收盘价_lstm如何得到未来一天数据-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/563668
推荐阅读
相关标签
  

闽ICP备14008679号