此project是基于django的web app。它能给出指定范围内公司(此处为10个)的历史股票数据与未来某段时间的预测数据以及对该股票的一些评价指标。 股票预测模型是使用jaungiers提出的一种LSTM Neural Network模型。 并使用以tensorflow作为backend的keras来搭建、训练模型。
本文完整源码 获取方式:
关注微信公众号 datayx 然后回复 股票 即可获取。
如果只运行web项目,则只需安装如下包:
如果需要训练模型或者使用模型来预测(注:需要保证本机拥有 NVIDIA GPU以及显卡驱动),则还需要安装:
可以通过控制台在根目录路径下输入:pip install -r requirements.txt
安装上述所有包(注意修改cudatoolkit和cudnn的版本与自己电脑的GPU型号一致)。
首先你需要将此项目clone或者download到本地。然后在控制台,进入项目根目录即WebStockPredict(包含有manage.py的目录),输入如下面命令,启动Web应用:
python manage.py runserver
此时在浏览器中输入:http://http://127.0.0.1:8000/stock_predict/home/
即可访问应用,通过下拉框选择查看某个公司过去20天的历史股票数据和未来10天的预测数据。
在Web app中绘制的10天预测数据,大多都是朝着一个方向变化。这是因为股票数据是一个随机过程,无法使用既有的模型去准确预测未来一段时间的数据,只能给出股票未来变化的趋势。 在我们使用jaungiers提出的模型中他详细阐述了这个问题。 我们预测输出符合他给出的实验图,如下:
本项目为了演示方便,只使用了10个公司的股票数据来进行模型训练,实际上可以依据个人需求,训练成百上千个公司的数据。注:这个项目只是用来演示,并不保证预测的真实性,请勿用于真实炒股.
训练模型的数据,即10个公司的历史股票数据。获取国内上市公司历史股票数据来源于网易的API:'http://quotes.money.163.com/service/chddata.html',详细使用请参考数据接口-免费版(股票数据API)。 在LSTMPredictStock/core/get_domestic_hist_stock.py 中
get_domestic_stock(sticker_code,
start_date, end_date):
函数用于获取10个公司起始至终止日期的股票数据,并以csv格式保存在 LSTMPredictStock/data下。csv格式方便用pandas读取,输入到LSTM神经网络模型, 用于训练模型以及预测股票数据。
我们的Web app,还给出了每个公司的股票评价指标。这些数据是从数据猫的网站上爬取的,在数据猫的网站上给出了股票的很多项评价指标(如下图), 而我们只选择了其中几个评价指标来展示。爬虫程序:stock_predict/get_stock_index.py,调用main(stockcode)
方法可以获得指定股票代码的评价指标数据, 它会在stock_predict下创建stock_index文件夹,以csv格式保存爬取的数据。另外,需要注意的是,因为数据猫需要用户登录以后才能查看相应的股票数据,所以在 运行get_stock_index.py时,需要自己先在浏览器登录数据猫后,得到cookie中的参数(按F12,选择Application选项卡即可看到,如下图), 然后在get_stock_index.py中修改下面代码块中对应的字符串变量‘+’后面的值
UM_distinctid = "UM_distinctid=" + "167d4244a665d3-0bc7b9a22f42f1-4313362-144000-167d4244a67440;"
PHPSESSID = "PHPSESSID=" + "4j67ed7bo6ogs6ntjmo3fb62n4;"
CNZZDATA1256448133 = "CNZZDATA1256448133=" + "1846506456-1545449269-%7C1545479258;"
amvid = "amvid=" + "6447ffafff063060f1a560d94128a33f"
cookie={'Cookie':UM_distinctid+PHPSESSID+CNZZDATA1256448133+amvid}
train_all_stock
,它首先会调用get_all_last_data(start_date="2010-01-01")
方法获得10个公司从2010年至今年的历史数据train_model(stock_code, predict=False)
方法基于上述数据来训练模型,若predict=True,则在训练完后会进行模型正确性的验证, 主要是通过绘图方式来对比预测数据与真实数据之间的吻合度predict_all_stock(pre_len=10)
来对10个公司的股票进行预测,pre_len指定预测的天数,默认是10天prediction(stock_code, real=True, pre_len=30, plot=False)
来完成预测。 在 model.load_model(file_path)
这里恢复了模型。它默认使用每个公司近30天的历史数据作为模型输入来得到pre_len天的预测数据使用django自带的测试工具来实现单元测试,测试程序位于stock_predict/test.py,在控制台根目录下使用命令`
python manage.py test stock_predict' 来运行test.py。
如果想完成集成测试,则需要借助第三方库:coverage.py,可以通过pip install coverage
安装,详情使用参考coverage.py。
coverage run --source='.' manage.py test stock_predict
来执行test.py
coverage report
命令,可以生成简易的测试报告coverage html
命令,其会在根目录下生成htmlcov文件夹,里面包含自动生成的html页面,点击index.html可查看整个项目以及各个文件的测试覆盖率,如下图: