如何提高量化策略回测的效率

news2024/11/19 1:45:08

   

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

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

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

Python股票量化投资

Python期货量化投资

Python数字货币量化投资

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

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


我们在进行量化策略回测的时候,免不了要做一些时间序列的操作,比如计算过去一段时间的某个技术指标、因子等等,即时是横截面的策略,也需要在横截面数据准备后,进行时间序列的回测,用以确定因子在回测周期内的表现。

在进行时序相关的回测操作时,我们通常有两种编写方式可供选择。第一种是循环回测,即按照时间序列由远及近,每次进入循环后计算指标或因子,并判断是否触发交易信号;第二种是利用矩阵进行数值计算,即先调用矩阵运算所有可能用到的指标或因子,再通过矩阵筛选的方式选出符合条件的交易信号并回测。

那么,这两种方式,相对来说哪种更能提高我们的回测效率?

如果数据量级比较小,这两种方式的差别不大。但是随着数据量级的增加,比如需要回测分钟k,甚至是逐笔的数据,或者需要回测过去很长一段时间跨度的数据,两者之间的运算速度(效率)差距会越来越明显。

这次的文章,我们就将以策略回测最常用的Python语言为例,来比较两种方法之间的效率差异。

普通数值计算比较

首先,我们抛开策略回测,先从数据量级增加的视角,来比较循环和矩阵运算的效率差异。这个比较的例子很简单,我们分别生成两个100万数据量级的数组,计算这两个数组每个对应元素的乘积,即A数组第一个元素与B数组第一个元素相乘,并将所有得到的乘积相加。

对于这个例子,我们既可以使用矩阵运算的方式,也可以使用循环的方式来实现。

一起来看实现的具体代码。对于矩阵运算,我们直接调用numpy库中的dot方法即可,而循环,则是通过100万次循环依次获取每个数组中对应的元素后不断加总。

我们特意在代码中记录了需要比较代码模块的运行起始和终止时间,通过这两个时间的差值,可以比较两种算法在执行时间上的差异。

可以看到,两种方法计算出了相同的结果,说明方法在功能上是完全可替代的,但是执行时间相差很大,矩阵运算的执行用了3秒钟,而循环运算则使用了493秒,在处理这个量级的数据上,两种算法的效率相差了100多倍,不可谓不大。

量化策略回测比较

我们再回到量化策略的回测,举一个简单的例子进行比较,我们使用股指期货IF的分钟k线,策略规则分钟k是连续上涨3次,或连续下跌3次开仓,持有固定分钟后平仓。这样的规则,我们同样可以使用循环运算以及矩阵运算两种方式,进行回测的编写。

先来看循环模式的实现逻辑,我们逐K线遍历、在循环内,单独计算每一个K线的指标、判断是否满足开仓条件、并且将每一笔交易在平仓的结果逐一加入到利润记录列表变量中。

 

再来看矩阵运算的实现逻辑,通过矩阵运行一次性计算得到使用指标,筛选出所有满足开仓条件的行,并根据筛选得到的子表统计计算回测结果。  

我们同样在两种实现方式的起始和终止位置增加了时间戳的记录,以此来比较两种算法的执行耗时。

 

并且,我们对比两种算法得到的回测结果,回测结果也是完全一样的,说明算法可互相替代,我们没有理由不选择效率更高的算法来实现。

因此,在具体的量化策略回测中,矩阵算法的执行效率仍然是大大优于循环算法的,循环算法回测共耗时16409秒,而矩阵算法仅耗时809秒,两者差距在20倍。可以说,随着数据量级、算法复杂程度的增大,两者的差距还会进一步的扩大。

结论

通过对大数据量级的运算速度比较,以及一个具体量化策略的回测速度比较,我们可以得到以下结论:

1 量化策略回测与大规模数值计算一样,矩阵运算效率高于循环运算。

2 随着处理数据量级的增大,两者之间的速度差异将越来越大。

3 尽可能使用矩阵运算方式回测策略。如某些复杂逻辑策略无法完全做到矩阵运算,也可以用矩阵运算计算必须变量或做初步测试,如果初测结果理想,再加入循环算法逻辑做精细化测试。

4 涉及到大规模机器学习算法,通过矩阵运算模式优化代码,解决耗时问题。

 

 

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

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

相关文章

教你轻松设计圣诞节日活动的邀请函?

即将迎来一年一度的圣诞活动,商家们要如何对此次活动展开宣传呢?要如何制作出一张符合节日气氛的活动邀请函?下面小编就教你如何使用在线工具乔拓云,用在线邀请函模板设计活动邀请函,一键就能生成活动邀请函链接&#…

springmvc整体运行流程

请求处理的流程 1:浏览器发送请求送至前端控制器DispatcherServlet。 2:DispatcherServlet收到请求后调用HandlerMapping处理器映射器。 3:处理器映射器找到具体的Handler处理器,封装成为执行链 4:返回执行链给Disp…

SpringBoot+MyBatis多表查询:以点餐系统的订单管理为例

文章目录项目场景数据库设计POJODaoServiceTest运行结果问题及解决项目场景 SpringBoot MyBatis ,实现点餐系统的订单查询。 参考:SpringBootMyBatis多表联合查询 数据库设计 通常一个订单中会包含多个菜品,即一条 order 里含多个 item&am…

使用 Zotero Citation Counts Manager 自动获取文献引用数

前言 最近习惯了搜完文献把文献的引用贴进 Zotero 文献条目的 Note 里,但是自己一点一点打字太累。想到了 Zotero 有插件,简单调研一下,发现了一个可以用的插件。支持 CrossRef 和 SemanticScholar 的引用数获取。(相对来说个人比…

QT QSlider、QHorizontalSlider、QVerticalSlider 控件 使用详解

本文详细的介绍了QSlider、QHorizontalSlider、QVerticalSlider控件的各种操作,例如:新建界面、设置刻度显示、设置范围值、设置值、获取值、设置步长、刻度间隔、改变方向、滑动信号、按下信号、滑动信号、释放滑块、样式表等操作。 本系列QT全面详解文…

职业生涯交叉点,7年测试工程师经历,继续做测试还是转开发?

我毕业后一直从事软件测试工作,今年28岁了。所做的工作都是功能测试,对于性能测试、自动化测试完全没有接触。 我是在深圳的一个小公司上班,每天朝九晚五的,工作不累。属于那种要来活了半天就可以搞定,剩下的时间都是…

三车道交通流元胞自动机研究附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

app提交上架最新流程 ios​

一、上架基本需求资料 1、苹果开发者账号(公司已有可以不用申请,需要开通开发者功能,每年 99 美元)​ 2、开发好的APP​ 二、证书 上架版本需要使用正式的证书​ 1、创建证书 ​​Apple Developer​​​ 2、上传证书 Sign In …

设计模式之工厂方法模式

factory method design pattern 工厂方法模式的概念、工厂方法模式的结构、工厂方法模式的优缺点、工厂方法模式的使用场景、工厂方法模式的实现示例、工厂方法模式的源码分析 1、工厂方法的概念 工厂方法模式,及简单工厂模式的升级版,其抽象了对象的创…

进阶 - Git分支管理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGglo72S-1670494545297)(https://lili40342.gitee.io/my-images/page/p_git.png)] 本篇文章,是基于我自用Linux系统中的自定义文件夹“test_rep”,当做示例演示 具体Git仓库的目…

用无代码,「低」人力成本也能做出「高」质量售后服务

目录 智能派单提升响应速度,移动端处理高效便捷 主动提升客户满意度,统一管理客户信息 标准化领、退料流程,精细化控制物料成本 沉淀数据资产,实时掌握最新状况 双十一大促热潮刚过,部分商家就开始因为“重销售,轻售后”的经营策略,而面临消费者的维权投诉,导致庆功…

企业微信对外收款功能如何开通?

之前很多企业在微信上运营客户,与客户达成交易后在微信上完成收款,但是会存在员工谎报账款、走私单的情况,因此企业改用企业微信对公收款。 前言 之前很多企业都在微信上运营客户,从开始追踪客户到成交客户这一整个过程都在微信上…

Day41——Dp专题

文章目录四、完全背包01背包的核心代码完全背包的核心代码12、零钱兑换 II13、组合总和 Ⅳ四、完全背包 完全背包&#xff1a;每一个物品可以选无限次 完全背包和01背包问题唯一不同的地方就是&#xff0c;每种物品有无限件 01背包的核心代码 for(int i 0; i < weight.…

全网最全的linux上docker安装oracle的详细文档,遇到了n个问题,查了几十篇文章,最终汇总版,再有解决不了的,私聊我,我帮你解决

文章目录全网最全的linux上docker安装oracle的详细文档&#xff0c;遇到了n个问题&#xff0c;查了几十篇文章&#xff0c;最终汇总版&#xff0c;再有解决不了的,私聊我&#xff0c;我帮你解决1. 拉取阿里镜像oracle2. 创建初始化数据3. 创建启动容器 数据持久化4. 进入oracle…

JVM学习初整理

JVM 内存结构(运行时数据区)&#xff1a;堆(Heap)&#xff0c;方法区(Method area)&#xff0c;栈(本地方法栈(Native Method Stacks)&#xff0c;虚拟机方法栈(Java Virtual Machine Stacks))&#xff0c;程序计数器(The pc Register) 堆&#xff1a;java虚拟机所管理的内存…

空调集中控制器的分类

在日常生活中&#xff0c;人们接触较多的是空调遥控器&#xff0c;空调智能控制器与空调遥控器有较大区别。空调遥控器是一对一管理&#xff0c;空调控制器可以集中管理。一般应用于机房管理、学校教室、图书馆管理、办公室、大型商场、工厂宿舍等地方。 红外空调控制器 红外空…

ACM6753(18V/3A三相无感BLCD无刷直流电机驱动IC)

概述 ACM6753是一款18V/3A三相无感BLCD(无刷直流)电机驱动IC、180˚正弦&#xff0c;集成驱动算法预驱MOS &#xff0c;内置电流检测。 产品指标和特性 • 供电电压范围&#xff1a;5V-24V • 上侧MOS下侧MOS&#xff1a;250mΩ • 3A 连续旋转电流&#xff0c;4A峰值保护电流 …

图书商城在线销售系统(ssm,layui,mysql)+全套视频教程

今天&#xff0c;我们发布一套【图书商城在线销售系统(ssm,layui,mysql)】,系统使用技术包含JAVA,SSM,LAYUI,MYSQL&#xff0c;这套系统后台框架使用SSM,数据库使用MySql, 这套系统包含完整的源代码和数据库脚本&#xff0c;根据我们提供的开发工具和运行视频教程&#xff0c;拿…

Java进阶——IO流(II)

文章目录三、节点流和处理流3.1、处理流BufferedReader和BufferedWriter3.2、处理流BufferedInputStream和BufferedOutputStream3.3、对象流ObjectInputStream和ObjectOutputStream3.4、标准输入输出流3.5、转换流InputStreamReader和OutputStreamWriter3.6、打印流**PrintStre…

【多目标进化优化】MOPSO 原理与代码实现

&#x1f388;&#x1f49e;&#x1f49e; &#x1f607; 热烈欢迎您的到来 &#x1f607; &#x1f498;&#x1f498;&#x1f388;——青年有志 &#x1f3c6;初衷&#xff1a; 通俗的语言 dapei 核心的内容 &#x1f389; 博主相信&#xff1a; 有足够的积累&#xff0c…