答应我,在量化策略回测里,避开未来函数这4个坑

news2024/9/8 14:45:49

由于社群的原因,看过不少策略,今天就腆着脸唠唠,量化新手期经常碰到未来函数的4个坑,希望量化萌新们少掉点儿头发。新手向文章,大神请绕行~

情景1:使用前复权价格数据。

由于股票会存在分红送股的情形,价格会出现非交易回落,导致股票价格序列的不连续性,假设个股“10送10”,股价就腰斩了,双均线什么的马上就会出现“死叉”,所以为了指标计算的连续性和方便性,就会使用复权价格数据。

一些量化萌新入门之前,在行情软件上一般是看前复权行情(很多股民都有这个习惯),因为前复权行情是保证现在的价格不变,根据分红送股的信息对之前的股票价格进行调整,看到现在K线的数值比较“正常”,如果是看后复权价格行情的话,很多上市时间比较长、分红送股比较多的股票后复权价格都是“成千上万”的了,不太“人性化”。

酱香型科技公司的前复权价格比较符合股民习惯。

图片

后复权价格已然上万,很多人一开始不习惯也不喜欢。

图片

所以有一部分新手就会使用前复权价格数据,刚才已经说了,过去的股价数据是按照现在价格,根据分红送配的信息往过去推的,换句话来说,历史的价格数据包含了现在的信息,也就有了“未来信息”。

如果是使用前复权价格数据,那最简单且收益高的量化策略就是,买上市时间早且前复权价格低的股票,回测收益率曲线保证不差。

图片

情景2:当前K线出信号,当前K线成交。

这里特指的是:使用K线收盘价序列计算指标,出现信号后,以收盘价成交。

其实这种情况已经比“最低价买入,最高价卖出”的偷价情形好很多了,除非是恶意设置,不然一般萌新凭直觉都会避免。

但有时候看一些萌新的策略源码,会出现类似于“IF Crossover(MA5, MA20) THEN Buy(Close,...)”(当前MA5均线上穿MA20均线时,按收盘价买入)的情形,其实这挺符合日常看盘的习惯,看到金叉死叉的时候,都会在脑子里面从当前时点开始判断之后的行情。

但在量化里面,这其实也是包含了未来信息的,因为量化交易实盘是实时进行的,至少会出现以下两种不利的情况。

(1)当前K线没走完,最高价就触发了金叉信号,按照最高价就买入了,可能收盘价和最高价之间就存在不小的滑点。

(2)当前K线最高价可以触发金叉信号,但按照收盘价计算却触发不了金叉信号,这就造成了实盘当中能成交、回测当中无法成交的不对应情况。

因此有经验的宽客一般都会设置为“当前K线出信号,下一根K线开盘价/限价成交”,例如上面的例子可以改为“IF Crossover(MA5[1], MA20[1]) THEN Buy(Open,...)”(根据上一根K线计算的MA5均线上穿MA20均线时,按照开盘价买入)。

其实这样的设置还可能不够严谨,不过已经比之前的情形好很多了。更为严谨的是,买入价可以设为“Max(Open,LimitPrice)”(开盘价和心里目标价位的最大值),量化想做好就是要扣很多细节,路漫漫其修远兮,吾将上下而求索~

情景3:无法判断最低价和最高价的出现顺序。

这种情况相对少见,造成的后果也比较薛定谔,举个例子来说明吧。

假设一个股票/品种出现了天地板(大幅震荡同理),涨停会触发止盈,跌停会触发止损。

如果是按照K线来回测的,用高低价判断是否触发止盈止损,这就要看在策略源码中,你把止损写在前头,还是把止盈写在前头,因为在这根K线上,止盈止损的条件同时都满足,谁写在前头谁就会被执行。

但是在实盘当中,最高价和最低价必然有先后出场的顺序,假设先出现跌停,再出现涨停,而在代码当中是把止盈写在前头。

这个时候就变相出现了未来信息,在回测当中出现了“苦尽甘来”的情况,在实盘当中要亏损10%的情况,在回测当中却盈利了10%。

这个就有点儿类似于“幸存者偏差”,如同很多经典量化书籍都提到过的例子:在米国,买入困境当中的股票博反转,回测效果非常好,实盘效果却可能大相径庭,因为在早期,个股退市后数据就“消失”了,能回测到的股票都是从困境当中挺过来的幸存者,股价自然会迎来大涨,但如果在现实当中买到的是没有挺过来的不幸者,那就GG了。

图片

情景4:财报数据当中的未来信息。

这个财报当中的未来信息非常隐蔽,我初始做量化的时候也掉进过这个坑,不是自己"粗心大意",而是没有经验、特别是没有财务相关知识的萌新容易掉坑。

众所周知,A股上市公司的一季报、半年报、三季报和年报的披露截止时间分别在当年的4月底、8月底、10月底和次年4月底公布,一般很少有人在2021年1月就直接调用2020年报的,这个错误对普通股民都太过明显,今天要说的是比较"隐蔽的"。

举个例子,有的童鞋就考虑到财报的延后披露,但各家上市公司的披露日期又没有规律,于是乎,在构建量化基本面模型时,就在披露截止日期的次月第一个交易日调取财报数据,比方说在2021年5月6日才调用2020年报数据。

的确,这种方式能剔除绝大部分的未来信息,但是还是有些隐蔽的瑕疵,这个瑕疵的根源就是:部分公司会对之前的财报数据进行修正,最新值会替换掉旧值。

举个真实的例子,某扇贝跑来跑去的上市公司XX岛由于2014、2015连续两年亏损被*ST,如果2016年再亏损就要进入退市流程了。2017年3月21日,XX岛公布了2016年的年报,净利润为7571个w,扭亏为盈,保壳成功。但在2019年7月被证监会最终查出虚增利润1.3个小目标,追溯调整后净利润为-5543个w。

如果今天来回测,取到XX岛2016年的净利润就是-5543w,可以避开这个大雷,而实际上,2017年5月第一个交易日取到的净利润却是7571w,老老实实挨锤。

XX岛2016年的年报原始数据。

图片

现如今查询到的XX岛财务数据。

图片

这种回测历史当中能取到、现实当中无法取到的财报数据,就是做基本面量化的萌新很容易掉进的坑,特别还是早期的时候。

不过现在萌新们不用担心了,很多量化平台都做了非常贴心的设置,除了设定报告期外,还可以设定取数日期,只能取到在实际当中取数日期之前可见的财报数据,在取数日期之后的修正是取不到的,或者是其他落地的金融数据库,会同时存储原始财报数据和修改后的财报数据,并且有每条记录的公告日期,可以按照公告日期进行数据选择。

在回测当中,要有效避免掉这些未来函数/未来信息,除了多听前人的掉坑经验外,就是彻底了解自己所用的指标、变量、模型、算法的计算流程和细节,在哪个环节上会拿到这个时点之外的未知信息,慢慢地打磨细节,这样会比较快。

原文首发链接:《答应我,在量化策略回测里,避开未来函数这4个坑》

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

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

相关文章

芋道源码yudao-cloud 二开笔记(Editor富文本本地图片上传报错问题)

: 于是找到富文本的组件代码Editor.vue,检查一下上传的接口地址和token有没有传,如下图: 都没有问题,但还是报错,所以试试自定义上传的方法: // 导入上传文件的接口 import * as FileApi from …

reese84分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

最近火爆的GraphRAG是什么?真的那么有用吗?

最近,微软提出的GraphRAG项目引起了广泛关注。那么,GraphRAG究竟是什么?它真的那么实用吗?本文将为您详细解读GraphRAG的概念及其应用。 什么是传统的RAG? 📚 在深入了解GraphRAG之前,我们首先…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX?****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战:创建一个动态表单****8. AJAX中的事…

Python 解决 ImportError: cannot import name ‘example’

Python 解决 ImportError: cannot import name ‘example’ 在Python编程的广阔天地中,ImportError: cannot import name example 是一个令人头疼但又常见的错误。当你试图从某个模块中导入一个不存在的名称时,这个错误就会悄然降临。本文将带你深入探索…

AI推理硬件成本分析:AMD Instinct MI300X与Nvidia GPU比较

随着AI模型训练成本的上升,人们越来越关注推理硬件的成本,尤其是在需要低延迟响应的应用中。Transformer模型需要强大的硬件支持,例如200毫秒以下的响应时间。Artificial Analysis最近分析了AI模型性能和定价,特别指出AMD的“Anta…

「豆包Marscode体验官」AI加持的云端IDE——三种方法高效开发前后端聊天交互功能

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE,旨在提高开发效率和质量。它支持多种编程语言和IDE,提供智能代码补全、代码解释、单元测试生成和问题修复等功能,同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

跟着动脑学院学习Android 开发基础

跟着动脑学院up主学习Android开发,记录学习笔记 2022 最新 Android 基础教程,从开发入门到项目实战,看它就够了,更新中_哔哩哔哩_bilibili (弱弱地说一句,绝大部分内容都是up主为我们准备好的资料里摘抄下…

机器学习 | 评估原理——模型评估与交叉验证

Hi,大家好,我是半亩花海。学完分类算法原理的知识,我们进入评估相关知识的学习,继续更新《白话机器学习的数学》这本书的学习笔记,在此分享模型评估与交叉验证相关评估原理。本章的基于前几节已建立的模型进行评估知识…

【C语言】Linux 飞翔的小鸟

【C语言】Linux 飞翔的小鸟 零、环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev壹、编写代码 代码如下&#xff1a; bird.c #include<stdio.h> #include<time.h> #include<stdlib.h> #include<signal.h> #include<curses.h>…

LeetCode:相同的树(C语言)

1、问题概述&#xff1a;给2个二叉树的根节点p和q&#xff0c;如果2个树在结构和数值上都相同才为true&#xff0c;否则为false 2、示例 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;p [1,2], q […

做知识付费项目还能做吗?知识付费副业项目如何做?能挣多少钱?

hello,我是阿磊&#xff0c;一个20年的码农&#xff0c;6年前代码写不动了&#xff0c;转型专职做副业项目研究&#xff0c;为劳苦大众深度挖掘互联网副业项目&#xff0c;共同富裕。 现在做知识付费项目还能做吗&#xff1f; 互联网虚拟资源项目我一直在做&#xff0c;做了有…

AI绘画模型之:UNet、Imagen 与 DeepFloyd IF

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

spring boot(学习笔记第十五课)

spring boot(学习笔记第十五课) Spring boot的websocket(广播) 学习内容&#xff1a; Spring boot的websocket&#xff08;广播&#xff09; 1. Spring boot的websocket&#xff08;广播&#xff09; 回顾下web server的进化 第一代Web程序&#xff0c;使用整体页面刷新技术…

GPT-4o mini- 开发者的新宠儿

在人工智能的浪潮中,一颗新星正在冉冉升起。OpenAI最新发布的GPT-4o mini模型以其惊人的性能和极具竞争力的价格,正在成为开发者们的新宠儿。作为一名大数据开发者,我深深被这个"迄今为止最具成本效益的小模型"所吸引。让我们一起探索GPT-4o mini的魅力,看看它如何改…

一些问题 7/28

get post可以public吗 在Java Servlet中&#xff0c;doGet()和doPost()方法的访问修饰符通常是public&#xff0c;因为这些方法需要被Servlet容器&#xff08;如Tomcat&#xff09;调用。 如果将这些方法声明为private或protected&#xff0c;Servlet容器将无法访问它们&…

RocketMQ Server Windows安装

RocketMQ阿里开发 开源给apache 官网:RocketMQ 官方网站 | RocketMQ 下载后解压 配置环境变量 注意启动顺序 双击 注意 4.9.0这个版本必须 jdk 8 高了用不了 namesrv是注册中心的作用 broke是核心用于接收生产者消息 存储消息 发送给消费者消息 类似DubboZookeeper…

C++ 绘制画布标尺

目标 关键代码 CRulerDrawer::CRulerDrawer(QPainter& painter, QRect rect, int scalePercent): m_painter(painter), m_rect(rect), m_scalePercent(scalePercent) {m_palette qApp->palette();m_scaleUnitSize PixelRuler::Instance()->GetScaleUnitSize(); }vo…

【JS|第22期】深入理解跨域

日期&#xff1a;2024年7月6日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

Vue开发环境搭建

文章目录 引言I 安装NVM1.1 Windows系统安装NVM,实现Node.js多版本管理1.2 配置下载镜像1.3 NVM常用操作命令II VUE项目的基础配置2.1 制定不同的环境配置2.2 正式环境隐藏日志2.3 vscode常用插件引言 开发工具: node.js 、npm 开发编辑器:vscode 开发框架:VUE I 安装NVM…