免责声明:这篇文章记录我在做这个mini site project时候的一些知识点,从最终预测的结果来看,效果不太理想。投资有风险,入市需谨慎。

本文中的代码多数是参考: https://github.com/olof98johansson/StockPrediction.git

股票数据获取和处理

获取股票数据

我们这里借助 pandas_datareader 这个库来获取目标股票的信息。比如可以通过如下的代码获取Telsa股票信息:

import pandas_datareader.data as web
df = web.DataReader("TSLA", data_source="yahoo")

数据格式如下:

Date High Low Open Close Volume Adj Close
2022-02-08 926.23 894.80 905.53 922.00 16909700.0 922.00
2022-02-09 946.27 920.00 935.00 932.00 17419800.0 932.00
2022-02-10 943.81 896.70 908.40 904.55 22042300.0 904.55
2022-02-11 915.96 850.70 909.63 860.00 26492700.0 860.00

下面对上述获取的股票信息做一些名词解释:

  • High : 当日最高成交价
  • Low : 当日最低成交价
  • Open : 当日开盘价格
  • Close : 当日收盘价格
  • Volume : 当日资金总量
  • Adj Close : 当日股票收盘价调整后的价格。什么是Adj Close

除了从Yahoo Finance上获取的股票基础信息之外,我们这里还引入一些金融行业关于股票的一些技术指标:

技术指标

以上就是股票市场里面金融分析师会用的一些技术指标了。这些指标都是可以根据股票价格计算出来的,公式以及其含义也比较简单,不多阐述。

数据预处理

股票数据属于时间序列数据,时间序列数据一般会有周期性,这里我们可以利用statsmodels API,对股票数据进行分析,这里以TSLA为例:

TESLA Stock Analysis

从图中的分析结果来看,TESLA股票的确有着显著的周期性。所以这里我们需要处理掉周期性对股票预测时候的影响。这里我们采用差分的方式对股票时间序列数据中的周期性进行去除,以下是去除周期性后的股票价格:

TESLA Stock Analysis

关于如何去除时间序列数据中包含的趋势和周期性,可以参照这篇文章remove-trends-seasonality-difference-transform-python

数据部分处理完成之后,我们就可以训练模型了。

LSTM

首先我们使用经典的序列数据预测模型LSTM。全称 Long Short-Term Memory,中文名称为长短期记忆。

LSTM是一种特殊的RNN网络,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸的问题,相比普通的RNN,LSTM能够在长序列中有更好的表现。

LSTM

而LSTM的内部是通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息。

LSTM

关于如何理解LSTM,可以参考这篇文章:https://colah.github.io/posts/2015-08-Understanding-LSTMs/

以下是利用LSTM对TESLA股价的预测结果 TESLA LSTM Prediction Results

Transformer

我们还可以用在语音和图片领域都表现出色的Transformer模型来对股票价格进行预测

以下是利用Transformer对TESLA股票价格预测结果。 TESLA Transformer Prediction Results

整体预测的准确性上和LSTM差不太多。Transformer小有优势:

Model RMSE
transformer 56.239713918089585
lstm 56.708656591988834

模拟交易

有了预测模型之后,我们可以制定一些简单的交易策略了。这里我们参照 getting-rich-quick-with-machine-learning-and-stock-market-predictions这篇文章里面的交易策略。

策略也很简单,就是那预测第二天的股票价格和当天的收盘价做比较,高了就买,底了就卖。然后计算测试数据的投资回报率。

下图是测试的结果 TESLA Trade Results

code: stock_prediction