前4篇文章分别记录了利用深度学习挖短线股的数据预处理、模型训练、结果预测及策略回测过程,本文记录根据筛选短线股票的过程。
选股流程
1.股票数据下载更新
例如现在是2020年11月23日19:00,我们想找到按深度学习策略,明天应该买什么股票。那么首先将股票日线数据更新至2020年11月23日,日线数据下载可参考笔记(39)。
2.股票扩展数据计算
计算股票的扩展指标,参考笔记(41)第2部分内容。
这里可以做进一步优化,如果每天都进行扩展数据计算,实际只需要对更新的当日数据进行计算,而无需对历史数据进行重新计算,这样可以大幅减少计算时间。
对比第1步数据下载更新,如果每天都进行更新下载,则实际每天只需下载当日K线数据,所需时间也会相应减少。
3.预测数据处理
完成扩展指标计算后,需要将近10日的指标都合并到当天数据上(参考笔记(41)),将数据转为输入特征。
# 准备特征数据
# 删除无效数据列,保留特征数据
df.drop(columns=['date', 'buy'], inplace=True)
# 取后FEATURE_N行数据
df = df.iloc[-FEATURE_N:]
# 生成用于预测的特征
arr = df.values.reshape(1, -1)
# 将数据导入输入字典
input_dict = {}
for i in range(arr.shape[1]):
input_dict[i] = arr[0][i]
input_dict = {name: tf.convert_to_tensor([value]) for name, value in input_dict.items()}
4.加载模型进行预测
加载笔记(42)训练得到的模型,对上一步的输入做预测。
# 加载模型
loaded_model = keras.models.load_model('./model/{}'.format(stk_code))
# 进行预测
predictions = loaded_model.predict(input_dict)
5.正则化选股
参考笔记(44)中使用的正则化,读取笔记(43)所得到的预测数据,对当前预测结果进行正则化,排序选出预测数值最大的股票,即为优选股票。
# 正则化
# 读入批量预测值
df = pd.read_csv('./baostock/predict_results/{}res.csv'.format(stk_code))
res_list = df['predict_result'].tolist()
# 添加当日预测结果
res_list.append(predictions[0][0])
# 正则化当日预测结果
delta = max(res_list) - min(res_list)
result_dict[stk_code] = (predictions[0][0] - min(res_list)) / delta
print(sorted(result_dict.items(), key=lambda x: x[1], reverse=True))
输出结果
程序会不断输出类似这样的结果:
[('sh.600104', 1.0), ('sh.600114', 1.0), ('sh.600168', 1.0), ('sh.600219', 1.0), ('sh.600257', 1.0), ('sh.600507', 1.0), ('sh.600570', 1.0), ('sh.600589', 1.0), ('sh.600616', 1.0),...
即,按正则化预测值从大到小的顺序输出股票代码及其预测值。但是速度是超级慢,24小时只处理了1000多只股票。
分析思考
利用深度学习去挖个股的路线已经走通,但是效果和效率上都有待提升。
输入特征方面,目前仅使用了几个简单维度的指标作为特征,可以通过计算其他指标来增加收入特征,也可以通过分析剔除作用较小的特征。
网络模型方面,目前使用的神经网络层数较少,节点数固定,可通过增加网络层数、调整节点树木进一步调优。
样本处理方面,短期暴涨显然是小概率事件,也就导致我们训练时,暴涨的样本数量较少。所以我们的问题成为一个不平衡分类问题。这就是虽然在训练中看到准确率高达近90%,但是回测结果依然有限的原因。需要对此类问题进行针对性处理。
模型的训练及预测时间过长,缺乏实用性,除了升级硬件、改进代码外,可以考虑选择部分股票作为选股范围。
选股代码:
import tensorflow as tf
import numpy as np
import pandas as pd
import os
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import backend
# 使用前FEATURE_N的K线数据作为输入特征
FEATURE_N = 10
# 存储预测结果字典
result_dict = {}
# 存储参与深度学习策略的股票
stk_code_file = './stk_data/dp_stock_list.csv'
# 读取股票列表
stk_list = pd.read_csv(stk_code_file)['code'].tolist()
# 对每只股票分别进行预测,计算归一化后的预测值
for stk_code in stk_list:
print('processing {}...'.format(stk_code))
# 读取扩展指标
df = pd.read_csv('./baostock/data_ext/{}.csv'.format(stk_code))
# 没有足够的特征数据就跳过
if df.shape[0] < FEATURE_N:
continue
# 准备特征数据
# 删除无效数据列,保留特征数据
df.drop(columns=['date', 'buy'], inplace=True)
# 取后FEATURE_N行数据
df = df.iloc[-FEATURE_N:]
# 生成用于预测的特征
arr = df.values.reshape(1, -1)
# 预测
# 将数据导入输入字典
input_dict = {}
for i in range(arr.shape[1]):
input_dict[i] = arr[0][i]
input_dict = {name: tf.convert_to_tensor([value]) for name, value in input_dict.items()}
# 加载模型
loaded_model = keras.models.load_model('./model/{}'.format(stk_code))
# 进行预测
predictions = loaded_model.predict(input_dict)
# 正则化
# 读入批量预测值
df = pd.read_csv('./baostock/predict_results/{}res.csv'.format(stk_code))
res_list = df['predict_result'].tolist()
# 添加当日预测结果
res_list.append(predictions[0][0])
# 正则化当日预测结果
delta = max(res_list) - min(res_list)
result_dict[stk_code] = (predictions[0][0] - min(res_list)) / delta
print(sorted(result_dict.items(), key=lambda x: x[1], reverse=True))
# 清理内存
backend.clear_session()
print(sorted(result_dict.items(), key=lambda x: x[1], reverse=True))
欢迎大家关注、点赞、转发、留言,感谢支持!
为了便于相互交流学习,已建微信群,感兴趣的读者请加微信。
近期新建QQ群:676186743,方便资料共享,定期发布学习任务,欢迎加入!