1. 引言
量化选股通过运用机器学习算法,结合股票市场的历史数据,预测股票的未来表现,从而辅助投资者进行科学决策。在本篇实战篇中,我们将使用 LightGBM 这一强大的机器学习工具,来实现量化选股的流程。我们将选股问题转化为一个监督学习分类问题,通过训练机器学习模型来预测短期股价的涨跌。
本文的目标是:如果一只股票在未来5天内的最高增长率大于5%,最大损失率小于-3%,我们将其标记为 1,即选为投资标的;否则标记为 0,不进行投资。
整个流程包括数据下载、特征工程、模型训练和评估几个主要步骤。下面将通过代码逐步演示如何实现这一量化选股策略。
2. 数据下载
首先,我们通过 Tushare
工具下载股票的基础信息和交易数据。Tushare
提供了丰富的金融市场数据接口,是进行量化分析的常用工具之一。
import tushare as ts
import pandas as pd
import os
import time
from tqdm import tqdm
# 设置Tushare token
mytoken = ' ' # 填入您的Tushare token
ts.set_token(mytoken)
pro = ts.pro_api()
# 保存路径设置
save_path = './stock'
if not os.path.exists(save_path):
os.mkdir(save_path)
# 下载上市公司基础信息
company_path = os.path.join(save_path, 'company_info.csv')
if not os.path.exists(company_path):
pool = pro.stock_basic(exchange='', list_status='L', adj='qfq',
fields='ts_code, name, market, exchange, is_hs')
pool.to_csv(company_path, index=False, encoding='utf-8')
else:
pool = pd.read_csv(company_path)
print('获得上市股票总数:', len(pool))
接下来,我们爬取每支股票的交易信息并保存到本地。为了防止触发接口调用限制,适当延时并逐步获取数据。
# 下载股票交易信息
startdate = '20180701'
enddate = '20230630'
stock_inf_path = os.path.join(save_path, 'OldData')
if not os.path.exists(stock_inf_path):
os.mkdir(stock_inf_path)
for i, code in enumerate(pool.ts_code):
print(f'正在获取第{i + 1}只股票:{code}')
path = os.path.join(stock_inf_path, f'{code}_NormalData.csv')
if not os.path.exists(path):
time.sleep(0.301)
df = ts.pro_bar(ts_code=code, start_date=startdate, end_date=enddate, freq='D')
df.to_csv(path, index=False)
3. 数据预处理
在数据预处理中,我们会对获取到的股票交易数据进行清洗和特征工程,包括离散变量的编码和连续变量的特征转换。
3.1 离散变量编码
# 对上市公司基础信息进行处理,编码离散变量
market_map = {'主板': 0, '中小板': 1}
exchange_map = {'SZSE': 0, 'SSE': 1}
is_hs_map = {'S': 0, 'N': 1, 'H': 2}
company_info = pd.read_csv(company_path, encoding='utf-8')
company_info['market'] = company_info['market'].map(market_map)
company_info['exchange'] = company_info['exchange'].map(exchange_map)
company_info['is_hs'] = company_info['is_hs'].map(is_hs_map)
company_info.dropna(inplace=True)
3.2 特征工程
我们将股票的价格数据(开盘价、收盘价、最高价等)进行缩放处理,以保证不同股票的特征尺度统一。
# 价格数据特征变换
col = ['close', 'open', 'high', 'low']
for tmp_col in col:
stock_info[f'{tmp_col}_transform'] = (stock_info[tmp_col] - stock_info['pre_close']) / stock_info['pre_close']
同时,我们提取过去5天的股价变化作为模型的特征,方便模型学习股票短期内的价格变化趋势。
# 提取前5天收盘价的变化特征
for i in range(5):
tmp_df = stock_info[['ts_date_id', 'close']].rename(columns={'close': f'close_shift_{i + 1}'})
tmp_df['ts_date_id'] = tmp_df['ts_date_id'] + i + 1
stock_info = stock_info.merge(tmp_df, on='ts_date_id')
4. 标签生成
我们将预测的标签设定为股票在未来5天内是否满足涨幅超过5%且跌幅不超过-3%的条件。如果满足条件,则标记为 1,否则为 0。
# 标签生成
stock_info['label_max'] = stock_info[['high_shift_1', 'high_shift_2', 'high_shift_3', 'high_shift_4', 'high_shift_5']].max(axis=1)
stock_info['label_min'] = stock_info[['low_shift_1', 'low_shift_2', 'low_shift_3', 'low_shift_4', 'low_shift_5']].min(axis=1)
stock_info['label_final'] = (stock_info['label_max'] > 0.05) & (stock_info['label_min'] > -0.03)
stock_info['label_final'] = stock_info['label_final'].astype(int)
5. 模型训练
我们将使用 LightGBM 来训练分类模型,并评估其在验证集和测试集上的表现。
import lightgbm as lgb
from sklearn import metrics
# 模型参数设置
params = {
'learning_rate': 1e-3,
'boosting_type': 'gbdt',
'objective': 'binary',
'metric': 'mse',
'num_leaves': 128,
'feature_fraction': 0.8,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'seed': 1
}
# 训练集、验证集、测试集划分
trn_data = lgb.Dataset(trn, trn_label)
val_data = lgb.Dataset(val, val_label)
clf = lgb.train(params, trn_data, 2000, valid_sets=[trn_data, val_data])
# 模型预测
oof_lgb = clf.predict(val)
test_lgb = clf.predict(test)
6. 模型评估
通过混淆矩阵和敏感度来评估模型的表现。
# 验证集评估
oof_lgb_final = np.round(oof_lgb)
print('准确率:', metrics.accuracy_score(val_label, oof_lgb_final))
print('混淆矩阵:', metrics.confusion_matrix(val_label, oof_lgb_final))
tp = np.sum((oof_lgb_final == 1) & (val_label == 1))
pp = np.sum(oof_lgb_final == 1)
print('敏感度:%.3f' % (tp / pp))
结语
通过本篇文章,我们深入探索了如何运用 LightGBM 机器学习模型实现量化选股。首先,我们通过获取股票的历史数据,进行特征工程和标签制作,将选股问题转化为一个分类问题。接着,我们使用 LightGBM 训练模型,并在验证集和测试集中评估了模型的表现。该选股策略的核心在于结合机器学习算法,从历史数据中寻找能够捕捉股票短期涨跌的关键特征,从而为投资者提供辅助决策支持。
虽然本文的模型取得了一定的效果,但这只是量化投资领域的一小部分。未来可以通过进一步优化模型参数、引入更多的市场因子和结合其他量化策略,来提升选股的准确性和投资回报。同时,实际操作中需要考虑交易成本、流动性、市场变化等因素,才能将策略更好地应用于实盘投资中。
希望通过本篇文章的介绍,能够为大家在量化投资的探索中提供一些启发,并激发出更多的创新思路。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!