专栏名称: FQuantStudio
聊量化投资研究、聊MATLAB应用、聊投资理财-…
目录
相关文章推荐
中国航务周刊  ·  【受权发布】2025年3月中欧班列全程时刻表 ·  2 天前  
中国航务周刊  ·  MSC又在中国船厂订造8艘超大船 ·  4 天前  
中国航务周刊  ·  【展商推介】中灏国际,邀您莅临“2025国际 ... ·  4 天前  
中国航务周刊  ·  浙江海港、福建港口与莆田市政府三方签约 ·  5 天前  
中国航务周刊  ·  【展商推介】中锐国际,邀您莅临“2025国际 ... ·  5 天前  
51好读  ›  专栏  ›  FQuantStudio

投资绩效分析指标系列之一:MaxDrawDown&MaxDrawDownDuration

FQuantStudio  · 知乎专栏  ·  · 2015-05-29 07:54

正文

在量化投资中,定量投资模型的设计好坏无疑是成功的关键,单纯从数学角度来看,一个交易系统(交易模型)仅仅是一个从行情序列到资金曲线的映射:





    
f(ts,para) = E

其中f是一个交易系统,ts是某一个投资标的(股票、期货、期权、外汇等等)的行情时间序列,para是交易系统的参数组,E是资金曲线。如果f可以解析的表达出来,那么就可以使用泛函分析等数学工具,直接在理论层面来研究f的一些性质,包括其连续性、稳健性、对参数的敏感性等等一些性质,但事实上,往往实际投资中的交易系统大多数都没有显性解析表达式,只能通过数值回测给出该交易系统的表现,通过对资金曲线E的一些再处理,可以得到一些评价指标,比如年化收益率、夏普比率、最大回撤等等指标,通过这些指标,可以从一定角度来窥探这个交易系统的性能。

本篇主要来研究一下两个投资绩效分析指标:最大回撤(MaxDrawDown),最大回撤持续期(MaxDrawDownDuration)。

最大回撤(MaxDrawDown)是比较常见的衡量净值波动风险的一个指标,

举个“栗子”:

上图中上面的子图是某组合的净值曲线,下面的子图是相应的该净值的最大回撤。最大回撤一般表示净值从前期高点回撤的比例,其实现算法描述为:

设Equity为资金流,在索引(下标)Index处,可以找出之前的资金流的最大值,设该最大值为Max,如果Index处的资金流就为这个最大值,则Index处的最大回撤为0,否则Index处的最大回撤( Equtity(Index)-Max )/Max。

整体过程不复杂,逻辑也很简单明了,下面的RetraceRatio.m函数可以实现最大回撤的计算。

function [DrawDownPercent,DrawDownAbs] = RetraceRatio(Equity)
% 计算最大回撤比例
% by liyang 2012/5/25
% [email protected]
%% 初始化
len = numel(Equity);
DrawDownPercent = zeros(len, 1);
DrawDownAbs = zeros(len, 1);
%% 计算最大回撤比例
C = Equity(1);
for i = 2:len
    C = max(Equity(i),C);
    if C == Equity(i)
        DrawDownPercent(i) = 0;
    else
        DrawDownPercent(i) = (Equity(i)-C)/C;
    end
end
%% 计算最大回撤绝对数值
C = Equity(1);
for i = 2:len
    C = max(Equity(i),C);
    if C == Equity(i)
        DrawDownAbs(i) = 0;
    else
        DrawDownAbs(i) = (Equity(i)-C);
    end
end

最大回撤衡量净值的波动风险,某一交易系统的历史回测的最大回撤值表示该交易模型(系统)从任意给定时间点启动交易后可能潜在的净值波动风险,可以用历史最大回撤的某一倍数作为实盘后整体模型的风险监控和净值警戒线。

今天最大回撤(MaxDrawDown)可能并不是我想要着重给大家分享的,重点想给大家分享的是下面这个由最大回撤衍生出的一个投资绩效分析指标——最大回撤持续期(MaxDrawDownDuration)。

我们仍以上面的某组合的净值曲线为例,看下面这张图:

其中位于上部的子图仍是最大回撤(MaxDrawDown),中部的子图即为最大回撤持续期(MaxDrawDownDuration)。

最大回撤持续期(MaxDrawDownDuration)描述的是净值从回撤开始到再创新高所经历的时间,如果说最大回撤(MaxDrawDown)是在净值空间维度上描述净值的波动风险,那么最大回撤持续期(MaxDrawDownDuration)则是在净值的时间维度上给出一个风险描述。

最大回撤持续期(MaxDrawDownDuration)直观上是比较好理解的,直观说就是一个组合(产品)净值创新高的节奏和频率是怎样的。举个极端的例子,试想如果一个组合的历史最大回撤为2-5%,但历史最大回撤持续期为一年,虽然这样的产品回撤很小,但这样的组合(产品)在资金利用效率上可能并不高,可能部分投资者承受不了这样长时期的资金震荡期,实际情况可能往往一个季度如果你的组合净值不创新高,可能大多数投资者就会给你来电询问情况了。

那么结合最大回撤持续期(MaxDrawDownDuration)这一投资绩效分析指标就可以更全面的监控组合的风险情况。

有时候可以将最大回撤(MaxDrawDown)和最大回撤持续期(MaxDrawDownDuration)综合起来生成一个复合指标来综合描述净值空间维度和时间维度的波动情况,比如上面的下部的子图,就是将MaxDrawDown和MaxDrawDownDuration做某种变换后,乘在一起,生成的复合指标,综合监控净值的波动。

好了,最大回撤(MaxDrawDown)和最大回撤持续期(MaxDrawDownDuration)的介绍大概就到这里了。上面所有测试的代码如下:

%% NetValueDemoTemplate
% by LiYang_faruto
% Email:[email protected]
% 2015/02/14

%% A Little Clean Work
tic;
% clear;
% clc;
% close all;
format compact;
%% load Data

load FundValue_FQuant.mat;
Fund = FundNetValue_FQuant(:,2);
Dates = FundNetValue_FQuant(:,1);
%% Cal Investment Performance Metrics

[DrawDownPercent,DrawDownAbs,DDduration,DDdTe] = IPM_MaxDrawDown(Fund,1);

DrawDownPercent = DrawDownPercent*100;

%% Fund & MDD
Len = length(Fund);
scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);

subplot(3,1,1:2)
h = plot(Fund);
h.LineWidth = 1.5;
xlim([0,Len+1]);
LabelSet(gca, Dates, [], [], 1);
str = ['Fund Net Value'];
title(str,'FontWeight','Bold','FontSize',15);

tX = Len/2;
tY = sum(ylim)/2;
tH = text(tX,tY,'FarutoQuant');
tH.HorizontalAlignment = 'center';
tH.VerticalAlignment = 'middle';
tH.FontSize = 40;
tH.Color = [0.9 0.9 0.9];

[MaxV,ix] = max(Fund);
tH = text(ix,MaxV,num2str(MaxV));
tH.HorizontalAlignment = 'center';
tH.VerticalAlignment = 'bottom';

[MinV,ix] = min(Fund);
tH = text(ix,MinV,num2str(MinV));
tH.HorizontalAlignment = 'center';
tH.VerticalAlignment = 'top';


subplot(3,1,3)
h = plot(DrawDownPercent);

xlim([0,Len+1]);
LabelSet(gca, Dates, [], [], 1);
str = ['MaxDrawDown(%)'];
ylabel(str);

[MinV,ix] = min(DrawDownPercent);
tH = text(ix,MinV,[num2str(MinV),'%']);
tH.HorizontalAlignment = 'center';
tH.VerticalAlignment = 'top';
%% Investment Performance Metrics
Len = length(Fund);
scrsz = get(0,'ScreenSize');
figure('Position',[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);

subplot(3,1,1)
h = plot(DrawDownPercent);
h.LineWidth = 1.5;
xlim([0,Len+1]);
LabelSet(gca, Dates, [], [], 1);
str = ['Investment Performance Metrics\_MaxDrawDown(%)'];
title(str,'FontWeight','Bold','FontSize',10);

[MinV,ix] = min(DrawDownPercent);
tH = text(ix,MinV,[num2str(MinV),'%']);
tH.HorizontalAlignment = 'center';
tH.VerticalAlignment = 'top';

subplot(3,1,2)
h = plot(DDduration);
h.LineWidth = 1.5;
xlim([0,Len+1






请到「今天看啥」查看全文