使用python中的矢量化解决方案计算最大跌幅 [英] Calculate max draw down with a vectorized solution in python

查看:111
本文介绍了使用python中的矢量化解决方案计算最大跌幅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最大跌幅是定量分析中常用的风险指标财务以评估所经历的最大负收益.

Maximum Drawdown is a common risk metric used in quantitative finance to assess the largest negative return that has been experienced.

最近,我变得不耐烦花时间使用循环方法计算最大跌幅.

Recently, I became impatient with the time to calculate max drawdown using my looped approach.

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

我对矢量化解决方案会更好的普遍看法很熟悉.

I'm familiar with the common perception that a vectorized solution would be better.

问题是:

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

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

I modified Alexander's answer into the following function:

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假定为返回的数据帧,其中每一列是单独的策略/管理器/安全性,而每一行是一个新日期(例如每月或每天).

df_returns is assumed to be a dataframe of returns, where each column is a seperate strategy/manager/security, and each row is a new date (e.g. monthly or daily).

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

这篇关于使用python中的矢量化解决方案计算最大跌幅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆