当前位置: 首页 > 面试题库 >

使用python中的矢量化解决方案计算最大跌幅

公孙高畅
2023-03-14
问题内容

最大跌幅是量化金融中用于评估已经历的最大负收益的常见风险度量。

最近,我变得不耐烦使用循环方法来计算最大跌幅。

def max_dd_loop(returns):
    """returns is assumed to be a pandas series"""
    max_so_far = None
    start, end = None, None
    r = returns.add(1).cumprod()
    for r_start in r.index:
        for r_end in r.index:
            if r_start < r_end:
                current = r.ix[r_end] / r.ix[r_start] - 1
                if (max_so_far is None) or (current < max_so_far):
                    max_so_far = current
                    start, end = r_start, r_end
    return max_so_far, start, end

我熟悉一个普遍的看法,即向量化的解决方案会更好。

问题是:

  • 我可以将这个问题向量化吗?
  • 这个解决方案是什么样的?
  • 有什么好处?

编辑

我将亚历山大的答案修改为以下功能:

def max_dd(returns):
    """Assumes returns is a pandas Series"""
    r = returns.add(1).cumprod()
    dd = r.div(r.cummax()).sub(1)
    mdd = dd.min()
    end = dd.argmin()
    start = r.loc[:end].argmax()
    return mdd, start, end

问题答案:

df_returns 假定是收益的数据框架,其中每一列是单独的策略/经理/安全性,而每一行是一个新日期(例如,每月或每天)。

cum_returns = (1 + df_returns).cumprod()
drawdown =  1 - cum_returns.div(cum_returns.cummax())


 类似资料:
  • 我试图通过记忆来解决“计数变化”的问题。 考虑下面的问题:我们可以用多少种不同的方式来换取1美元,半价、四分之一、二分硬币、五分硬币和五分硬币?更一般地说,我们可以编写一个函数来计算使用任何一组货币面额改变任何给定金额的方法的数量吗? 以及递归的直观解决方案。 使用n种硬币改变a的数量的方法数 除第一种硬币外,其他所有硬币都可以换成硬币的方法,加上 使用所有n种硬币改变较小数量a-d的方法的数量,

  • 令我惊讶的是,它通过了所有的测试用例。有人能给我解释一下这个逻辑吗?

  • 我还没有足够的信誉点来留下评论,但我看到过很多次,当人们(错误地)建议使用log10来计算正整数中的位数时。这对大数字来说是错误的! 我想知道为什么。 获取整数中位数的方法? 获取数字上位数的最快方法?

  • 问题内容: 我最近一直在研究Python中的Euler项目问题​​。我对Python相当陌生,但作为一名程序员还是有点陌生​​。 无论如何,我遇到了与速度相关的问题,为问题5编写了解决方案。问题是, “ 2520是可以除以1到10的每个数字而没有任何余数的最小数字。什么是可以被1到20的所有数字平均除的最小正数? 我已经检查了一些,但还没有找到关于此问题的任何有关Python的信息。有一些完整的脚

  • 我有一个问题,我不知道如何使用Java/LWJGL在OpenGL中渲染方向向量。 我有以下系统: X位于屏幕右侧 因此我走在XZ平面上,现在我想实现/已经实现了WASD运动,它应该与我当前前进的方向有关。(W=向前到相机看方向,S=向后等) 我有一个偏航角,定义如下: 如果一直向前,则为0度 现在我只想要一个代表偏航方向的3D矢量,我该怎么做呢? 我正在使用以下Java代码,包括答案,但似乎还有另

  • 我在这里编写了一个Python解决方案,它解决了以下问题:如何用最少数量的给定面额的硬币来制造给定数量的货币? 虽然我的解决方案有效,但当大于50或的长度大于5时,需要很长时间。我怎样才能加快代码的速度,使其能够在相当大的输入下工作?我是否错过了一个技巧或其他可以大大加快代码速度的东西?