基于 Datawhale 开源量化投资学习指南(10):基于 LightGBM 的量化选股

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 训练模型,并在验证集和测试集中评估了模型的表现。该选股策略的核心在于结合机器学习算法,从历史数据中寻找能够捕捉股票短期涨跌的关键特征,从而为投资者提供辅助决策支持。

        虽然本文的模型取得了一定的效果,但这只是量化投资领域的一小部分。未来可以通过进一步优化模型参数、引入更多的市场因子和结合其他量化策略,来提升选股的准确性和投资回报。同时,实际操作中需要考虑交易成本、流动性、市场变化等因素,才能将策略更好地应用于实盘投资中。

        希望通过本篇文章的介绍,能够为大家在量化投资的探索中提供一些启发,并激发出更多的创新思路。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

猜你喜欢

转载自blog.csdn.net/ljd939952281/article/details/143119997