量化交易:最大回撤(Drawdown)算法

量化交易:最大回撤(Drawdown)算法

写在前面:

本文为本人学习用于回测报告中的最大回撤算法指标时整理的学习笔记,欢迎沟通交流~

一、基本概念

1.1 最大回撤(Max Drawdown)

回撤:对于任意日期区间,回撤 = 钱包的亏损比例 =(现值 - 原值)/ 原值 = 现值 / 原值 - 1 = 缩水比例 - 1,若结束值相对起始值未下降,则回撤为0.0。

最大回撤:相当于一位最不幸的投资者,在一个最糟糕的日期买入,随后在另一个最糟糕的日期卖出,亏损比例(绝对值)比任何两个其他日期的买卖都高。所有日期区间中回撤绝对值最大的,当有多个最大回撤相等时,只选一个(<= 0.0),选择规则是:

  • 等值最大回撤对应的日期区间重叠时:选日期区间最狭窄的;
  • 等值最大回撤对应的日期区间不重叠时:选日期区间最晚的。
    • 出现该情况时,晚的区间的峰值和谷值一定高于或等于早的区间的峰值和谷值。

在这里插入图片描述
最大回撤区间:最大回撤对应的起始日期和结束日期。

最大回撤意义:通常用于衡量和比较股票、基金、指数的波动下行风险。在经过长期波动后,最大回撤较小的股票,通常有更大的长期涨幅,也对挑选合适的入场时机有一定的参考价值。

对数图:金融产品的走势图,应该都使用对数图,或者与对数图等价的等比例图。在对数图上,两个值的对数之间的垂直距离与缩水比例线性相关,而缩水比例与回撤正相关,即log(low / high) = log(low) - log(high)

等比例:任何3条相邻距离相等的水平线,上2条水平线的数值比例,与下两条水平线的数值比例相等,也就是他们的对数的差相等。

等比例图:与对数图的水平线一致,但标识的数值不是对数而是原数值。

示例:如何使用对数图及其重要性

1.2 斐波那契回撤(Fibonacci Drawdown)

斐波那契回撤线(Fibonacci Retracement)是指能够发现资产价格潜在支撑位与压力位的水平线。斐波那契回撤水平线允许交易者在任意两个价格点之间绘制(通常是高点与低点)。 23.6%、38.2%、50%、61.8%和78.6%是斐波那契水平的百分比,表示资产价格可能出现停滞或逆转的区域。
在这里插入图片描述

斐波那契回撤意义:在技术分析中,当股价或其他资产价格在上涨趋势中出现回调时,交易者通常会将斐波那契回撤水平作为潜在的支撑位来观察。如果价格在靠近这些水平时显示出反弹迹象,这可能是一个入场的时机。

例如,假设某股票价格从10美元上涨到20美元,然后开始回调。斐波那契回撤工具可以帮助确定可能的支撑位,如23.6%的回撤水平大约在18.26美元,而50%的回撤水平在15美元。交易者可以观察这些水平是否与其他技术指标或趋势线相互确认,来确认是否进行买入操作。

二、最大回撤算法设计

2.1 输入

一个结构或类型(struct or class)的列表或数组(array or list),至少包含两个域或者属性(field or attribute):域具体内容日期按升序排列并且没有重复数值通常代表指数、后复权价、累计净值等,均为正实数(正浮点数)

2.2 处理

根据输入计算出列表或数组中的最大回撤及区间的起止点。

2.3 输出

最大回撤(<= 0.0),最大回撤区间起始日期及数值,最大回撤区间结束日期及其数值。

2.4 算法分析

按照定义回撤只能是0.0或者负数,所谓回撤最大,指的是回撤的绝对值最大。只要列表或者数组非空,从任一点出发,到它**以后***的点,都一定有一个最大回撤。

以后*:包含自身,“之后”则不包含自身。

  • 如果某个点是最后一个点,则它只有一个以后的点,即自身,那么从此点开始的最大回撤就是0.0;
  • 如果某个点的值比它之后所有点的值都低或者相等,那么从此点到其以后任意点的回撤全部;
  • 每个点到它之后的任一点,都可以计算出回撤,这些回撤中必有一个最大的(多个最大回撤相同时按规则选取);
  • 所有起始点的最大回撤中,再选出最大的,就是整个列表或数组的最大回撤。
  • 以上即为遍历算法的基本思想。
2.4.1 遍历算法

算法思想:通过遍历数组中的每个点,将其视为可能的峰值,然后从这一点遍历到数组末尾,寻找与该峰值相比的最小回撤。

算法流程

1. 初始化:1. 设定整体最大回撤为1.0 (一个不可能的值)2. 初始化整体最大回撤的起点和终点位置为空
2. 对于列表或数组中的每个点 i:a. 初始化本轮最大回撤为1.0 (一个不可能的值)b. 初始化本轮最大回撤的终点位置为空
3. 对于每个点 i,计算它到它以后所有点 j 的回撤值:a. 计算从点 i 到点 j 的回撤值b. 若回撤值 < 本轮最大回撤:- 更新本轮最大回撤为当前回撤值- 记录起点 i 和终点 j 作为本轮最大回撤的起点和终点c. 若回撤值 == 本轮最大回撤且起点 i 相同:- 比较终点位置,若当前终点 j 更早,则更新终点为 j
4. 比较本轮最大回撤和整体最大回撤:a. 若本轮最大回撤 <= 整体最大回撤:- 更新整体最大回撤为本轮最大回撤- 更新整体最大回撤的起点和终点位置
5. 重复步骤 2-4,直到所有点 i 都已作为起点计算过回撤
6. 输出整体最大回撤及其对应的起点和终点位置

关键理解点

若本轮最大回撤<=整体最大回撤,则将整体最大回撤替换为本轮最大回撤。之所以相等时也替换,是因为【1】若区间重叠,晚的起点区间更狭窄;【2】若区间不重叠,也要选晚的。

遍历算法的优化

1. 初始化:1. 设定整体最大回撤为1.0 (一个不可能的值)2. 初始化整体最大回撤的起点和终点位置为空
2. 对于列表或数组中的每个点 i 作为起点:a. 初始化本轮最低点为 i 处的值b. 初始化本轮最大回撤为1.0 (一个不可能的值)c. 初始化本轮最大回撤的终点位置为空
3. 对于每个点 i,遍历从 i+1 到列表或数组末尾的每个点 j:a. 如果 j 处的值小于本轮最低点:- 更新本轮最低点为 j 处的值- 计算从点 i 到点 j 的回撤值- 更新本轮最大回撤为该回撤值- 记录终点 j 作为本轮最大回撤的终点位置b. 如果 j 处的值等于本轮最低点且 j 更早出现(即 j 更靠前):- 仅更新终点为 j- 计算新的回撤值并与本轮最大回撤比较,若有必要则更新本轮最大回撤
4. 比较本轮最大回撤和整体最大回撤:a. 若本轮最大回撤 <= 整体最大回撤:- 更新整体最大回撤为本轮最大回撤- 更新整体最大回撤的起点和终点位置
5. 重复步骤 2-4,直到所有点 i 都已作为起点进行过处理
6. 输出整体最大回撤及其对应的起点和终点位置

关键优化点

仅计算最低点的回撤:对于每个起点,找到它之后的最低点(若有多个最低点,选择最早的),然后计算该最低点的回撤即可。

时间复杂度 O ( n 2 ) O(n^2) O(n2)

空间复杂度 O ( 1 ) O(1) O(1)

2.4.2 简洁算法

算法思想:采用二分查找的方法,逐步缩小搜索范围,以找到最大回撤。

算法流程

按最低点分解

1. 初始化:1. 设定整体最大回撤为1.0 (一个不可能的值)2. 初始化整体最大回撤的起点和终点位置为空
2. 从整个列表或数组中找到最低点:1. 若有多个相等的最低点,选择最早出现的最低点2. 记录此最低点的位置
3. 划分列表或数组为两部分:1. **前半段**(最低点以前)2. **后半段**(最低点之后)
4. 对前半段进行处理:a. 找到前半段的最高点(若有多个,选择最晚的一个)b. 计算前半段最高点到最低点的回撤值c. 记录前半段的最大回撤
5. 对后半段进行递归处理:a. 如果后半段为空,则跳过b. 找到后半段的最低点,若有多个相等的最低点,选择最早出现的c. 划分后半段为新的前半段和新的后半段d. 计算新的前半段的最大回撤e. 递归处理新的后半段,重复步骤 4 和 5
6. 比较前半段和后半段的最大回撤:1. 更新整体最大回撤为前半段和后半段中的最大值2. 若回撤值相同,则选择最晚出现的回撤
7. 输出整体最大回撤及其对应的起点和终点位置

关键步骤说明

  • 找到最低点:确定整个列表或数组的全局最低点,分割为前半段和后半段。
  • 前半段处理:计算前半段内的最大回撤值,并将其作为前半段的回撤结果。
  • 后半段递归处理:对后半段应用相同的算法,递归拆分和计算,直到整个数组都处理完。
  • 比较和更新:将前半段和后半段的最大回撤进行比较,更新整体最大回撤值。

时间复杂度

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

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

相关文章

基于SpringBoot+Vue的厨艺交流系统的设计与实现(源码+定制开发)厨艺知识与美食交流系统开发、在线厨艺分享与交流平台开发、智能厨艺交流与分享系统开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

java -jar 命令自动重启 Java 项目

一、java -jar 方式运行项目 重启Java项目通常意味着你需要先停止当前运行的Java进程&#xff0c;然后再次启动它。下面是在CentOS上执行这些步骤的一种常见方法&#xff1a; 停止Java进程 找到Java进程的PID&#xff1a; 使用ps命令配合grep来查找运行中的Java进程的PID&#…

关于WPF项目降低.Net版本

本来有项目是.NET Framework 4.8的&#xff0c;为了兼容升级到.NET 8.0&#xff0c;后期又为了兼容放弃.NET 8.0&#xff0c;升级的步骤&#xff1a;利用vs2022 的 .NET Upgrade Assistant 扩展&#xff0c;磕磕绊绊也升级完成了&#xff1b; 扩展链接&#xff1a; Upgrading…

windows下安装VirtualBox7.1.4

记录详细的安装过程与遇到的问题&#xff1b; 下载地址 virtualbox官网 清华镜像源下载 下载完成后文件&#xff1a; 双击打开&#xff1b; 报错了 意思是需要pc上先安装Microsoft Visual C 2019 https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redi…

分布式数据库环境(HBase分布式数据库)的搭建与配置

分布式数据库环境&#xff08;HBase分布式数据库&#xff09;的搭建与配置 1. VMWare安装CentOS7.9.20091.1 下载 CentOS7.9.2009 映像文件1.2启动 VMware WorkstationPro&#xff0c;点击“创建新的虚拟机”1.3在新建虚拟机向导界面选择“典型&#xff08;推荐&#xff09;”1…

2024java高频面试之JVM

说说 JVM 内存区域 程序计数器 是「程序控制流的指示器&#xff0c;循环&#xff0c;跳转&#xff0c;异常处理&#xff0c;线程的恢复等工作都需要依赖程序计数器去完成」。程序计数器是「线程私有」的&#xff0c;它的「生命周期是和线程保持一致」的&#xff0c;我们知道&a…

【STM32开发笔记】移植AI框架TensorFlow【DSP指令加速篇】

【STM32开发笔记】移植AI框架TensorFlow【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN&#xff1f;2.2 CMSIS-NN是什么&#xff1f;2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM中CMSIS-NN相关…

【前端学习】HTML+CSS+JavaScript 入门教程

文章目录 前言1. HTML、CSS、JavaScript 的关系2. HTML2.1 什么是 HTML2.2 认识标签2.3 HTML 常见标签1&#xff09;标题标签&#xff1a;h1 - h62&#xff09;段落标签&#xff1a;p3&#xff09;换行标签&#xff1a;br4&#xff09;图片标签&#xff1a;img5&#xff09;超链…

Linux系统:(Linux系统概述与安装)

硬件计算机硬件是指计算机系统中所有物理部件的总称。包括计算机主机、显示器、键盘、鼠标、内存、硬盘、处理器、主板等等。这些硬件部件是计算机系统运行的基础 不管是电脑系统(个人电脑、服务器等)、还是移动端操作系统(手机、平板等)。它的功能就是做为用户和硬件之间的桥梁…

Java配置 Redis 连接互斥锁或队列预先加载缓存

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

2024年龙信

挂载VC的密码&#xff1a;MjAyNOmmeS/oeadrw 手机取证 1. Android 设备在通过 ADB 连接时&#xff0c;通常会要求用户授权连接&#xff0c;会要求用户确认设备授权&#xff0c;并将该设备的公钥保存在 adb_keys文件中 寻找到data/misc/adb/adb_keys下面有中有两个&#xff0c;…

动态规划:17.简单多状态 dp 问题_买卖股票的最佳时机III_C++

题目链接&#xff1a; 一、题目解析 题目&#xff1a;123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 拿示例1举例&#xff1a; 我们可以如图所示买入卖出股票&#xff0c;以求得最大利润&#xff0c;并且交易次数不超过2次 拿示…

webpack自定义插件 ChangeScriptSrcPlugin

插件文件 class ChangeScriptSrcPlugin {apply(compiler) {const pluginName "ChangeScriptSrcPlugin";compiler.hooks.compilation.tap(pluginName, (compilation, callback) > {compilation.hooks.htmlWebpackPluginAlterAssetTags.tapAsync(pluginName,(html…

N9305高品质mp3音频语音芯片ic在早教故事机的应用方案

随着人们对教育的重视程度不断提高&#xff0c;儿童早教机已经成为了很多家庭的教育必备品。N9305音乐芯片在早教故事机中的应用&#xff0c;不仅为孩子们带来了丰富多彩的故事世界&#xff0c;还以其卓越的音质表现和功能&#xff0c;进一步提升了早教体验。 九芯电子N9305高品…

HarmonyOS Next模拟器异常问题及解决方法

1、问题1&#xff1a;Failed to get the device apiVersion. 解决方法&#xff1a;关闭模拟器清除用户数据重启

Kafka之消费者组与消费者

消费者&#xff08;Consumer&#xff09;在Kafka的体系结构中是用来负责订阅Kafka中的主题&#xff08;Topic&#xff09;&#xff0c;并从订阅的主题中拉取消息后进行处理。 与其他消息中间件不同&#xff0c;Kafka引入一个逻辑概念——消费组&#xff08;Consumer Group&…

黑马程序员Java笔记整理(day03)

1.switch 2.for与while对比 3.嵌套定义,输出的区别性 4.break与continue 5.随机数生成的两种方式 6.Random 7.随机验证码

15分钟学Go 第2天:安装Go环境

第2天&#xff1a;安装Go环境 1. 引言 在学习Go语言之前&#xff0c;首先需要配置好本地开发环境。本节将详细介绍如何在Windows 11上安装和配置Go语言环境&#xff0c;包括安装步骤、环境变量设置、VS Code配置与测试、以及常见问题解决方案。完成这些步骤后&#xff0c;你将…

【计算机网络 - 基础问题】每日 3 题(四十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

基于模型设计的智能平衡移动机器人-基础实验SCI

目录 SCI通信 模型搭建 串口测试 实验结果 SCI通信 简单来说就是信号的传递。 SCI&#xff08;Serial Communication Interface)意为“串行通信接口”&#xff0c;是相对于并行通信的&#xff0c;是串行通信技术的一种总称&#xff0c;最早由Motorola公司提出的。它是一…