不吹不黑 | 聊聊为什么要用99%精度的数据回测

2024-06-05 10:18

本文主要是介绍不吹不黑 | 聊聊为什么要用99%精度的数据回测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

  • 写在前面的话

    文字并不具备精确传递信息的能力。除了程序员和律师等少数群体,很少人能保证自己说的东西能在一句话中被清晰传递的。所以,带着思考阅读从而帮助完善你的知识体系,改变你的行为,这才是您耗费时间,阅读本篇文章的意义。

    因此,在阅读本篇文章之前,我希望您能放下心里已有的成见,否则就算您通篇读完,留下的也只是带有您个人偏见的理解。您获得的多少并不取决于读了多少,而取决于您以空杯的心态,思考了多少、多深。

  • 什么是Bar数据

    在讲之前,先讲一下Bar数据。所谓的Bar数据,泛指普通的 K 线。在单独的每个Bar上面包含开盘价、收盘 价、最高价、最低价、成交量及时间。所有的Bar按照不同周期组合,并按照时间从先到后进行排列,由此形成为序列数据,整个序列称之为Bar数据。

    如果交易策略是基于Bar数据回测。按照Bar数据的Bar数目,从第一个Bar到最后一个Bar,依次进行计算,如果公式中出现了调用Bar数据函数的,则取出当前Bar的相应值,进行运算。如下图箭头所示,公式执行从上至下,Bar从左到右执行。

    Bar数据应用于非即时发单策略,是没有问题的。比如:当前条件成立,那么就在下根Bar发单。由于Bar数据量往往不是很大,在上百种上千组合回测或优化时,速度非常快。

  • bar数据回测的弊端

    大多数量化软件中,调用那个级别的数据,就是哪个级别的Bar。5分钟周期级别的Bar就是5分钟时间序列的开高低收等。一般最小级别是1分钟,也就是回测时只能使用1分钟级别粒度的数据。

    那么问题来了,1分钟以下的数据变动是无法得知的。这种数据与当时的实际市况有所差别,一个个小的差异积累起来就造成了与真实结果的巨大差异。

    就拿上图中,箭头所指的Bar来说:这是根带上下影线的阴线,图表级别为60分钟,你认为在60分钟里,价格怎么运动,才最终形成这根Bar。

    答案是:有非常非常多种可能。它有可能开盘就先上涨,创造出一个上影线。然后转头向下,创造出一个下影线。然后再转头向上收盘;它也可能开盘就砸盘,直接创造出一个下影线。然后转头向上,创造出一个上影线。然后再转头向下收盘。总之,在这根Bar最终形成之前的60分钟内,价格的波动有很多种可能。

    如果即时策略用Bar数据回测,回测引擎只是根据Bar的开高低收等,做计算。因为回测引擎并不知道价格是如何跳动才形成最终的Bar。在Bar中,价格即有可能先上后下,也有可能先下后上。

    还有一个更为重要的弊端。在Bar回测中,并没有参考盘口数据,比如:买一价和卖一价。在Bar数据回测中,只要触发开平仓的价格在最高价与最低价之内,都能成交。但此时此刻如果恰好没有对手盘的话,那么Bar回测引擎在撮合的时候是检测不出来的。一次两次影响不大,但只要Bar的数据足够多,就足以产生以假乱真的虚假绩效报告。

  • 举个栗子

    我举一个很简单的例子做范例说明。策略描述:当均线往上时往上触碰现在K线高点时作多、当均线往下时往下触碰现在K线低点时放空,另外加上移动出场─当获利大于等于10点后,折返获利1%就出场。

    代码如下:

    回测如下:

    如果你在开发交易策略的时候看到这个现象就很兴奋的以为自己发现圣杯的话... 那么你就想错了。

    钱有这么好赚就好了啦=_=。这样的回测报表一整个就是垃圾!因为那些出场点位几乎可以说都是做不到的!!

    上面这图,空心三角形就是出场位置的标示,看看那个出场标示在哪边?没错,就是K线的最高点,请想一想这有没有问题?我们定下的出场除了多空翻单外,就是移动出场,既然移动出场要有折返才会出场,那出场点在K线的最高点有可能吗?

    如果使用99%精度的Tick数据,回测如下:

    这篇简单的范例不是想指出用很灵敏的移动出场是不可行的,而是说这种的即时策略,在真实运作时会是怎样的状况?至于,造成这个垃圾回测报表的原因,我就不多叙述了。直接告诉你如何呈现实况:使用99%精度的Tick数据。

  • 什么是Tick数据

    Tick数据就是交易所中最详尽的交易数据结构。包括:开盘价、最高价、最低价、最新价、成交量、成交额。如果把交易数据比喻成河流,Tick数据就是这个河流在某个横截面的数据。

    如上图所示,国外交易所每个动作都会实时推送到市场上来。而国内交易所,每秒两次进行检查,如果该时间段内有动作,则生成一次快照并且推送出来。相比较而言,数据的推送充其量只能算做 OnTime,而不能叫做OnTick。

  • BotVS的Tick数据

    尽管国内Tick数据并不是真正意义上的 Tick,但是使用这种数据进行回测,至少可以无限接近和还原了现实。每个Tick中显示着当时这个商品在市场中的主要参数,并且在实盘中我们的代码,就是跟着理论每秒 2 次的Tick在进行计算。

    不仅如此,在 BotVS 中即使加载的是1小时周期的数据,依然可以调整数据粒度,比如将数据粒度调整为 1 分钟。此时此刻的1小时K线就是用1分钟数据组成的。当然,粒度越小,精度越高。

    更为强大的是,如果将数据切换为实盘级Tick,就可以无缝还原真实的实盘环境。即1秒2次Tick交易所的真实数据。

  • 总结

    你不可能拿着玩具枪就上战场,不是吗?在开始实盘之前,我们都会慎之又慎。客观的压力检验,能帮你省下许多真金白银,而这些损失通常都是不必要的。

    那么历史数据的准确性就成了你的交易策略检验结果的关键因素之一,假如你的数据是不准确的,那么在这种数据下的优化和回测必然也是无法在市场中进行的。

    否则在Bar模式下看着很爽的模型,到最后变成一个很爽的陷阱......回测,就是要对自己狠一点......

这篇关于不吹不黑 | 聊聊为什么要用99%精度的数据回测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文