python量化交易学习笔记_Python量化交易学习笔记(45)——深度学习挖短线股5

前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,方便资料共享,定期发布学习任务,欢迎加入!

你可能感兴趣的:(python量化交易学习笔记)