当前位置: 首页 > news >正文

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

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这样的模型,进一步提升量化策略的表现。这一创新思路展现了数据驱动下的量化投资潜力,使得投资决策不仅更为精确,还能在复杂市场条件下保持策略的稳定性。

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

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

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

谢谢大家的支持!

相关文章:

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

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

Python4

4. 更多控制流工具 除了刚介绍的 while 语句&#xff0c;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相关知识探索五中研究了请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索五中主要研究自定义对象参数数据绑定底层原理。本次…...

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误

FreeSWITCH 简单图形化界面30 - 使用MYODBC时可能遇到的错误 测试环境1、 MYODBC 3.51.18 or higher2、分析和解决2.1 解决1&#xff0c;降级MySQL ODBC2.2 解决2&#xff0c;修改FreeSWITCH代码 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密…...

阿里云物联网的通信方式

阿里云物联网通信的两种方式&#xff0c;一个是物模型&#xff08;分为服务&#xff0c;事件&#xff0c;属性&#xff09;&#xff0c;一个是自定义topic&#xff08;要另外设置数据流转&#xff09; 1.使用产品内的功能定义&#xff0c;&#xff08;其实也就是Topic中定义好的…...

自由职业者的一天:作为小游戏开发者的真实工作日记

大家好&#xff0c;我是小蜗牛。 在这个快节奏的数字时代&#xff0c;自由职业者的生活往往充满了挑战与机遇。作为一名微信小游戏开发者&#xff0c;我的日常工作并不像人们想象中的那样充满光鲜亮丽的画面&#xff0c;而是由无数的编码、调试和创意碰撞组成的。今天&#xf…...

【RL Latest Tech】分层强化学习:Option-Critic架构算法

&#x1f4e2;本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在&#x1f…...

分布式数据库

前言 分布式数据库系统&#xff08;‌DDBS&#xff09;包含分布式数据库管理系统&#xff08;‌DDBMS&#xff09;和分布式数据库&#xff08;DDB&#xff09;。在分布式数据库系统中&#xff0c;一个应用程序可以对数据库进行透明操作&#xff0c;数据库中的数据分别在不同的…...

MySQL(2)【库的操作】

阅读导航 引言一、创建数据库1. 基本语法2. 创建数据库案例&#x1f4cc;创建名为db1的数据库&#x1f4cc;创建一个使用utf8字符集的db2数据库&#x1f4cc;创建一个使用utf8字符集&#xff0c;并带校对规则的db3数据库 二、字符集和校验规则1. 查看系统默认字符集以及校验规则…...

python pip更换(切换)国内镜像源

国内镜像源列表(个人推荐清华大学的源) ​ 清华大学&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simple阿里云&#xff1a; http://mirrors.aliyun.com/pypi/simple豆瓣&#xff1a; http://pypi.douban.com/simple中国科技大学&#xff1a; https://pypi.mirrors.ustc.e…...

阿里云镜像源无法访问?使用 DaoCloud 镜像源加速 Docker 下载(Linux 和 Windows 配置指南)

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode&#x1f4ab; Gitee &#x1f…...

使用 BERT 和逻辑回归进行文本分类及示例验证

使用 BERT 和逻辑回归进行文本分类及示例验证 一、引言 在自然语言处理领域中&#xff0c;文本分类是一项至关重要的任务。本文将详细介绍如何结合 BERT 模型与逻辑回归算法来实现文本分类&#xff0c;并通过实际示例进行验证。 二、环境准备 为了运行本文中的代码&#xf…...

【skywalking 】监控 Spring Cloud Gateway 数据

使用Spring Cloud 开发&#xff0c;用Skywalking 监控服务&#xff0c;但是Skywalking 默认是不支持 Spring Cloud Gateway 网关服务的&#xff0c;需要手动将 Gateway 的插件添加到 Skywalking 启动依赖 jar 中。 skywalking相关版本信息 jdk&#xff1a;17skywalking&#x…...

SpringWeb

SpringWeb SpringWeb 概述 SpringWeb 是 spring 框架中的一个模块&#xff0c;基于 Servlet API 构建的 web 框架. springWeb 是 Spring 为 web 层开发提供的一整套完备的解决方案。 在 web 层框架历经 Strust1&#xff0c;WebWork&#xff0c;Strust2 等诸多产品的历代更…...

嵌入式刷题(day21)

MySQL和sqlite的区别 MySQL和SQLite是两种常见的关系型数据库管理系统(RDBMS),但它们在特性、使用场景和架构方面有显著的区别: 1. 架构 MySQL:是一个基于服务器的数据库系统,遵循客户端-服务器架构。MySQL服务器运行在主机上,客户端通过网络连接并发送查询。它可以并…...

OpenAI 下一代旗舰模型现身?奥尔特曼亲自辟谣“猎户座“传闻

在人工智能领域最受瞩目的ChatGPT即将迎来两周岁之际&#xff0c;一场关于OpenAI新旗舰模型的传闻再次引发业界热议。然而&#xff0c;这场喧嚣很快就被OpenAI掌门人奥尔特曼亲自澄清。 事件源于科技媒体The Verge的一则报道。据多位知情人士透露&#xff0c;OpenAI可能会在11…...

【C++】STL初识

【C】STL初识 文章目录 【C】STL初识前言一、STL基本概念二、STL六大组件简介三、STL三大组件四、初识STL总结 前言 本篇文章将讲到STL基本概念&#xff0c;STL六大组件简介&#xff0c;STL三大组件&#xff0c;初识STL。 一、STL基本概念 STL(Standard Template Library,标准…...

框架篇补充(东西多 需要重新看网课)

什么是AOP 面向切面编程 降低耦合 提高代码的复用 Spring的bean的生命周期 实例化bean 赋值 初始化bean 使用bean 销毁bean SpringMVC的执行流程 Springboot自动装配原理 实际上就是为了从spring.factories文件中 获取到对应的需要 进行自动装配的类 并生成相应的Bean…...

合约门合同全生命周期管理系统:企业合同管理的数字化转型之道

合约门合同全生命周期管理系统&#xff1a;企业合同管理的数字化转型之道 1. 引言 在现代企业中&#xff0c;合同管理已经不再是简单的文件存储和审批流程&#xff0c;而是企业合规性、风险管理和业务流程的关键环节之一。随着企业规模的扩大和合同数量的增加&#xff0c;传统…...

等保测评与风险管理:识别、评估和缓解潜在的安全威胁

在信息化时代&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;而信息安全则成为守护这份资产免受侵害的重中之重。等保测评&#xff08;信息安全等级保护测评&#xff09;作为保障信息系统安全的重要手段&#xff0c;其核心在于通过科学、规范、专业的评估手段&#xf…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...