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

1. 概述
在前几篇文章中,我们初步探讨了如何通过LightGBM模型进行量化选股,并进行了一些简单的特征工程和模型训练。在这一篇文章中,我们将进一步深入,通过优化超参数和实现交叉验证来提高模型的效果,并最终通过回测分析来验证我们所选股票的表现。
2. LightGBM超参数优化
LightGBM是一个高效的梯度提升框架,提供了许多超参数用于调整模型的表现。通过合理的超参数优化,我们可以显著提高模型的预测精度。我们重点调整以下几个重要参数:
- learning_rate:学习率,控制每次更新的幅度。学习率较低时,模型学习得更为精细,但需要更多的迭代次数;学习率较高时,模型收敛得更快,但可能会跳过最优解。
- num_leaves:树的叶子节点数。较高的叶子节点数可以让模型捕捉到更复杂的特征,但也容易过拟合。
- max_depth:树的最大深度,防止过拟合的一个重要参数。
- min_data_in_leaf:每个叶子节点的最小数据量,用于避免过拟合,尤其是在数据量较少的情况下。
- lambda_l1和lambda_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这样的模型,进一步提升量化策略的表现。这一创新思路展现了数据驱动下的量化投资潜力,使得投资决策不仅更为精确,还能在复杂市场条件下保持策略的稳定性。
希望通过本系列的学习,大家不仅能够掌握量化投资的理论知识,还能够在实际中灵活应用这些方法,构建自己的量化投资策略。量化投资领域的广阔与多样性,给我们提供了无限的可能性,数据驱动的未来必将是智慧投资的时代。愿大家在这条不断探索的路上不断创新,实现更加精准、高效的投资成果。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!
相关文章:
基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战
1. 概述 在前几篇文章中,我们初步探讨了如何通过LightGBM模型进行量化选股,并进行了一些简单的特征工程和模型训练。在这一篇文章中,我们将进一步深入,通过优化超参数和实现交叉验证来提高模型的效果,并最终通过回测分…...
Python4
4. 更多控制流工具 除了刚介绍的 while 语句,Python 还用了一些别的。我们将在本章中遇到它们。 4.1. if 语句 if elif else if x<0: x 0 print(Negative changed to zero) elif x0: print( zero) else: print(More) 4.2. for 语句 Pyth…...
springboot系列--web相关知识探索六
一、前言 web相关知识探索五中研究了请求中所带的参数是如何映射到接口参数中的,也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索五中主要研究自定义对象参数数据绑定底层原理。本次…...
FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误
FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1,降级MySQL ODBC2.2 解决2,修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名:admin,密…...
阿里云物联网的通信方式
阿里云物联网通信的两种方式,一个是物模型(分为服务,事件,属性),一个是自定义topic(要另外设置数据流转) 1.使用产品内的功能定义,(其实也就是Topic中定义好的…...
自由职业者的一天:作为小游戏开发者的真实工作日记
大家好,我是小蜗牛。 在这个快节奏的数字时代,自由职业者的生活往往充满了挑战与机遇。作为一名微信小游戏开发者,我的日常工作并不像人们想象中的那样充满光鲜亮丽的画面,而是由无数的编码、调试和创意碰撞组成的。今天…...
【RL Latest Tech】分层强化学习:Option-Critic架构算法
📢本篇文章是博主强化学习RL领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在…...
分布式数据库
前言 分布式数据库系统(DDBS)包含分布式数据库管理系统(DDBMS)和分布式数据库(DDB)。在分布式数据库系统中,一个应用程序可以对数据库进行透明操作,数据库中的数据分别在不同的…...
MySQL(2)【库的操作】
阅读导航 引言一、创建数据库1. 基本语法2. 创建数据库案例📌创建名为db1的数据库📌创建一个使用utf8字符集的db2数据库📌创建一个使用utf8字符集,并带校对规则的db3数据库 二、字符集和校验规则1. 查看系统默认字符集以及校验规则…...
python pip更换(切换)国内镜像源
国内镜像源列表(个人推荐清华大学的源) 清华大学: https://pypi.tuna.tsinghua.edu.cn/simple阿里云: http://mirrors.aliyun.com/pypi/simple豆瓣: http://pypi.douban.com/simple中国科技大学: https://pypi.mirrors.ustc.e…...
阿里云镜像源无法访问?使用 DaoCloud 镜像源加速 Docker 下载(Linux 和 Windows 配置指南)
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCode💫 Gitee …...
使用 BERT 和逻辑回归进行文本分类及示例验证
使用 BERT 和逻辑回归进行文本分类及示例验证 一、引言 在自然语言处理领域中,文本分类是一项至关重要的任务。本文将详细介绍如何结合 BERT 模型与逻辑回归算法来实现文本分类,并通过实际示例进行验证。 二、环境准备 为了运行本文中的代码…...
【skywalking 】监控 Spring Cloud Gateway 数据
使用Spring Cloud 开发,用Skywalking 监控服务,但是Skywalking 默认是不支持 Spring Cloud Gateway 网关服务的,需要手动将 Gateway 的插件添加到 Skywalking 启动依赖 jar 中。 skywalking相关版本信息 jdk:17skywalking&#x…...
SpringWeb
SpringWeb SpringWeb 概述 SpringWeb 是 spring 框架中的一个模块,基于 Servlet API 构建的 web 框架. springWeb 是 Spring 为 web 层开发提供的一整套完备的解决方案。 在 web 层框架历经 Strust1,WebWork,Strust2 等诸多产品的历代更…...
嵌入式刷题(day21)
MySQL和sqlite的区别 MySQL和SQLite是两种常见的关系型数据库管理系统(RDBMS),但它们在特性、使用场景和架构方面有显著的区别: 1. 架构 MySQL:是一个基于服务器的数据库系统,遵循客户端-服务器架构。MySQL服务器运行在主机上,客户端通过网络连接并发送查询。它可以并…...
OpenAI 下一代旗舰模型现身?奥尔特曼亲自辟谣“猎户座“传闻
在人工智能领域最受瞩目的ChatGPT即将迎来两周岁之际,一场关于OpenAI新旗舰模型的传闻再次引发业界热议。然而,这场喧嚣很快就被OpenAI掌门人奥尔特曼亲自澄清。 事件源于科技媒体The Verge的一则报道。据多位知情人士透露,OpenAI可能会在11…...
【C++】STL初识
【C】STL初识 文章目录 【C】STL初识前言一、STL基本概念二、STL六大组件简介三、STL三大组件四、初识STL总结 前言 本篇文章将讲到STL基本概念,STL六大组件简介,STL三大组件,初识STL。 一、STL基本概念 STL(Standard Template Library,标准…...
框架篇补充(东西多 需要重新看网课)
什么是AOP 面向切面编程 降低耦合 提高代码的复用 Spring的bean的生命周期 实例化bean 赋值 初始化bean 使用bean 销毁bean SpringMVC的执行流程 Springboot自动装配原理 实际上就是为了从spring.factories文件中 获取到对应的需要 进行自动装配的类 并生成相应的Bean…...
合约门合同全生命周期管理系统:企业合同管理的数字化转型之道
合约门合同全生命周期管理系统:企业合同管理的数字化转型之道 1. 引言 在现代企业中,合同管理已经不再是简单的文件存储和审批流程,而是企业合规性、风险管理和业务流程的关键环节之一。随着企业规模的扩大和合同数量的增加,传统…...
等保测评与风险管理:识别、评估和缓解潜在的安全威胁
在信息化时代,数据已成为企业最宝贵的资产之一,而信息安全则成为守护这份资产免受侵害的重中之重。等保测评(信息安全等级保护测评)作为保障信息系统安全的重要手段,其核心在于通过科学、规范、专业的评估手段…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...
