免责声明:这篇文章记录我在做这个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上获取的股票基础信息之外,我们这里还引入一些金融行业关于股票的一些技术指标:
技术指标
- ROC :股票变动率
- william_r: 威廉指標
- Money flow index : 资金流量指标
- Ulcer index : 溃疡指数
- Average true range:真实波动幅度均值
- Simple moving average : 移动平均线
- Exponential moving average : 指数移动平均值
以上就是股票市场里面金融分析师会用的一些技术指标了。这些指标都是可以根据股票价格计算出来的,公式以及其含义也比较简单,不多阐述。
数据预处理
股票数据属于时间序列数据,时间序列数据一般会有周期性,这里我们可以利用statsmodels API,对股票数据进行分析,这里以TSLA
为例:
从图中的分析结果来看,TESLA股票的确有着显著的周期性。所以这里我们需要处理掉周期性对股票预测时候的影响。这里我们采用差分的方式对股票时间序列数据中的周期性进行去除,以下是去除周期性后的股票价格:
关于如何去除时间序列数据中包含的趋势和周期性,可以参照这篇文章remove-trends-seasonality-difference-transform-python
数据部分处理完成之后,我们就可以训练模型了。
LSTM
首先我们使用经典的序列数据预测模型LSTM。全称 Long Short-Term Memory,中文名称为长短期记忆。
LSTM是一种特殊的RNN网络,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸的问题,相比普通的RNN,LSTM能够在长序列中有更好的表现。
而LSTM的内部是通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息。
关于如何理解LSTM,可以参考这篇文章:https://colah.github.io/posts/2015-08-Understanding-LSTMs/
以下是利用LSTM对TESLA股价的预测结果
Transformer
我们还可以用在语音和图片领域都表现出色的Transformer
模型来对股票价格进行预测
以下是利用Transformer对TESLA股票价格预测结果。
整体预测的准确性上和LSTM
差不太多。Transformer小有优势:
Model | RMSE |
---|---|
transformer | 56.239713918089585 |
lstm | 56.708656591988834 |
模拟交易
有了预测模型之后,我们可以制定一些简单的交易策略了。这里我们参照 getting-rich-quick-with-machine-learning-and-stock-market-predictions这篇文章里面的交易策略。
策略也很简单,就是那预测第二天的股票价格和当天的收盘价做比较,高了就买,底了就卖。然后计算测试数据的投资回报率。
下图是测试的结果
code: stock_prediction