Hikyuu教程 | 滚动回测与滚动寻优系统

前面介绍了如何使用 hikyuu 进行策略回测参数优化,同时也提到了这种简单的参数优化本质其实是对历史数据的过拟合,通常并不具备直接使用的意义。那么有什么办法来减缓这种过拟合影响,让参数优化发挥实际的作用呢?答案是——使用滚动系统,但依然需要保持谨慎的态度,因为回测是拟合的本质并没有改变。

先来看一个简单的示例,依然使用趋势双均线,标的为万科,使用2001年-2010年数据进行参数寻优,参数寻优范围为 快线 [5, 80], 慢线 [50, 250],共 14535 组参数组合,寻优结果为快线41,慢线72。对2010年至2024年9月30日数据进行回测,下图分别为:使用最优参数的回测结果(左图)、使用滚动寻优系统的回测结果(右图)。其中滚动寻优为每300个交易日寻找最优参数,并使用最优参数系统执行200天,以此滚动推进。

在这里插入图片描述
在 hikyuu 中,创建滚动寻优系统很简单,指定寻优候选系统列表,滚动训练区间长度,测试执行区间长度,有效初始账户即可。当候选系统列表中仅有一个系统时,就是普通的滚动回测。并且,候选系统列表并要求一定是同一个策略的系统示例哦,也就是说,可以在不同的系统策略中进行滚动寻优。创建后的滚动系统实例,在 PF(投资组合)中依然可用,因为滚动交易系统本质还是一个单标的的交易系统实例。

# 指明参数寻优候选系统列表,滚动训练区间长度,测试执行区间长度
my_sys = SYS_WalkForward(sys_list, crtTM(), train_len=300, test_len=200)
my_sys.name = "滚动寻优系统"
my_sys.run(stk, query)
my_sys.performance()

滚动原理

滚动回测是通过不断向前滚动的时间窗口进行回测。具体来说,将历史数据划分为多个连续的时间段,每次只使用其中一个时间段进行回测,然后逐步向前移动时间窗口,重复进行回测。这样可以观察策略在不同时间点的表现,以及对市场变化的适应性。

滚动寻优同样是不断向前的滚动窗口,和普通单交易系统策略滚动不同的地方,则在于在训练周期内按一定的评估准则,对训练周期内所有候选系统进行评估,选取绩效最优的系统,在接下来的测试周期中,使用选择的最优系统执行实际的操作。说白了,当后续系统只有一个的时候,就是普通系统的滚动回测。

在这里插入图片描述

Hikyuu 中使用滚动系统

在 hikyuu 中创建滚动系统非常简单,只需要调用 SYS_WalkForward 即可创建,其帮助信息如下:
在这里插入图片描述
参数详细说明:

  • sys_list:候选系统实例列表,系统实例可以是同一系统策略实例,也可以是不同的系统策略示例,系统示例需绑定相应的证券。
  • tm:指定的交易账户
  • train_len:滚动寻优训练周期。如上图所示。默认为 100
  • test_len:最优绩效系统执行周期。如上图所属。默认为 20。
  • se:寻优评估选择器,用于对候选系统进行绩效评估,默认为当前候选系统账户期末资产最大选择器(SE_MaxFundsOptimal)。注:此 SE 和 PF 中的SE并不相同
  • train_tm:用于滚动评估时,候选系统使用的交易账户。默认为None,表示使用 tm 的拷贝进行评估。

评估选择器

评估选择器主要用于从候选系统中评估和选取最优的系统。目前提供两个内建的评估选择器:

  • SE_MaxFundsOptimal:账户资产最大寻优选择器
  • SE_PerformanceOptimal:使用 Performance 统计结果进行寻优的选择器(支持按最大值或最小值选取)

大家可以自行在 python 中 help 相关帮助。

其中 Performance 为交易账户绩效统计,可以通过下述语句查询支持的统计项:

per = Performance()
per.names()#output
['帐户初始金额','累计投入本金','累计投入资产','累计借入现金','累计借入资产','累计红利','现金余额','未平仓头寸净值','当前总资产','已平仓交易总成本','已平仓净利润总额','单笔交易最大占用现金比例%','交易平均占用现金比例%','已平仓帐户收益率%','帐户年复合收益率%','帐户平均年收益率%',
……

自定义评估选择器

如果上述内建的选择器还不能满足需求,比如AI评估时,可以自定义评估选择器
在这里插入图片描述

前述对比示例代码

在这里插入图片描述

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

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

相关文章

使用shell脚本自动重启服务

服务器后台运行的一些服务,有的时候由于高压操作导致服务崩溃时,总是得远程登录服务器,然后重启服务。 可以写shell脚本自动检测服务是否在运行,如果崩溃了就重启。 使用nohup在后台启动服务: nohup 服务启动命令所…

ifconfig 和 ip addr

1. 工具所属套件 ifconfig:属于较老的 net-tools 套件。曾是 Unix 和 Linux 系统上广泛使用的工具。ip addr:属于较新的 iproute2 套件。它取代了 ifconfig,并逐渐成为现代 Linux 系统上更常用的工具。 2. 功能覆盖范围 ifconfig&#xff…

Java之数组详解

一、数组的概念 数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号(索引)的方式对这些数据进行统一管理。数组是程序设计中的一种基本数据结构,用于存储相同类型…

源码编译方式安装htppd软件

一.源码编译安装httpd软件 1.安装阿帕奇的依赖,安装apr软件,阿帕奇正常运行的环境这个环境就是apr。 2.安装apr-util软件,主要提供针对apr环境的管理工具, 3.安装阿帕奇软件即httpd软件。 如上图所示,就是三个软件的…

E38.【C语言】练习:数据结构时间复杂度的计算

目录 1.二分法的时间复杂度 解: 2.求阶乘的时间复杂度 解: 3.递归实现斐波那契数,求时间复杂度 解: 4.时间复杂度的排名 备注:有关时间复杂度的讲解参见80.【C语言】数据结构之时间复杂度 1.二分法的时间复杂度 (代码来自E7.【C语言】练习:在一个有序数组中…

RK3568笔记六十六:Live555推流

若该文为原创文章,转载请注明原文出处。 前面移植了live555,记录使用rk3568推流 一、流程 推流过程是在前面RTMP工程上修改的。RTMP推流是采集摄像头数据,AI推理,编码成H264通过FFMEPG推流,现在把FFMPEG改成使用Live555. 步骤: 1、使用opencv采集摄像头数据 2、初始化…

CentOS 7 yum失效的解决办法

文章目录 一、CentOS 7停止维护导致yum失效的解决办法解决方案 提示:以下是本篇文章正文内容,下面案例可供参考 一、CentOS 7停止维护导致yum失效的解决办法 020 年,CentOS 项目与红帽联合宣布将全部投资转向 CentOS Stream,这是…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…

第28周:Transformer 实现文本分类 - Embedding版

目录 前言 一、前期准备 1.1 环境安装 1.2 加载数据 二、数据预处理 2.1 构建词典 2.2 进行one-hot编码 2.3 自定义数据集类 2.4 定义填充函数 2.5 构建数据集 三、模型构建 3.1 定义位置编码器 3.2 定义Transformer模型 3.3 定义训练函数 3.4 定义测试函数 四、…

RabbitMQ高级特性详解

前言 RabbitMQ是一款广泛使用的开源消息队列软件&#xff0c;它基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;标准实现。本文将带你深入了解RabbitMQ的一些高级特性&#xff0c;包括消息确认、死信队列、延迟队列、事务处理以及消息分发策略等&#xff…

HCIE-Datacom题库_01_防火墙【18道题】

一、单选题 1.相比较于路由器、交接机&#xff0c;防火墙转发独有的模块为? 交换网板 MPU LPU SPU 解析&#xff1a; SFU&#xff08;Switch Fabric Unit&#xff09;&#xff1a;交换网板&#xff0c;负责整个系统的数据平面数据平面提供高速无阻塞数据通道&#xff0…

关于SOCKS协议的常见误区有哪些?

代理协议在设备与代理服务器之间的数据交换中起到了关键作用。在这方面&#xff0c;SOCKS代理协议是常见的选择之一&#xff0c;被广泛应用于下载、传输和上传网络数据的场景。然而&#xff0c;关于SOCKS代理协议存在一些常见的误解&#xff0c;让我们来逐一了解。 一、使用SO…

爬虫逆向-js进阶(续写,搭建网站)

1.搭建简单网站1 from flask import Flask,render_template import requests import json app Flask(name)# **location**的温度是**temp**度&#xff0c;天气状况&#xff1a;**desc**app.route(/) # 绑定处理函数 def index_url():location 101010100data get_weather(lo…

Whisper 音视频转写

Whisper 音视频转写 API 接口文档 api.py import os import shutil import socket import torch import whisper from moviepy.editor import VideoFileClip import opencc from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request from fastapi.respons…

Android中的内存泄漏及其检测方式

Android中的内存泄漏及其检测方式 一、Android内存泄漏概述 在Android开发中&#xff0c;内存泄漏是一个常见且严重的问题。内存泄漏指的是在应用程序中&#xff0c;由于某些原因&#xff0c;已经不再使用的对象仍然被引用&#xff0c;导致垃圾回收器&#xff08;Garbage Col…

图书管理新纪元:Spring Boot进销存系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理图书进销存管理系统的相关信息成为必然。开…

使用 Elasticsearch Dump 工具进行生产环境到测试环境的数据迁移与备份

es-dump 是 Elasticsearch 的一个实用工具&#xff0c;专门用于从 Elasticsearch 集群中导出或导入数据&#xff0c;支持数据、映射、别名、模板等多种类型的数据操作。它在数据迁移、备份、恢复等场景中非常实用。本文将展示如何使用 es-dump 工具执行生产到测试环境的索引复制…

【学习】word保存图片

word中有想保存的照片 直接右键另存为的话&#xff0c;文件总是不清晰&#xff0c;截屏的话&#xff0c;好像也欠妥。 怎么办? 可以另存为 网页 .html 可以得到&#xff1a; 原图就放到了文件夹里面

Selenium 中定位元素操作集合

Selenium中元素的定位与操作 在 Selenium 中定位单个元素一般通过 find_element 方法来实现&#xff0c;一组数据则是 find_elements &#xff08;定位时应该元素加载完整再 再定位&#xff0c;否则可能会出现找不到对应元素的情况出现。这里可以使用 time.sleep() 来实现等待…

C++简易日志系统:打造高效、线程安全的日志记录工具

目录 引言&#xff1a; 1.日志的基本概念 1.1.什么是日志&#xff1f; 1.2.我们为什么需要日志&#xff1f; 2.自己实现一个简易日志 2.1.日志的等级 2.2日志的格式 2.3.获取时间的方法 2.4.日志的主体实现 参数&#xff1a; 代码解析&#xff1a; 问题&#xff1a…