首页 > 其他分享 >基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战

基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战

时间:2024-10-31 23:45:20浏览次数:8  
标签:学习指南 11 验证 train 参数 date 量化 data

1. 概述

        在前几篇文章中,我们初步探讨了如何通过LightGBM模型进行量化选股,并进行了一些简单的特征工程和模型训练。在这一篇文章中,我们将进一步深入,通过优化超参数和实现交叉验证来提高模型的效果,并最终通过回测分析来验证我们所选股票的表现。

2. LightGBM超参数优化

        LightGBM是一个高效的梯度提升框架,提供了许多超参数用于调整模型的表现。通过合理的超参数优化,我们可以显著提高模型的预测精度。我们重点调整以下几个重要参数:

  1. learning_rate:学习率,控制每次更新的幅度。学习率较低时,模型学习得更为精细,但需要更多的迭代次数;学习率较高时,模型收敛得更快,但可能会跳过最优解。
  2. num_leaves:树的叶子节点数。较高的叶子节点数可以让模型捕捉到更复杂的特征,但也容易过拟合。
  3. max_depth:树的最大深度,防止过拟合的一个重要参数。
  4. min_data_in_leaf:每个叶子节点的最小数据量,用于避免过拟合,尤其是在数据量较少的情况下。
  5. lambda_l1lambda_l2:L1和L2正则化参数,主要用来防止模型过拟合。

3. 超参数优化的方式

        有多种优化超参数的方法,常用的有网格搜索和贝叶斯优化。我们将在下面的部分中介绍如何通过交叉验证来验证这些参数组合的效果。

4. 交叉验证的实现

        交叉验证是防止过拟合的一种有效手段。通过将数据集划分为多个子集,交替使用其中的一部分作为验证集,其余部分作为训练集,可以更准确地评估模型的表现。在实际操作中,我们可以通过以下代码来实现交叉验证。

5. 模型回测与选股表现

        在超参数调优和交叉验证完成后,我们将对选出的股票进行回测分析。回测的目的是验证我们的选股策略在历史数据中的表现,以评估该策略的可行性。

        以下是详细的代码示例,展示了如何进行超参数调优、交叉验证以及选股策略的回测。

import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import tushare as ts

# 设置Tushare的token,获取数据
tushare_token = 'your_tushare_token'
ts.set_token(tushare_token)
pro = ts.pro_api()

# 获取股票数据
def get_stock_data(stock_code, start_date, end_date):
    df = pro.daily(ts_code=stock_code, start_date=start_date, end_date=end_date)
    df['trade_date'] = pd.to_datetime(df['trade_date'])
    df.set_index('trade_date', inplace=True)
    return df

# 示例股票代码
stocks = {
    '600519.SH': '贵州茅台',
    '601398.SH': '工商银行',
    '601318.SH': '中国平安'
}

data = pd.DataFrame()
for code, name in stocks.items():
    df = get_stock_data(code, '20180101', '20221231')
    data[name] = df['close']

# 数据预处理
data = data.pct_change().dropna()
labels = (data > 0.05).astype(int)  # 未来5天涨幅大于5%标记为1

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.values, labels.values, test_size=0.3, random_state=42)

# LightGBM超参数设置
params = {
    'objective': 'binary',
    'learning_rate': 0.01,
    'num_leaves': 31,
    'max_depth': -1,
    'lambda_l1': 0.1,
    'lambda_l2': 0.1,
    'metric': 'binary_logloss'
}

# 使用LightGBM进行交叉验证
d_train = lgb.Dataset(X_train, label=y_train)
cv_results = lgb.cv(params, d_train, nfold=5, num_boost_round=2000, early_stopping_rounds=50, metrics='binary_logloss')

# 超参数优化
param_grid = {
    'num_leaves': [31, 63, 127],
    'learning_rate': [0.01, 0.1, 0.05],
    'max_depth': [-1, 5, 10],
    'lambda_l1': [0.1, 0.5, 1.0],
    'lambda_l2': [0.1, 0.5, 1.0]
}

gbm = lgb.LGBMClassifier()
grid_search = GridSearchCV(gbm, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 最优参数输出
print("Best parameters found by grid search:", grid_search.best_params_)

# 使用最优参数训练模型
best_params = grid_search.best_params_
clf = lgb.LGBMClassifier(**best_params)
clf.fit(X_train, y_train)

# 预测结果
y_pred = clf.predict(X_test)

# 模型表现评估
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.4f" % accuracy)
print("Confusion Matrix:")
print(confusion_matrix(y_test, y_pred))

# 回测分析
data['strategy'] = clf.predict(data.values)
data['strategy_return'] = data['strategy'] * data.mean(axis=1)
cumulative_return = (1 + data['strategy_return']).cumprod()
cumulative_return.plot(figsize=(10, 6), title='Strategy Cumulative Return')
plt.show()

结语

        随着 量化投资 的迅猛发展,市场对系统化、数据驱动的投资策略的需求日益增多。本系列文章全面介绍了量化投资的各个关键环节,从基础概念到机器学习技术的实际应用,为读者提供了系统化的学习路径。

        在整个系列中,我们首先探讨了量化投资的基本框架与金融市场的运行机制,为后续的策略构建打下了扎实的基础。随后,我们重点介绍了股票数据的获取与处理,这一过程对于数据分析和策略设计至关重要。随着量化选股、择时、调仓、回测等核心策略的逐步深入,我们逐渐掌握了如何通过量化手段来进行投资决策,并通过实战演练验证策略的有效性。

        在文章的最后部分,我们探讨了如何结合机器学习技术,特别是通过如LightGBM这样的模型,进一步提升量化策略的表现。这一创新思路展现了数据驱动下的量化投资潜力,使得投资决策不仅更为精确,还能在复杂市场条件下保持策略的稳定性。

        希望通过本系列的学习,大家不仅能够掌握量化投资的理论知识,还能够在实际中灵活应用这些方法,构建自己的量化投资策略。量化投资领域的广阔与多样性,给我们提供了无限的可能性,数据驱动的未来必将是智慧投资的时代。愿大家在这条不断探索的路上不断创新,实现更加精准、高效的投资成果。

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

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

谢谢大家的支持!

标签:学习指南,11,验证,train,参数,date,量化,data
From: https://blog.csdn.net/ljd939952281/article/details/143120574

相关文章

  • [超级硬件混响插件]TEGELER Audio Manufaktur RaumMaschine v1.1.8 [MacOSX, WiN](45.9
    Tegeler推出了一款混响效果器:Raummaschine,结合了高质量的DSP引擎和模拟管路,提供出色的声音和灵活性。Raummaschine是基于其硬件设计而创造的。这款独特的混响单元结合了高质量的DSP引擎、模拟管路和每个通道上的两个双三极管,以及输入和输出变压器。通过模拟硬件版本的每个方面......
  • 关于visual stdio 2022代码在win11上运行异常缓慢的解决方案分享
        此篇博客记录笔者解决visualstdio2022运行c语言异常缓慢的解决方案。    起初我上网查资料得知可能是我的模块加载太多了,但是在禁用了额外的模块依然异常缓慢,我就继续查找资料,于是发现另一篇博客反应了和我一样的问题,他的解决方案是关闭联想自带的安全......
  • VMwareWorkstation pro 17安装Win11(亲测好用)
    1、安装包   我用夸克网盘分享了「Win11_23H2_China_GGK_Chinese_Simplified_x64v2.iso」,点击链接即可保存。打开「夸克APP」:链接:https://pan.quark.cn/s/817ccfc90f29提取码:pPn12、安装教程(基于WMwareworkstationpro17)1)       打开WMwareWorkstation,点击......
  • Linux (11) 使用ATOP工具
    《WindowsAzurePlatform系列文章目录》 1.问题描述:之前遇到了部分MySQL虚拟机,操作系统盘和数据盘的磁盘读取(DiskRead)突增,同时虚拟机可用内存突然减少,最后发生OOM(OutofMemory)。如下图: 2.通过安装LinuxATOP工具,监控虚拟,具体的部署脚本#!......
  • w011基于springboot的课程作业管理系统
    ......
  • DAY49 ||1143.最长公共子序列| 1035.不相交的线 | 53. 最大子序和 |392.判断子序列
    1143.最长公共子序列题目:1143.最长公共子序列-力扣(LeetCode)给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的......
  • Windows11系统iisetw.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个iisetw.dll文件(挑选合适的版本文件)把它放......
  • windows11快速打开软件,快速打开记事本
    前言本次分享为:通过'运行'打开常用程序在运行上输入对应程序名称,达到快速打开软件的目的下面请看演示本次案例以常用程序NotePad(记事本)为例目录前言演示找到记事本文件夹(路径)常用目录查找方式非常用查找方式创建快捷方式创建文件夹打开系统变量测试演示找到记......
  • 全新 PAN211X,创新技术加持。抗干扰强,兼容性好,让工程师的设计如虎添翼
    在当今科技飞速发展的时代,各种先进的电子设备不断涌现,而在众多优秀的产品中,PAN211X以其卓越的性能和独特的优势脱颖而出。一、2.4G无线射频:畅享高速连接PAN211X具备强大的2.4G无线射频功能,为用户带来了高速、稳定的无线连接体验。在这个信息时代,快速的数据传输至关重要,而......
  • POI2011/洛谷P3523 DYN-Dynamite
    前言Link本来一个很直观的题面,非要搞形式化题意反而使题意变得非常迷惑。题意有一栋树形建筑,其中有一些点摆放了TNT,树边上都摆放了引信,引信的燃烧时间为\(1\)秒\(/\)边,现在你要选择\(m\)个点同时点燃引信(起爆),则显然TNT被引爆的时间为到离它最近的起爆处的距离,请你求......