[Python] 详解使用动态规划求解最大回撤并绘图

【Python】 计算最大回撤率(金融工程) 使用Python计算金融资产的最大回撤、回撤开始时间、结束时间、持续时间 阅读详情

前情提要

最近股市行情很好啊,我那点儿钱买的基金也小赚了一点点。在这时,我忽然又想起来了之前我写的最大回撤率的文章,当时为了省事儿,求最大回撤率的时候直接遍历了数组两次,耗时O(2n)。我想优化一下求最大回撤率的算法,于是有了这一篇文章。

另外,我翻了翻人家求最大回撤率的博客,求的都是最大回撤,于是最大回撤和最大回撤率就在我脑海里回荡,他们俩什么关系? 但是,我没发现确切描述最大回撤和最大回撤率的区别的人。他们俩的区别,这个问题在我脑海里绕了两天,今天终于被我整明白了。那就是,在基金中,一般找到最大回撤,就相当于找到了最大回撤率,因为基金的净值波动的数值并不大。然而,最大回撤≠最大回撤率。证明过程会放在文中描述。

一. 最大回撤和最大回撤率

有一个数组,求其中两个数 x, y ,满足 x 的索引小于 y 的索引:

  • 最大回撤:使得 x - y 最大。
  • 最大回撤率:使得 (x - y) / x 最大。

没错,最大回撤率,多除以了一个最高点 x 的值。那么他们俩会不会有不同呢?

1. 最大回撤率

最大回撤率,来源于百度百科:

1.回撤用来衡量该私募产品的抗风险能力。

回撤的意思,是指在某一段时期内产品净值从最高点开始回落到最低点的幅度

最大回撤率,不一定是(最高点净值-最低点净值)/最高点时的净值,也许它会出现在其中某一段的回落。

公式可以这样表达:

D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值

drawdown就是最大回撤率

drawdown=max( ( Di - Dj ) / Di ),其实就是对每一个净值进行回撤率求值,然后找出最大的。可以使用程序实现。

2. 最大回撤

首先,我们要理解什么是最大回撤。

最大回撤:有一个数组,求其中两个数 x , y,满足 x 的索引小于 y 的索引,使得 x -y 最大。 下面举例几种情况:

[1,2,3,4,5,6,7,8,9]: 最大回撤是-1。	            (1)
[9,8,7,6,5,4,3,2,1]: 最大回撤是8,对应的x=9,y=1。	(2)
[3,7,2,6,4,1,9,8,5]: 最大回撤是6,对应的x=7,y=1。	(3)
[2,3,5,2,4,1,9,2,6]: 最大回撤是7,对应的x=9,y=2。	(4)
[9,2,5,1,8,5,9,2,1]: 最大回撤是8,对应的x=9,y=1。	(5)
[8,2,5,1,8,5,9,2,1]: 最大回撤是8,对应的x=9,y=1。	(6)

用图来表示就是:

列子(1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 最大回撤和最大回撤率的区别

我告诉你,当然不同!最大回撤≠最大回撤率。然而,在基金中,一般找到最大回撤,就相当于找到了最大回撤率,因为基金的净值波动的数值并不大。

看图!!!
在这里插入图片描述
但是,你见过基金有这么大的净值差吗?
…
…
…
最大回撤和最大回撤率建模:

你如果能证明以下:

一条曲线 y = f(x) 上有两个点 (x0, y0) 和 (x1, y1),且两个点都在第一象限,其中 x1 > x0 ,y0 - y1 > 0,是否满足当 y0 - y1 最大时,(y0 - y1) / y0 最大?

那么就可以说明,最大回撤=最大回撤率。

二、求解最大回撤(率)

我们求解最大回撤,都是为了求解最大回撤率。既然基金中不存在那么大的净值差,我们只要直接求解最大回撤就行了。

0. 先贴出最终版代码和测试用例:

最终代码是基于求解最大回撤的最低点和最高点的方式的代码,如果看官要看动态规划,可以直接跳到 3. 动态规划——换种思考方式。在此处算法中,最大回撤是负的也可以。实际上,最大回撤一般都是正值。

def _withdraw_with_high_low(arr):
    """ 传入一个数组,返回最大回撤和对应的最高点索引、最低点索引 """
    _dp = 0  # 使用 _dp 表示 i 点的最大回撤
    i_high = 0  # 遍历时,0 ~ i - 1 中最高的点的索引,注意是索引

    # 全局最大回撤和对应的最高点和最低点的索引,注意是索引
    g_withdraw, g_high, g_low = float('-inf'), -1, -1

    for i in range(1, len(arr)):
        # 注意:此处求的是
        if arr[i_high] < arr[i-1]:  # 若 0 ~ i - 1 中最高的点小于当前点
            i_high = i-1  # 0 ~ i - 1 中最高的点的索引

        _dp = arr[i_high] - arr[i]  # _dp 表示 i 点的最大回撤
        if _dp > g_withdraw:  # 找到新的最大回撤,更新三个值
            g_withdraw = _dp
            g_high = i_high
            g_low = i

    return g_withdraw, g_high, g_low

test_case_s = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [9, 8, 7, 6, 5, 4, 3, 2, 1],  # range(9, 0, -1)
    [3, 7, 2, 6, 4, 1, 9, 8, 5],
    [2, 3, 5, 2, 4, 1, 9, 2, 6],
    [9, 2, 5, 1, 8, 5, 9, 2, 1],
    [8, 2, 5, 1, 8, 5, 9, 2, 1],
    [9, 3, 5, 2, 8, 5, 8, 3, 1],    # 最大回撤率的不同
    [8, 2, 5, 1, 8, 5, 9, 3, 2],
    [0, 2, 3, 4, 5, 6, 7, 9, 10],
    [0, 4, 6, 8, 12, 14, 19, 24, 28],    # 负值
]


for test_case in test_case_s:
    print(_withdraw_with_high_low(test_case))
(0, 0, 1)	# 直线,回撤率0
(8, 0, 8)	# 上升线
(6, 1, 5)
(7, 6, 7)
(8, 0, 3)
(8, 6, 8)
(8, 0, 8)
(7, 0, 3)
(8, 0, 8)
(-1, 1, 2)	# 回撤率是负的
(-2, 1, 2)	# 回撤率是负的

1. 最直接的思考方式——循环两次

循环两次,第一次寻找最低点,第二次寻找最低点前的最高点。但这样实际上是错误,例子(4)就是很好的解释。哔哔一句,以前我就是这样想的,以为最大回撤就是先找到最低点再找到最高点,泪目。

2. 暴力枚举——找出所有情况

求出所有 i,j( i < j ) 且0 <= i, j <= n-1 两点之间的差值,寻找出其中最大的差值,就是最大回撤。例如下图,假设数组大小为4,则取a0-a1、a0-a1、…、a2-a3 中的最大值,就是最大回撤:

在这里插入图片描述

def _force(arr):
    max_withdraw = float('-inf')    # 负无穷
    n = len(arr)

    for i in range(n):
        for j in range(i+1, n):
            diff = arr[i] - arr[j]
            max_withdraw = max(max_withdraw, diff)

    return max_withdraw


for test_case in test_case_s:
    print(_force(test_case), end=' ')
0 8 6 7 8 8 8 7 -1 -2 

这种方法找出最大回撤肯定是没问题的,但是时间复杂度是O(n^2)。

3. 动态规划——换种思考方式

再看一遍最大回撤的题意,有一个数组,求其中两个数x,y,满足x的索引小于y的索引,使得 x-y 最大。

现在我们假设 dp[i] 表示 [0, i-1] 中最高的点到 i 的差值,dp[i] 中最大的值就是最大回撤,就是 max(dp[i]),0 <= i <= n-1 。为什么呢?看下面的图之后,你就理解了:

在这里插入图片描述

而dp[i] = max(dp[i-1] + diff, diif),diff = arr[i-1] - arr[i],dp[0] = -1。

下面证明:dp[i] = max(dp[i-1] + diff, diif)

令 diff[i] = a[i-1] - a[i] ,即,diff1 = a0 - a1, diff2 = a1 - a2 ...

dp[0] = -1  # 仅有一个点时,无意义

dp[1] = a0 - a1	

dp[2] = max(a0 - a2, a1 - a2),而 a0 - a2 = (a0 - a1) + (a1 - a2) = dp[1] + a1 - a2
	  = max(dp[1] + a1 - a2, a1 - a2)
	  = max(dp[1] + diff2, diff2)

dp[3]:
    a0 - a3 = (a0 - a2) + (a2 - a3) = dp[1] + diff2 + diif3
    a1 - a3 = (a1 - a2) + (a2 - a3) = dff2 + diff3
    a2 - a3 = diif3
dp[3] = max(a0 - a3, a1 - a3, a2 - a3)
	  = max(dp[1] + diff2 + diif3, dff2 + diff3, diff3)  ,提出 diff3
	  = max(max(dp[1] + diff2, diff2) + diff3, diff3)
	  = max(dp[2] + diif3, diif3)
    
依次类推:
dp[i] = max(dp[i-1] + diff, diif),diff = arr[i-1] - arr[i]

写成代码:

def _dp_withdraw(arr):
    dp = [0] * len(arr)
    dp[0] = -1  # 或者 float('-inf'),因为仅一个点时无意义

    for i in range(1, len(arr)):
        diff = arr[i-1] - arr[i]
        dp[i] = max(dp[i-1] + diff, diff)

    return max(dp)

在循环迭代的时候,我们只使用到了 dp[i] 和 dp[i - 1],也就是说整个数组参与迭代的只需要两个数,稍加修改,我们还能改成一个数:

def _dp_withdraw(arr):
    _dp = -1	# 或者 float('-inf')
    max_withdraw = _dp

    for i in range(1, len(arr)):
        diff = arr[i-1] - arr[i]
        _dp = max(_dp + diff, diff)
        max_withdraw = max(max_withdraw, _dp)

    return max_withdraw

至此,我们已经把时间复杂度降到了O(n),把空间复杂度将到了O(1)。接下来我们还要做的事,就是求解最大回撤的最低点和最高点。

4. 求解最大回撤的最低点和最高点——另辟蹊径

dp[i] 表示 [0, i-1] 中最高的点到 i 的差值,可以理解 dp[i] 对应最大回撤的最低点就是 i ,我们把这个称为 low[i],low[i] = i 。我们只要求出 dp[i] 对应最大回撤的最高点即可。而这个最高点,就是 [0, i-1] 中的最大值。假设dp[i] 对应最大回撤的最高点为 high[i],其索引为 high_index[i],则 high[i] = max(arr[j]),high_index[i] = j,0 <= j <= i - 1。想一想很容易想通:

dp[1] = a0 - a1	
☆ high[1] = a0,high_index = 0


dp[2] = max(a0 - a2, a1 - a2)
☆ high[2] = max(a0, a1),high_index[2] = 0 / 1


dp[3] = max(a0 - a3, a1 - a3, a2 - a3)
☆ high[3] = max(a0, a1, a2),high_index[3] = 0 / 1 / 2

... ...

整理一下,假设每个点的最大回撤值、最大回撤对应的最低点和索引、最高点和索引分别是 dp[i]、low[i]、low_index[i]、high[i],high_index[i]:

dp[i] = max(dp[i-1] + diff, diif),diff = arr[i-1] - arr[i]
low[i] = arr[i],low_index[i] = i
high[i] = max(arr[j]),high_index[i] = j,0 <= j < i	# 注意注意! j 属于 [0, i) 左闭右开

不清楚你有没有发现,我们其实可以不通过 dp[i] 数组,就可以直接找到 i 点最大回撤的最高点和最低点了了:

low[i] = arr[i],low_index[i] = i
high[i] = max(arr[j]),high_index[i] = j,0 <= j < i

而 i 点的最大回撤恰恰是:

dp[i] = high[i] - low[i]

我们要求的是:

max(dp[i])   0 <= i <= n - 1 

写成代码:

def _withdraw_with_high_low(arr):
    dp = [0] * len(arr)  # dp[i]存储i的最大回撤
    high = [-1] * len(arr)  # 存储i点的 0 ~ i - 1 中最高的点的索引,注意是索引
    g_max = 0  # 遍历时,0 ~ i - 1 中最高的点的索引,注意是索引
    g_withdraw = float('-inf')  # 全局最大回撤
    g_high, g_low = 0, 0    # 全局最大回撤对应的最高点和最低点索引,注意是索引

    for i in range(1, len(arr)):
        if arr[g_max] < arr[i-1]:
            g_max = i-1  # 0 ~ i - 1 中最高的点的索引
        dp[i] = arr[g_max] - arr[i]
        high[i] = g_max

        if dp[i] > g_withdraw:  # 找到新的最大回撤
            g_withdraw = dp[i]
            g_high = high[i]
            g_low = i

    return g_withdraw, g_high, g_low    # 返回最大回撤和对应的最高点索引、最低点索引

5. 代码关键点

我们很需要注意的就是循环之中:

for i in range(1, len(arr)):
    if arr[g_max] < arr[i - 1]:  # 此处是 i - 1,而不是 i
        g_max = i - 1  # 此处是 i - 1,而不是 i

# 还记得我们前面讲的:
# ☆ high[1] = a0,high_index = 0
# ☆ high[2] = max(a0, a1),high_index[2] = 0 / 1
# ☆ high[3] = max(a0, a1, a2),high_index[3] = 0 / 1 / 2
# ...
# ☆ high[i-1] = max(a0, a1, a2, ..., ai-2),high_index[i-1] = 0 / 1 / 2 / ... / i - 2
# 所以high_index是从0开始,最终到n-2,而不会取到n-1, 属于 [0, n-1) 左开右闭区间

6. 代码优化

代码中存在很多地方可以优化,循环中high数组和dp数组都只用到了high[i]和dp[i],可以使用一个变量替代:

def _withdraw_with_high_low(arr):
    i_high = 0  # 遍历时,0 ~ i - 1 中最高的点的索引,注意是索引
    g_withdraw = float('-inf')  # 全局最大回撤
    g_high, g_low = 0, 0    # 全局最大回撤对应的最高点和最低点索引,注意是索引
    _dp, _high = 0, -1      # dp数组和high数组变成了单个变量

    for i in range(1, len(arr)):
        if arr[i_high] < arr[i-1]:    # 若 0 ~ i - 1 中最高的点小于当前点
            i_high = i-1          # 0 ~ i - 1 中最高的点的索引
        _dp = arr[i_high] - arr[i]
        _high = i_high

        if _dp > g_withdraw:  # 找到新的最大回撤
            g_withdraw = _dp
            g_high = _high
            g_low = i

    return g_withdraw, g_high, g_low

high[i]只是作为了中间变量来传递,所以 high 数组可以不用了:

def _withdraw_with_high_low(arr):
    """ 传入一个数组,返回最大回撤和对应的最高点索引、最低点索引 """
    _dp = 0  # 使用 _dp 表示 i 点的最大回撤
    i_high = 0  # 遍历时,0 ~ i - 1 中最高的点的索引,注意是索引

    # 全局最大回撤和对应的最高点和最低点的索引,注意是索引
    g_withdraw, g_high, g_low = float('-inf'), -1, -1

    for i in range(1, len(arr)):
        if arr[i_high] < arr[i-1]:  # 若 0 ~ i - 1 中最高的点小于当前点
            i_high = i-1  # 0 ~ i - 1 中最高的点的索引

        _dp = arr[i_high] - arr[i]  # _dp 表示 i 点的最大回撤
        if _dp > g_withdraw:  # 找到新的最大回撤,更新三个值
            g_withdraw = _dp
            g_high = i_high
            g_low = i

    return g_withdraw, g_high, g_low

以上,就是最终版的代码了。时间复杂度降到了O(n),空间复杂度也降到了O(1)。

要注意的是,如果没有最大回撤,也就是曲线一直是上升的,最大回撤会是负值。

三、绘制折线图

1. 安装matplotlib模块

使用了matplotlib模块:

pip install matplotlib

2. 调用绘图函数

import matplotlib.pyplot as plt

def draw_trend_and_withdraw(xs, ys, title, max_x, max_y, show_max_str, min_x, min_y, show_min_str,
                            withdraw=None, withdraw_x=None, withdraw_y=None):
    """ 根据数据绘制折线走势图 """
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.plot(xs, ys)  # 根据数据绘制折线走势图
    plt.title(title)

    plt.scatter(min_x, min_y, color='r')  # 标记最低点
    plt.scatter(max_x, max_y, color='r')  # 标记最高点
    plt.annotate(show_min_str, xytext=(min_x, min_y), xy=(min_x, min_y))  # 标记提示
    plt.annotate(show_max_str, xytext=(max_x, max_y), xy=(max_x, max_y))  # 标记提示

    plt.plot([min_x, max_x], [min_y, max_y], color='b', linestyle='--')  # 连接最低净值点和最高净值点
    if withdraw_x is None or withdraw_y is None:
        plt.annotate(f'   {withdraw}', xytext=((max_x + min_x) / 2, (max_y + min_y) / 2), xy=((max_x + min_x) / 2, (max_y + min_y) / 2))  # 标记提示
    else:
        plt.annotate(f'   {withdraw}', xytext=(withdraw_x, withdraw_y), xy=(withdraw_x, withdraw_y))  # 标记提示

    plt.show()

调用代码:

for test_case in test_case_s:
    arr = test_case
    max_withdraw, _max, _min = _withdraw_with_high_low(test_case)
    draw_trend_and_withdraw(list(range(0, 9)), arr, f'{arr}', _max, arr[_max], f'最高点索引:{_max}',
                            _min, arr[_min], f'最低点索引:{_min}', max_withdraw)

成功绘图。

【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据) 起因 前一段时间投了一家金融公司的Python开发工程师,让我做以下事情: 以月为窗口,挑选一只基金or股票,查看它近2年最大回撤率; 找到从08年-至今的金融危机时间段,并呈现在这些危机时间段内,该基金or股票的历次回撤率。 给了3天时间,代码我1天不到就写完了,写完之后我就去做自己的项目了,沉迷技术无法自拔~~~ 3天过后,没想到打电话过来的是产品经理,完全不问代码的事情,问我平时是怎么学习的;问我有没有考虑为什么要分析这些东西;问我以后的方向;问我学习中遇到过的最大的问题是什么,我说了我最近做的 阅读详情

相关推荐

Python与Numpy高效计算最大回撤:从理论到实践

本文深入探讨了在Python中使用Numpy高效计算最大回撤的方法。从解释最大回撤作为核心风险指标的重要性出发,对比了O(n²)暴力算法与O(n)线性算法的性能差异,并详细演示了如何利用Numpy的向量化操作实现高效的线性算法。文章还提供了使用真实股票数据进行计算、可视化及处理投资组合的实战案例,帮助读者从理论到实践全面掌握这一关键金融分析技能。

weixin_29061821的博客 410

python金融分析小知识(35)——最大回撤的计算

Hello 大家好,我是一名新来的金融领域打工人,日常分享一些python知识,都是自己在学习生活中遇到的一些问题,分享给大家,希望对大家有一定的帮助!今天就给大家讲讲在进行量化策略回测结果分析的时候最最最常见的有一个指标——最大回撤的计算。最大回撤(Max drawdown)指标评价一个交易模型及其投资组合的风险度,最大回撤越小越好。最大回撤的计算公式是MDD = (A-B) / A,其中A是最大下跌前的资产最大净值(peak asset value before largest drop),B为资产净值

qq_41281698的博客 1万+

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

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

qq_43523544的博客 6736

python实现交易策略评价指标-最大回测

最大回撤是评估金融产品收益的一个非常重要的风险指标,它指的是在选定历史周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。以上图为例,最大回撤ValueA−ValueBValueA最大回撤 = \frac{(ValueA - ValueB) } {ValueA}最大回撤ValueAValueA−ValueB​。

cl2010abc的专栏 1948

maxretrace最大回撤计算

用于计算净值曲线的最大回撤。用户输入净值曲线序列,方程会返回最大回撤序列。

测试用例经典练习之微信发红包测试用例

微信发红包测试用例

ZCYaiCLX3344的博客 1万+

最大回撤率(Python实现)

最大回撤率     在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。最大回撤用来描述买入产品后可能出现的最糟糕的情况。最大回撤是一个重要的风险指标,对于对冲基金和数量化策略交易,该指标比波动率还重要。 D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值 drawdown就是最大回撤率 drawdown=max(Di-...

刘不饱的博客 4万+

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 445

Python 实现最大回撤

____tz_zs最大回撤 是一个重要的风险指标。对于对冲基金和数量化策略交易,这个指标比波动率还重要。定义:对于序列x1,x2,⋯,xn ,定义最大回撤d 为·# -*- coding: utf-8 -*- """ @author: tz_zs 最大回撤 """ import numpy as np import matplotlib.pyplot as plt # data = [100,...

tz_zs的博客 1万+

SpringBoot不用三方框架,怎么动态调度定时任务,ScheduledExecutorService 详解

Spring Boot 提供了强大的定时任务支持,无需依赖任何第三方框架,即可轻松实现可配置的定时任务。通过使用 `@EnableScheduling` 注解启用定时任务支持后,我们可以利用 `@Scheduled` 注解来定义定时任务的方法,这些方法可以在指定的时间间隔或特定时间点自动执行。 我们还可以通过集成 `ScheduledExecutorService` 来实现灵活的定时任务管理。`ScheduledExecutorService` 是 Java 标准库的一部分,能够以固定速率或延迟执行任务,

横竖撇折点 1937

使用libx265对YUV进行h265编码

使用libx265对YUV进行h265编码

Embedded engineer 3075

量化交易入门(二十七)回撤、收益率、夏普比率

收益率是衡量一个交易策略或投资组合盈利能力的关键指标,表示投资回报与投入本金的比率。收益率 = (卖出价格 - 买入价格) / 买入价格 × 100%绝对收益率:总收益额与初始本金的比率。年化收益率:将总收益换算为年收益率,便于不同时间周期的策略比较。复合年化收益率:考虑了复利效应,即将收益再投资的年化收益率。夏普比率(Sharpe Ratio)由诺贝尔经济学奖得主威廉·夏普(William Sharpe)提出,是衡量投资组合或交易策略风险调整后收益的重要指标。

TradingAgents-CN专栏 1万+

从零开始:HLW8110电能计量IC的硬件设计与软件调试全攻略

本文详细介绍了HLW8110电能计量IC的硬件设计与软件调试全流程,涵盖核心特性、抗干扰设计、UART通信协议及校准方法。通过实战案例和优化技巧,帮助工程师快速掌握高精度交流测量技术,适用于智能插座、充电桩等应用场景。

p5l2m9n4o6q的博客 576

精华贴分享|简单回撤杠杆模型——阿基米德动态杠杆分析

通过上述分析,我们可以得到一些结论:保有现金流十分重要!在回撤阶段空仓,可以在上涨阶段为你赢得巨大利益(听着像废话),空仓是一种智慧,不上杠杆也是一种智慧;若在回撤时带有杠杆,则越回撤,杠杆需要越大,否则在价格回归时,不能回本。在回撤期间中途减杠杆、停止策略就是对不起回撤期间的忍耐。我们也可以看到,动态杠杆涉及到的内容是十分精细的,里面有很多值得研究的东西。04阿基米德动态杠杆我们通过从数学模型中得到的一个小启发,对原版阿基米德动态杠杆进行了改良,实验证明了:动态杠杆是有效的。

xingbuxing_py的博客 1138

/home 挂载点无法访问 怎么解决 指令可以进入Home目录 du: 无法访问“*“: 输入/输出错误

本文介绍了Linux系统中XFS文件系统损坏的故障排查与修复方法。当/home挂载点出现I/O错误时,通过dmesg发现XFS日志错误和磁盘I/O报错,判断可能是文件系统逻辑损坏或硬件故障。解决方案包括:1)尝试卸载分区;2)使用xfs_repair工具进行预检查和正式修复;3)在极端情况下使用-L参数强制清空日志;4)若存在硬件故障,建议优先进行数据抢救并更换硬盘。最后强调重要数据应先备份,再考虑系统重建。

专注于计算机研发知识和资讯分享 150

基于机器学习的网络安全态势感知模型研究与实现

基于机器学习的网络安全态势感知模型研究与实现 1. 背景介绍 1.1 网络安全态势感知的重要性 在当今互联网时代,网络安全已经成为一个至关重要的话题。随着网络攻击手段的不断升级和演变,传统的被动防御方式已经难以满足日益

AI大模型应用之禅 1581

Python计算最大回撤、回撤天数

Python计算最大回撤、回撤天数 回撤是投资或者交易中常见的一个名词,是指账户的资金减少。资金回撤的定义分很多种,这些定义之间差异微小,大同小异,一般而言,资金回撤都是在一定的时期内进行衡量的,通常以年或者季度为标准。

科研小呆瓜的博客 8741

基于PyTorch+Transformer实现谣言检测系统

本项目使用基于`PyTorch+Transformer`的谣言检测模型,将文本中的谣言事件进行连续向量化,通过一维卷积神经网络的学习训练来挖掘表示文本深层的特征,避免了特征构建的问题,并能发现那些不容易被人发现的特征,从而产生更好的效果。

优快云 精品推荐 6349

PyQt5_pyqtgraph例子_净值曲线加回撤曲线

效果: 净值曲线 添加回撤曲线 绿色区域是最大回撤所在区间,红色竖线是最大回撤所在位置 代码: import sys import pandas as pd from PyQt5 import QtWidgets,QtGui from PyQt5.QtCore import Qt from typing import Any,Dict import pyqtgraph as pg pg.setConfigOption('background', 'w') pg.setConfigOpti

m0_37967652的博客 1141

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python计算最大回撤_最大回撤线性算法实现

最大回撤是指投资组合在选定的周期内,任一时间点往后推,可能出现资产净值下降的最大幅度。回撤的意思是指在某一段时期内净值从最高点开始回落到最低点的幅度。最大回撤常用百分率来表示,是一个重要的风险指标。最大回撤的计算公式为$$最大回撤 = \left( 波峰值 - 波谷值 \right) / 波峰值$$注意这里的$波峰值$与$波谷值$并不一定是最高值与最低值,这里的$波峰值$与$波谷值$要与时间范围...

weixin_39825941的博客 1583

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算最大回撤

【代码】计算最大回撤。

m0_69849450的博客 384

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

学习记录657@python计算股价的回撤与收盘价回撤率组合图实现

以比亚迪为例,对其收盘价计算回撤,计算逻辑的核心是求的当前日期及其之前日期的价格的最大值,然后计算回撤率,然后就可以求最大值了。本文不仅给出回撤的计算,还画出了价格与回撤率的组合图,便于观察。看完这篇文章,还能学会组合图的绘制,一张绘制两张图,双纵轴坐标。从图中可以清楚的看到随着时间的走势,回撤的变化,最大回撤情况。什么也不说了,一切尽在代码中。

教练我想学编程 1181

pandas_计算最大回撤

目录 概念 一、数据为收盘价,计算最大回撤 二、数据为净值,计算最大回撤 概念 计算方法 1. 将收益率做成时间序列 2. 计算财富指数(也就是净值)【PS:初始净值为1】 3. 计算上一个最高点 4. 计算回撤率 5. 找出最大回撤 日期 收益率 财富指数(净值) 上一个高点 回撤率 02-19 0.014483 1*(1+0.014483) =1.014483 1.014483 0 02-20 ..

m0_37967652的博客 4483

【零基础】Python金融分析与量化交易实战

购买课程后,添加小助手微信(微信号:csdnxy68)回复【唐宇迪】 进入学习群,获取唐宇迪老师答疑Python金融分析与量化交易实战课程旨在帮助同学们快速掌握Python数据分心核心技能与交易交易系统策略部署与回测分析。全部课程内容皆以实战为主,通俗讲解数据分析常用方法与经典解决方案。主要包括三大核心模块:1.Python数据科学必备工具包实战;2.金融数据分析处理与分析实例;3.量化交易平台策略分析实战。整体风格通俗易懂,零基础即可入门,适合准备转行就业与进阶提升的同学们。 课程特色:1、机器学习算法全面覆盖,每个算法均有配套项目实战!2、通俗易懂,用最接地气的方式讲解复杂的算法与代码!3、五年沉底,精选配套案例,打造最适合初学者的实战路线图!4、机器学习教材免费领取,课程持续更新,永久有效!

清华-尹成老师-Python量化交易day3

尹成老师带你步入python量化交易的殿堂,讲课生动风趣、深入浅出,全套视频内容充实,整个教程以python语言为核心,完整精彩的演练了pythonGUI量化交易操作流程以及各种精彩的小项目等,非常适合大家学习!

Day22:算法篇之动态回溯

算法:动态回溯+N皇后问题

zjjaibc的博客 421
上一篇: [Python] future线程处理并发的核心源码详解
下一篇: [Python] 深入理解元类并区分元类中的init、call、new方法
Spade_
博客等级 码龄10年 918粉丝 123原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值