构建深度学习神经网络预测股票价格


💡 作者: 韩信子@ ShowMeAI
📘 深度学习实战系列: https://www.showmeai.tech/tutorials/42
📘 TensorFlow 实战系列: https://www.showmeai.tech/tutorials/43
📘 本文地址: https://www.showmeai.tech/article-detail/327
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏 ShowMeAI查看更多精彩内容


股票价格数据是一个时间序列形态的数据,诚然,股市的涨落和各种利好利空消息更相关,更多体现的是人们的信心状况,但是它的形态下,时序前后是有一定的相关性的,我们可以使用一种特殊类型的神经网络『循环神经网络 (RNN)』来对这种时序相关的数据进行建模和学习。


在本篇内容中, ShowMeAI将给大家演示,如何构建训练神经网络并将其应用在股票数据上进行预测。


对于循环神经网络的详细信息讲解,大家可以阅读 ShowMeAI整理的系列教程和文章详细了解:

  • 深度学习教程:吴恩达专项课程 · 全套笔记解读
  • 深度学习教程 | 序列模型与RNN网络
  • 自然语言处理教程:斯坦福CS224n课程 · 课程带学与全套笔记解读
  • NLP教程(5) - 语言模型、RNN、GRU与LSTM

💡 数据获取

在实际建模与训练之前,我们需要先获取股票数据。下面的代码使用 Ameritrade API 获取并生成数据,也可以使用其他来源。

  1. import matplotlib.pyplot as plt
  2. import mplfinance as mpl
  3. import pandas as pd
  4. td_consumer_key = 'YOUR-KEY-HERE'
  5. # 美国航空股票
  6. ticker = 'AAL'
  7. ##periodType - day, month, year, ytd
  8. ##period - number of periods to show
  9. ##frequencyTYpe - type of frequency for each candle - day, month, year, ytd
  10. ##frequency - the number of the frequency type in each candle - minute, daily, weekly
  11. endpoint = 'https://api.tdameritrade.com/v1/marketdata/{stock_ticker}/pricehistory?periodType={periodType}&period={period}&frequencyType={frequencyType}&frequency={frequency}'
  12. # 获取数据
  13. full_url = endpoint.format(stock_ticker=ticker,periodType='year',period=10,frequencyType='daily',frequency=1)
  14. page = requests.get(url=full_url,params={'apikey' : td_consumer_key})
  15. content = json.loads(page.content)
  16. # 转成pandas可处理格式
  17. df = pd.json_normalize(content['candles'])
  18. # 设置时间戳为索引
  19. df['timestamp'] = pd.to_datetime(df.datetime, unit='ms')
  20. df = df.set_index("timestamp")
  21. # 绘制数据
  22. plt.figure(figsize=(15, 6), dpi=80)
  23. plt.plot(df['close'])
  24. plt.legend(['Closing Price'])
  25. plt.show()
  26. # 存储前一天的数据
  27. df["previous_close"] = df["close"].shift(1)
  28. df = df.dropna() # 删除缺失值
  29. # 存储
  30. df.to_csv('../data/stock_'+ticker+'.csv', mode='w', index=True, header=True)


上面的代码查询 Ameritrade API 并返回 10 年的股价数据,例子中的股票为『美国航空公司』。 数据绘图结果如下所示:

💡 数据处理

我们加载刚才下载的数据文件,并开始处理预测。

  1. # 读取数据
  2. ticker = 'AAL'
  3. df = pd.read_csv("../data/stock_"+ticker+".csv")
  4. # 设置索引
  5. df['DateIndex'] = pd.to_datetime(df['timestamp'], format="%Y/%m/%d")
  6. df = df.set_index('DateIndex')

下面我们对数据进幅度缩放,以便更好地送入神经网络和训练。(神经网络是一种对于输入数据幅度敏感的模型,不同字段较大的幅度差异,会影响网络的训练收敛速度和精度。)

  1. # 幅度缩放
  2. df2 = df
  3. cols = ['close', 'volume', 'previous_close']
  4. features = df2[cols]
  5. scaler = MinMaxScaler(feature_range=(0, 1)).fit(features.values)
  6. features = scaler.transform(features.values)
  7. df2[cols] = features

在这里,我们重点处理了收盘价成交量前几天收盘价列

💡 数据切分

接下来我们将数据拆分为训练和测试数据集。

  1. # 收盘价设为目标字段
  2. X = df2.drop(['close','timestamp'], axis =1)
  3. y = df2['close']
  4. import math
  5. # 计算切分点(以80%的训练数据为例)
  6. train_percentage = 0.8
  7. split_point = math.floor(len(X) * train_percentage)
  8. # 时序切分
  9. train_x, train_y = X[:split_point], y[:split_point]
  10. test_x, test_y = X[split_point:], y[split_point:]

接下来,我们对数据进行处理,构建滑窗数据,沿时间序列创建数据样本。(因为我们需要基于历史信息对未来的数值进行预测)


  1. # 构建滑窗数据
  2. import numpy.lib
  3. from numpy.lib.stride_tricks import sliding_window_view
  4. def genWindows(X_in, y_in, window_size):
  5. X_out = []
  6. y_out = []
  7. length = X_in.shape[0]
  8. for i in range(window_size, length):
  9. X_out.append(X_in[i-window_size:i, 0:4])
  10. y_out.append(y_in[i-1])
  11. return np.array(X_out), np.array(y_out)
  12. # 窗口大小为5
  13. window_size = 5
  14. X_train_win, y_train_win = genWindows(np.array(train_x), np.array(train_y), window_size)
  15. X_test_win, y_test_win = genWindows(np.array(test_x), np.array(test_y), window_size)

💡 模型构建&训练

构建完数据之后,我们就要构建 RNN 模型了,具体的代码如下所示。注意到下面使用了1个回调函数,模型会在验证集性能没有改善的情况下提前停止训练,防止模型过拟合影响泛化能力。

  1. from tensorflow.keras import callbacks
  2. # 早停止 回调函数
  3. callback_early_stopping = callbacks.EarlyStopping(
  4. monitor="loss",
  5. patience=10,#look at last 10 epochs
  6. min_delta=0.0001,#loss must improve by this amount
  7. restore_best_weights=True,
  8. )
  9. from tensorflow import keras
  10. from tensorflow.keras import layers
  11. from keras.models import Sequential
  12. # 构建RNN模型,结构为 输入-RNN-RNN-连续值输出
  13. input_shape=(X_train_win.shape[1],X_train_win.shape[2])
  14. print(input_shape)
  15. model = Sequential(
  16. [
  17. layers.Input(shape=input_shape),
  18. layers.SimpleRNN(units=128, return_sequences=True),
  19. layers.SimpleRNN(64, return_sequences=False),
  20. layers.Dense(1, activation="linear"),
  21. ]
  22. )
  23. # 优化器
  24. optimizer = keras.optimizers.Nadam(learning_rate=0.0001)
  25. model.compile(optimizer=optimizer, loss="mse")
  26. # 模型结构总结
  27. model.summary()
  28. # 模型训练
  29. batch_size = 20
  30. epochs = 50
  31. history = model.fit(X_train_win, y_train_win,
  32. batch_size=batch_size, epochs=epochs,
  33. callbacks=[
  34. callback_early_stopping
  35. ])

模型训练过程的损失函数(训练集上)的变化如下图所示。随着训练过程推进,模型损失不断优化,初期的优化和loss减小速度很快,后逐渐趋于平稳。


大约 10 个 epoch 后达到了最佳结果,训练好的模型就可以用于后续预测了,我们可以先对训练集进行预测,验证一下在训练集上学习的效果。

  1. # 训练集预测
  2. pred_train_y = model.predict(X_train_win)
  3. # 绘图
  4. plt.figure(figsize=(15, 6), dpi=80)
  5. plt.plot(np.array(train_y))
  6. plt.plot(pred_train_y)
  7. plt.legend(['Actual', 'Predictions'])
  8. plt.show()

模型在训练集上学习的效果还不错,大家可以看到预测结果和真实值对比绘图如下:

💡 模型预测&应用

我们要评估模型的真实表现,需要在它没有见过的测试数据上评估,大家记得我们在数据切分的时候预留了 20% 的数据,下面我们用模型在这部分数据上预测并评估。

  1. # 测试集预测
  2. pred_test_y = model.predict(X_test_win)
  3. # 预测结果绘制
  4. plt.figure(figsize=(15, 6), dpi=80)
  5. plt.plot(np.array(test_y))
  6. plt.plot(pred_test_y)
  7. plt.legend(['Actual', 'Predictions'])
  8. plt.show()


相对训练集来说,大家看到测试集上的效果稍有偏差,但是总体趋势还是预测得不错。

我们要考察这个模型对于时间序列预测的泛化能力,可以进行更严格一点的建模预测,比如将训练得到的模型应用与另一支完全没见过的股票上进行预测。如下为我们训练得到的模型对 Microsoft/微软股票价格的预测:



我们从图上可以看到,模型表现良好(预测存在一定程度的噪音,但它对总体趋势的预测比较准确)。

参考资料

  • 📘 深度学习教程:吴恩达专项课程 · 全套笔记解读: https://www.showmeai.tech/tutorials/35
  • 📘 自然语言处理教程:斯坦福CS224n课程 · 课程带学与全套笔记解读: https://www.showmeai.tech/tutorials/36
  • 📘 深度学习教程 | 序列模型与RNN网络: https://www.showmeai.tech/article-detail/225
  • 📘 NLP教程(5) - 语言模型、RNN、GRU与LSTM: https://www.showmeai.tech/article-detail/239

推荐阅读

🌍 数据分析实战系列 : https://www.showmeai.tech/tutorials/40
🌍 机器学习数据分析实战系列: https://www.showmeai.tech/tutorials/41
🌍 深度学习数据分析实战系列: https://www.showmeai.tech/tutorials/42
🌍 TensorFlow数据分析实战系列: https://www.showmeai.tech/tutorials/43
🌍 PyTorch数据分析实战系列: https://www.showmeai.tech/tutorials/44
🌍 NLP实战数据分析实战系列: https://www.showmeai.tech/tutorials/45
🌍 CV实战数据分析实战系列: https://www.showmeai.tech/tutorials/46
🌍 AI 面试题库系列: https://www.showmeai.tech/tutorials/48

构建深度学习神经网络预测股票价格

基于机器学习的AI森林火灾预测

深圳SEO优化公司郴州SEO按天计费价格合肥网站改版公司秦皇岛企业网站设计湘西推广网站报价新余SEO按天扣费南充网站搭建多少钱泉州网站设计模板价格扬州seo网站优化哪家好六安营销型网站建设报价辽源网站推广工具价格汕头百度网站优化推荐坂田模板网站建设公司塘坑企业网站设计南联百度关键词包年推广推荐阜新百度seo推荐百色网站定制哪家好运城网站优化推广推荐松原网站优化按天扣费哪家好那曲网站推广方案推荐宜春模板推广价格临沂企业网站制作哪家好蚌埠英文网站建设推荐鞍山网络营销报价大浪seo优化多少钱龙岩网页设计推荐宝鸡网页制作多少钱仙桃模板推广哪家好郑州网站搜索优化多少钱运城网站推广价格淄博推广网站歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化