如何解决过度拟合

这篇具有很好参考价值的文章主要介绍了如何解决过度拟合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何解决过度拟合

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。

为何产生过度拟合

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

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

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等交叉验证结果并展示。

 文章来源地址https://www.toymoban.com/news/detail-443601.html

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

 

 

写在最后

我们的知识星球中有更多关于量化投资、机器学习的干货发布,欢迎添加技术宅进入星球。

如何解决过度拟合

 如何解决过度拟合

 

到了这里,关于如何解决过度拟合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 页面滑动到可视区域加载更多内容思维流程

    页面滑动到可视区域加载更多内容思维流程

    2024年02月12日
    浏览(29)
  • Android手机如何查看UI渲染层级,过度绘制

    最近在调试一个UI问题时,怎么也找不到错误原因。 于是就想着通过手机的过度绘制查看模式观察一下每个控件的位置,从而定位问题。 但是由于太久没有调试过过度绘制问题了,所以在网上搜了搜,最终又捡起来了调试方法。 针对于不同型号的手机,路径可能有略微差别

    2023年04月08日
    浏览(41)
  • 他趣APP:为什么SEO需要在长篇内容上投资更多

    SEO简单的理解,就是搜索引擎优化,利用SEO优化技术手段把网站优化到搜索引擎的首页,从而达到扩大企业推广宣传的目的。而想要做好网站SEO优化,优质的内容是必不可少的因素之一。 因此作为一名合格的SEO人员,就需要每天给网站定时定量的添加一些优质内容,只有这样

    2024年02月11日
    浏览(73)
  • AIGC:数字内容创新的新引擎,还有藏着更多你知道的细节

    随着技术的不断发展进步,在前两年对我们还是天方夜谭,可望而不可即的科技,现在不仅在逐步实现,甚至在广泛地普及应用中。人工智能技术应用在越来越多的行业中,在一定程度上对各行业的发展起了不小的推动作用,除了今年爆火的由人工智能技术驱动的自然语言处

    2024年02月08日
    浏览(24)
  • vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数!

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示 展开更多 按钮, 点击即可显示全部内容 ,先来看看效果图:  这样做用户体验瞬间得到提升,接下来看

    2023年04月24日
    浏览(40)
  • 如何在国际学术会议上作一场精彩的口头报告

    在学术会议上提交的论文被录用,论文作者去参会通常都有机会做口头报告。那么,如何在学术会议上做好口头报告呢? 会议报告一般分两种,一种是oral,即口头报告,需要制作PPT等,面对会场或分会场的参会者做报告演讲并回答问题;一种是poster,即现场张贴形式,不需

    2023年04月09日
    浏览(40)
  • 没学C++,如何从C语言丝滑过度到python【python基础万字详解】

    大家好,我是纪宁。 文章将从C语言出发,深入介绍python的基础知识,也包括很多python的新增知识点详解。 思维导图: 在C语言中,在进行输入输出的时候,通常要遵循一定的格式,如变量名必须与变量的类型严格对应,输出输入的每一个变量都要在数量和格式上都要一一对

    2024年02月12日
    浏览(42)
  • vue所有UI库通用)tree-select 下拉多选(设置 maxTagPlaceholder 隐藏 tag 时显示的内容,支持鼠标悬浮展示更多

    如果可以实现记得点赞分享,谢谢老铁~ 1.需求描述 引用的下拉树形结构支持多选,限制选中tag的个数,且超过制定个数,鼠标悬浮展示更多已选中。 2.先看下效果图 3.实现思路 首先根据API文档,先设置maxTagCount,最多显示多少个 tag。 然后再设置 maxTagPlaceholder,隐藏 tag 时

    2024年02月12日
    浏览(37)
  • 如何申请 Midjourney API ,一文教会你,欢迎收藏

    要使用 Midjourney API,首先可以到 Midjourney  API 页面点击「获取」按钮: MJ接口对接https://data.zhishuyun.com/documents/0fd3dd40-a16a-4246-8313-748b8e75c29e 如果你尚未登录,会自动跳转到登录页面。 扫码关注公众号即可自动登录,无需额外注册步骤。 登录完了之后会跳回原页面 Midjourney Im

    2024年02月05日
    浏览(40)
  • Flink CDC 2.4 正式发布,5分钟了解CDC 2.4新内容,新增 Vitess 数据源,更多连接器支持增量快照,升级 Debezium 版本

    来源:https://ververica.github.io/flink-cdc-connectors/master/ Flink CDC [1] 是基于数据库的日志 CDC 技术,实现了全增量一体化读取的数据集成框架。配合 Flink 优秀的管道能力和丰富的上下游生态,Flink CDC 可以高效实现海量数据的实时集成。 具体关于Flink CDC是什么?可以看下这篇文字 作

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包