如何解决过度拟合

news2024/11/30 14:25:44

 

数量技术宅团队在CSDN学院推出了量化投资系列课程

欢迎有兴趣系统学习量化投资的同学,点击下方链接报名:

量化投资速成营(入门课程)

Python股票量化投资

Python期货量化投资

Python数字货币量化投资

C++语言CTP期货交易系统开发

数字货币JavaScript语言量化交易系统开发


为何产生过度拟合

我们在做数据分析建模,或是量化策略回测的过程中,会模型在训练时过度拟合了历史数据(回测),导致在新数据上的预测(实盘)效果不佳。造成这种现象有以下几种原因:

一是这可能是因为模型过于复杂,参数过多,使其可以轻松地拟合历史数据,但在新数据上的预测能力较差。一起来看一个典型的过度拟合的例子。

import numpy as np
import matplotlib.pyplot as plt

# Generate some data
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(scale=0.1, size=100)

# Fit a polynomial of degree 20
p = np.polyfit(x, y, 20)
y_pred = np.polyval(p, x)

# Plot the data and the fitted polynomial
plt.scatter(x, y)
plt.plot(x, y_pred, color='red')
plt.show()

我们生成了一组sin函数加上随机数的序列,同时用20阶的高阶函数去拟合这组样本数据,如此高维的数据,必然会产生样本内拟合极度优秀的效果。而模型在学习训练数据时过度拟合了数据的细节,导致模型过于复杂,也就失去了泛化能力。

另一个可能的原因是样本选择偏差。如果使用的历史数据不足以代表未来的变化,那么模型在训练时就会过度拟合,从而在实际应用中无法正确地预测。例如采用15年8月以前数据测试的股指期货短周期\高频策略,由于股指期货手续费改变造成的市场结构剧变,除非手续费重新恢复,否则数据偏差极易产生未来绩效的偏差。

如何解决过度拟合问题

为了解决数据分析、量化策略构建过程中最常见的过拟合问题,我们需要采取一些措施。

交叉验证

数据集划分是避免过度拟合问题的关键步骤之一。在构建量化策略时,我们通常将数据集划分为训练集和测试集。训练集用于训练模型,测试集用于验证模型的泛化能力。为了避免过度拟合问题,我们可以使用交叉验证的方法,将数据集分成10份,每次选取其中一份作为测试集,其他九份作为训练集。这样可以更好地验证模型的泛化能力,避免过度拟合。

下面是一个使用sklearn库做10折交叉验证的例子,调用cross_val_score方法,生成Cross-validation scores、Mean score、Standard deviation等交叉验证结果并展示。

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression

# Generate some data
x = np.linspace(0, 10, 100)
y = np.sin(x) + np.random.normal(scale=0.1, size=100)

# Fit a polynomial of degree 20
p = np.polyfit(x, y, 20)
y_pred = np.polyval(p, x)

# Use linear regression with cross-validation to evaluate the model
lr = LinearRegression()
scores = cross_val_score(lr, x.reshape(-1, 1), y, cv=10)

# Print the mean score and standard deviation
print("Cross-validation scores:", scores)
print("Mean score:", np.mean(scores))
print("Standard deviation:", np.std(scores))

'''
output
Cross-validation scores: [-7.06062585e+00 -4.33284120e-04 -2.57612012e+01 -2.13349644e+00
 -6.45893114e-01]
Mean score: -7.120329969404656
Standard deviation: 9.643292108330295
'''

扩充训练数据集

下面示例,展示了不同的训练数据集大小对于模型预测能力的影响。图表中的横轴表示训练集的大小,纵轴表示模型在测试集上的预测误差。可以看到,当训练集较小时,模型在测试集上的预测误差较大,而当训练集较大时,模型的预测误差较小。这表明,训练数据集大小对于模型的预测能力具有重要影响。

因此,在数据运行范围内,我们应该尽可能选择更大的训练(回测)数据集,例如我们如果构建中低频策略,可以使用5年、甚至10年以上的数据集进行训练,而构建高频策略,也需要尽可能大的训练集,具体以可获取的Tick、OrderBook数据范围为准。

特征选择与正则化

特征选择是避免过度拟合问题的另一个关键。在数据、策略的建模过程中,我们通常会有许多备选特征可以用于建模预测,如果选择所有的备选特征进行建模,会导致模型过于复杂,容易过度拟合。因此,我们通过正则化筛选最重要的特征,减少特征数量,降低过度拟合的风险。

下面是一个正则化避免过度拟合的例子(省略加载数据步骤),我们创建逻辑回归模型,并使用L1正则化来选择重要特征。然后使用所选择的特征来拟合逻辑回归模型,在测试集上评估该模型。这种方法通过只选择最重要的特征来避免过拟合,从而降低了模型的复杂性并提高了其泛化性能。

# Import necessary libraries
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectFromModel

# Load data ......

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(data.drop('target', axis=1), data['target'], test_size=0.2, random_state=42)

# Create logistic regression model
lr = LogisticRegression()

# Use L1 regularization to select important features
selector = SelectFromModel(estimator=lr, threshold='1.25*median')
selector.fit(X_train, y_train)

# Transform training and testing sets to include only important features
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test)

# Fit logistic regression model on selected features
lr_selected = LogisticRegression()
lr_selected.fit(X_train_selected, y_train)

# Evaluate model performance on testing set
print('Accuracy on testing set:', lr_selected.score(X_test_selected, y_test))

 

控制模型复杂度

控制模型复杂度的概念相对来说更加主观,其一,在建模(回测)中,我们通常会使用一些复杂的模型,如决策树、神经网络等。这些模型具有很强的拟合能力,但我们的模型选择并不是越复杂越好,最重要的是贴合数据背后的经济、行为逻辑。

除了模型选择,还需要控制参数的数量、以及特征的数量,控制模型复杂度是一个整体的工作,贯穿于整个数据建模与策略回测的过程。

此外,我们还可以采用数据增强、集成学习等方法来避免过度拟合问题。这些措施可以提高模型的稳定性和可靠性,为模型的实际应用提供保障。

对量化投资:实盘不如回测是过度拟合吗

最后一段,我们针对量化投资,再做一些展示。时常有粉丝朋友问到技术宅:我做了一个模型开始跑实盘,但是策略在实盘过程中运行的绩效远远不如回测,是因为我过度拟合了吗?

其实,策略在回测时的表现与实盘表现不一致,是量化投资领域一种普遍存在的现象。这种不一致不完全是因为过度拟合产生的,可能是多种因素引起的:

  1. 数据偏差:回测时使用的历史数据可能与实际市场环境存在一定的差异,例如我们在上文中提到的股指期货的例子,变化的市场结构会对策略的表现产生影响。

  2. 滑点和交易成本:回测时通常假设买卖价格可以立即获得,但实际交易中存在滑点和交易成本,这些因素都可能会对策略的表现产生影响。

  3. 策略实现:在实盘交易中,策略的实现可能会受到多种因素的影响,例如交易执行的速度、交易规模的限制等,这些因素也可能会对策略的表现产生影响。

  4. 过度拟合:也是本文讨论的重点,在回测中,策略的过度拟合,使得策略在回测中表现良好,但在实际交易中表现不佳。

为了减少回测和实盘表现的差异,可以采取以下措施:

  1. 尽可能使用更真实、更贴近目前市场状况的历史数据。

  2. 在回测时保守的考虑交易成本和滑点等因素。

  3. 在回测中尽可能遵循策略实盘交易的执行规则。

  4. 采用交叉验证、扩充训练数据集、正则化特征选择、控制模型复杂度等有效方法,避免过度拟合。

如果你也觉得这次的分享给你的学习、工作、生活效率带来了经济实惠,建议点赞、收藏,同时也分享你的小伙伴,让我们一起独乐乐不如众乐乐。高效工作,快乐生活! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ae:合成查看器 - 3D 视图选项

当启用 3D 图层后,合成查看器右下方将出现与 3D 视图相关的按钮与菜单。 草图 3D Draft 3D 启用后,Ae 将使用 GPU 加速来实时显示对 3D 设计所做的更改或更新。这种体验无缝流畅且速度更快,因此可避免在预览时发生延迟,使用任意摄…

Java原型模式详解:克隆人案例【深浅克隆】

前言 在许多情况下,我们需要创建对象的副本,比如在初始化操作比较复杂或者需要大量资源的情况下。在这些情况下,我们可以使用原型模式来避免重复创建对象,提高程序的性能。本文将介绍Java中的原型模式以及如何在实际应用中使用它。…

js中new的含义

👉js中new操作符_js new_焦会理人的博客-CSDN博客 目录 1.什么是new? 2.new经历了什么过程? 3.new的过程分析 1.什么是new? 在JS中,new的作用是通过构造函数来创建一个实例对象(和普通函数不一样,当函数用作构造函…

漏洞扫描与渗透测试的区别

在网络安全领域中,漏洞扫描和渗透测试是两个非常重要的概念。渗透测试和漏洞挖掘的区别在于测试的目的和方法。渗透测试主要是为了发现已知漏洞,而漏洞挖掘主要是为了发现未知漏洞。虽然它们都与漏洞有关,但它们之间还是有一定的区别。那么渗…

机器学习:基于Kmeans聚类算法对银行客户进行分类

机器学习:基于Kmeans聚类算法对银行客户进行分类 作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞&#x…

浅析自主、意图与感性

2023年5月3日,在麻省理工技术评论(MIT Technology Review)一场接近一小时的半公开分享会上,Hinton终于有机会比较完整的讲述了他对AI的所有恐惧和担忧:一旦AI在人类灌输的目的中生成了自我动机,那以它的成长…

超级独角兽 Databricks 的崛起之路

在数据扩张以及 AI 兴起的时代,数据存储和分析平台拥有巨大价值和能量。 随着互联网数据的爆炸性增长,数据已经成为企业的新型资源,犹如石油般重要。越来越多的企业希望利用各种结构化和非结构化数据来发挥自己的优势。 然而,他…

Python虚拟环境的安装和使用

在进行Python项目开发时可能会遇到各种各样的库和模块依赖问题。为了解决这些问题,我们可以使用虚拟环境来隔离项目的依赖。本次将介绍Python原生虚拟环境和Anaconda虚拟环境的安装与使用,并举例说明如何进行虚拟环境配置。 文章目录 Python原生虚拟环境…

华为OD机试真题 Java 实现【不爱施肥的小布】【2023Q2 100分】

一、题目描述 某农村主管理了一大片果园,fields[i]表示不同国林的面积,单位m2,现在要为所有的果林施肥且必须在n天之内完成,否则影响收成。小布是国林的工作人员,他每次选择一片果林进行施肥,且一片国林施…

Python机器学习:Scikit-learn和TensorFlow的应用和模型设计

一、引言 Python在机器学习领域中已经成为非常受欢迎的编程语言。Scikit-learn和TensorFlow是Python中应用最广泛的两个机器学习库,它们提供了丰富的机器学习算法和工具,帮助开发人员轻松地构建和训练机器学习模型。本文将详细介绍Scikit-learn和Tensor…

python+vue体育场馆场地预约系统 django体育器材管理系统3cprm

使用django框架搭建后台服务,使用python开发语言. 使用MySQL作为数据库对数据进行持久化 开发语言:Python 框架:django/flask Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件&#xf…

【K8s】常用的Pod控制器

文章目录 一、认识Pod控制器1、控制器介绍2、控制器种类 二、ReplicaSet(RS)1、RS的作用与资源清单2、创建RS3、pod扩缩容4、镜像升级5、删除RS 三、Deployment(Deploy)1、作用与资源清单2、创建deploy3、扩缩容4、镜像更新5、版本…

【运维知识进阶篇】集群架构-Nginx实现基础web架构(Linux+Nginx+PHP+Mysql)

本篇文章介绍LNMP架构部署项目,包括Nginx安装配置、PHP安装配置、数据库Mariadb安装配置、Nginx连通PHP、PHP连通MySQL、拆分数据库至独立服务器、拆分静态资源至服务器、扩展一个web服务器。 LNMP架构 Linux Nginx Mysql PHP Nginx不能处理动态请求,如…

Java如何判空

目录 前言 List的判空 String的判空 Optional 4.1 Optional对象的创建 4.2使用场景 前言 实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。 针对异常的处理我们在上一篇有提及: 先来看一下实际项目…

OpenCV实战(23)——相机标定

OpenCV实战(23)——相机标定 0. 前言1. 数字图像成像原理2. 相机标定2.1 执行相机校准2.2 使用已知相机参数校准2.3 使用圆网格进行校准 3. 完整代码小结系列链接 0. 前言 我们已经了解了相机如何通过在 2D 传感器平面上投射光线来拍摄 3D 场景&#xf…

使用RobustPCA 进行时间序列的异常检测

鲁棒主成分分析(Robust Principal Component Analysis, RobustPCA)是一种将时间序列矩阵分解为低秩分量和稀疏分量的技术。这种分解能够识别潜在的趋势,以及检测异常和异常值。在本中我们将研究RobustPCA的数学基础,介绍它与传统的PCA之间的区别&#xf…

GcDataViewer for JavaScript 6.1.0 Crack

GcDataViewer是跨平台 JavaScript 数据查看器,使用我们的 JavaScript 数据查看器在 Web 上打开和查看数据文档。 Load Excel (XLSX)、CSV 和SPREADJS(SSJSON) 文件,全部在一个查看器中 支持使用排序、筛选器和切片器进…

单词拼写检查textblob模块spellcheck方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 单词拼写检查 textblob模块 spellcheck方法 [太阳]选择题 关于python代码说法错误的一项是: from textblob import Word myWordsuccessfulee print("【显示】myWord …

【Spring事务】Spring事务事件控制,解决业务异步操作

使用背景 在业务中,经常会有这样的需求,在数据库事务提交之后,发送异步消息或者进行其他的事务操作。 例如当用户注册成功之后,发送激活码,如果用户注册后就执行发送激活码,但是在用户保存时出现提交事务…

【利用AI让知识体系化】入门Express框架

思维导图 文章目录 思维导图第一章:介绍Express什么是ExpressExpress优点Express应用场景 第二章:安装和基础用法安装Express搭建第一个Express应用中间件的使用 第三章:路由和控制器路由的原理路由的基本用法路由的进阶用法控制器的使用 第四…