投资绩效分析指标系列之一:MaDrawDown&MaDrawDownDuration
作者:李洋faruto
在量化投资中,定量投资模型的设计好坏无疑是成功的关键,单纯从数学角度来看,一个交易系统(交易模型)仅仅是一个从行情序列到资金曲线的映射:
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
% [farutoliyang@foxmail.com](mailto:farutoliyang@foxmail.com)
%% 初始化
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)是在净值空间维度上描述净值的波动风险,那么最大回撤持续期(MaxDraw DownDuration)则是在净值的时间维度上给出一个风险描述。
最大回撤持续期(MaxDrawDownDuration)直观上是比较好理解的,直观说就是一个组合(产品)净值创新高的节奏和频率是怎样的。举个极端的例子,试想如果一个组合的历史最大回撤为2-5%,但历史最大回撤持续期为一年,虽然这样的产品回撤很小,但这样的组合(产品)在资金利用效率上可能并不高,可能部分投资者承受不了这样长时期的资金震荡期,实际情况可能往往一个季度如果你的组合净值不创新高,可能大多数投资者就会给你来电询问情况了。
那么结合最大回撤持续期(MaxDrawDownDuration)这一投资绩效分析指标就可以更全面的监控组合的风险情况。
有时候可以将最大回撤(MaxDrawDown)和最大回撤持续期(MaxDrawDownDuration)综合起来生成一个复合指标来综合描述净值空间维度和时间维度的波动情况,比如上面的下部的子图,就是将MaxDrawDown和MaxDrawDownDuration做某种变换后,乘在一起,生成的复合指标,综合监控净值的波动。
好了,最大回撤(MaxDrawDown)和最大回撤持续期(MaxDrawDownDuration)的介绍大概就到这里了。上面所有测试的代码如下:
%% NetValueDemoTemplate
% by LiYang_faruto
% Email:farutoliyang@foxmail.com
% 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]);
LabelSet(gca, Dates, [], [], 1);
str = ['Investment Performance Metrics\_DrawDownDuration(Day)'];
title(str,'FontWeight','Bold','FontSize',10);
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(DDduration);
tH = text(ix,MaxV,num2str(MaxV));
tH.HorizontalAlignment = 'center';
tH.VerticalAlignment = 'bottom';
subplot(3,1,3)
h = plot(DDdTe);
h.LineWidth = 1.5;
xlim([0,Len+1]);
LabelSet(gca, Dates, [], [], 1);
str = ['Investment Performance Metrics\_DDDuration*DDPercent(Day*Extent)'];
title(str,'FontWeight','Bold','FontSize',10);
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];
[MinV,ix] = min(DDdTe);
tH = text(ix,MinV,[num2str(MinV)]);
tH.HorizontalAlignment = 'center';
tH.VerticalAlignment = 'top';
%% Record Time
toc;
displayEndOfDemoMessage(mfilename);
(本文仅代表作者观点)
交易技术, 交易策略
风险提示及免责条款
市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!
