选短线个股的流程
(1)数据预处理,根据短线个股筛选标准,给个股日线数据打标。
(2)模型训练,针对每只股票,训练得到分类模型。
(3)结果预测,根据训练得到的模型,计算股票每日的分类预测值。
(4)策略回测,基于股票每日的分类预测值,回测策略收益情况。
(5)个股筛选,如果策略验证可行,即可根据模型筛选出当前符合买入条件的股票。
数据预处理
将短线个股的筛选问题处理为使用深度学习解决的分类问题,目标是筛选出10个交易日内,上涨幅度大于10%的股票。这里选择2017年12月31日及之前的数据作为训练数据,2018年1月1日之后的数据用于做预测。
股票范围选择
为了应用深度学习算法,需要有足够的训练数据。为此,选择2016年1月1日至2017年12月31日内日线数量多于300的个股,代码如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 4 10:42:49 2025@author: Administrator
"""
import pandas as pd # 导入pandas库,用于数据处理和分析stk_code_file = './stk_data/stk_list.csv' # 定义股票代码文件的路径
stk_list = pd.read_csv(stk_code_file)['code'].tolist() # 读取股票代码文件,提取code列并转换为列表pd_stocks_list = [] # 初始化符合条件的股票代码列表
for stk_code in stk_list: # 遍历所有股票代码df = pd.read_csv('./stk_data/d/{}.csv'.format(stk_code)) # 读取单只股票的日线数据# 筛选出2016年到2017年的数据,并检查交易天数是否超过300天if df[(df['date'] >= '2016-01-01') & (df['date'] <= '2017-12-31')].shape[0] > 300:pd_stocks_list.append(stk_code) # 如果符合条件,将股票代码添加到结果列表out_df = pd.DataFrame(pd_stocks_list, columns = ['code']) # 将结果列表转换为DataFrame
out_df.to_csv('./stk_data/dp_stock_list.csv', index = False) # 将结果保存为CSV文件,不包含行索引
训练数据计算
选择2017年12月31日及之前的数据作为训练数据,计算训练数据的输入特征及分类标签。将10个交易内上涨幅度超过10%的股票标记为类别1,其他股票标记为类别0。为了给深度学习模型提供更多的输入维度,可以基于日线数据的开盘价、收盘价、最高价、最低价、成交量等进行扩展。这里只扩展5、10、20、30、60、120、240均线及均量线数据,后续可根据需要计算MACD、KDJ、RSI等指标数据,进一步扩展输入维度。
程序的主要处理流程是:首先定义了买入信号的计算逻辑,即未来 N 个交易日内涨幅达到 INC_PER 则标记为买入信号;然后读取股票代码列表,逐个处理每只股票的数据,计算多种移动平均线指标;最后根据预设条件生成买入信号,并将所有处理后的数据保存到新文件中。注释部分还列出了其他可扩展的技术指标计算函数,方便后续扩展使用。
# -*- coding: utf-8 -*-
"""
Created on Thu Jun 5 08:54:22 2025@author: Administrator
"""
from __future__ import (absolute_import, division, print_function,unicode_literals)
import datetime # 用于datetime对象操作
import os.path # 用于管理路径
import sys # 用于在argvTo[0]中找到脚本名称
import pandas as pd
import numpy as np
# 引入topq_talib,计算技术指标
script_path = os.path.dirname(os.path.abspath(sys.argv[0]))
talib_path = os.path.join(script_path, '../../TQDat/TQDown2020v1/topqt/')
sys.path.append(talib_path)
import topq_talib1 as tt # 类别标准:N个交易日内上涨INC_PER
N = 10
INC_PER = 0.1# n 天内上涨inc_per,生成买入信号
def calc_buy_signal(df, n, inc_per):df = df[df.notnull().T.all()] # 过滤掉包含缺失值的行buy = np.zeros(df.shape[0]) # 初始化买入信号数组,全部设为0df.insert(df.shape[1], 'buy', buy) # 在DataFrame中插入buy列df = df.copy() # 复制DataFrame,避免后续操作影响原数据row_i = 0for row_i in range(df.shape[0]): # 遍历每一行for n_i in range(n): # 在未来n天内查找# 如果未来某天的收盘价相比当前行的收盘价涨幅超过inc_per,则标记为买入信号if row_i + n_i + 1 < df.shape[0] and \df.iloc[row_i + n_i + 1].at['close'] - df.iloc[row_i].at['close'] > inc_per * df.iloc[row_i].at['close']:df.loc[df.index[row_i], 'buy'] = 1 # 设置买入信号为1break # 找到符合条件的日期后跳出循环return df# 读入股票代码
stk_code_file = './stk_data/dp_stock_list.csv'
stk_pools = pd.read_csv(stk_code_file, encoding = 'gbk') # 读取股票代码池
# 对每个股票添加衍生数据
for stk_code in stk_pools['code']: # 遍历每个股票代码# 读入数据input_file = './stk_data/d/' + stk_code + '.csv'if not os.path.exists(input_file): # 检查文件是否存在continue # 不存在则跳过当前股票df = pd.read_csv(input_file, index_col = 0) # 读取股票数据,使用第一列作为索引df = df.sort_index(ascending = True) # 按索引升序排列数据# 计算移动平均线(MA)ma_list = [5, 10, 20, 30, 60, 120, 240]for i in ma_list:df = tt.MA_n(df, i) # 计算不同周期的移动平均线# 计算成交量移动平均线(vol_MA)vol_ma_list = [5, 10, 20, 30, 60, 120, 240]for i in vol_ma_list:df = tt.vol_MA_n(df, i) # 计算不同周期的成交量移动平均线'''可扩展指标#BBANDSdf = tt.BBANDS_UpLow(df, 20)#MACDdf = tt.MACD020(df, 12, 26)#KDJdf = tt.KDJ(df, 9, 3)#RSIdf = tt.RSI(df, 14)# A/Dad_list = [5, 10, 20, 30, 60, 120, 240]for i in ad_list:df = tt.ACCDIST(df, i)# ATRcdatr_list = [5, 10, 20, 30, 60, 120, 240]for i in atr_list:df = tt.ATR(df, i)'''df = calc_buy_signal(df, N, INC_PER) # 计算买入信号# 写出文件output_file = './baostock/data_ext/' + stk_code +'.csv'df.to_csv(output_file) # 将处理后的数据保存到新文件print(stk_code + ' done!') # 打印处理完成的股票代码