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量化交易学习笔记(45)——深度学习挖短线股5_第1张图片
Python量化交易学习笔记(45)——深度学习挖短线股5_第2张图片

你可能感兴趣的:(Python量化交易,Keras,深度学习,python,深度学习,人工智能,神经网络,量化交易)