投資績效分析指標系列之一:MaxDrawDown&MaxDrawDownDuration
f(ts,para) = En
其中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)n% 計算最大回撤比例n% by liyang 2012/5/25n% farutoliyang@foxmail.comn%% 初始化nlen = numel(Equity);nDrawDownPercent = zeros(len, 1);nDrawDownAbs = zeros(len, 1);n%% 計算最大回撤比例nC = Equity(1);nfor i = 2:lenn C = max(Equity(i),C);n if C == Equity(i)n DrawDownPercent(i) = 0;n elsen DrawDownPercent(i) = (Equity(i)-C)/C;n endnendn%% 計算最大回撤絕對數值nC = Equity(1);nfor i = 2:lenn C = max(Equity(i),C);n if C == Equity(i)n DrawDownAbs(i) = 0;n elsen DrawDownAbs(i) = (Equity(i)-C);n endnendn
最大回撤衡量凈值的波動風險,某一交易系統的歷史回測的最大回撤值表示該交易模型(系統)從任意給定時間點啟動交易後可能潛在的凈值波動風險,可以用歷史最大回撤的某一倍數作為實盤後整體模型的風險監控和凈值警戒線。
今天最大回撤(MaxDrawDown)可能並不是我想要著重給大家分享的,重點想給大家分享的是下面這個由最大回撤衍生出的一個投資績效分析指標——最大回撤持續期(MaxDrawDownDuration)。
我們仍以上面的某組合的凈值曲線為例,看下面這張圖:
其中位於上部的子圖仍是最大回撤(MaxDrawDown),中部的子圖即為最大回撤持續期(MaxDrawDownDuration)。
最大回撤持續期(MaxDrawDownDuration)描述的是凈值從回撤開始到再創新高所經歷的時間,如果說最大回撤(MaxDrawDown)是在凈值空間維度上描述凈值的波動風險,那麼最大回撤持續期(MaxDrawDownDuration)則是在凈值的時間維度上給出一個風險描述。
最大回撤持續期(MaxDrawDownDuration)直觀上是比較好理解的,直觀說就是一個組合(產品)凈值創新高的節奏和頻率是怎樣的。舉個極端的例子,試想如果一個組合的歷史最大回撤為2-5%,但歷史最大回撤持續期為一年,雖然這樣的產品回撤很小,但這樣的組合(產品)在資金利用效率上可能並不高,可能部分投資者承受不了這樣長時期的資金震蕩期,實際情況可能往往一個季度如果你的組合凈值不創新高,可能大多數投資者就會給你來電詢問情況了。
那麼結合最大回撤持續期(MaxDrawDownDuration)這一投資績效分析指標就可以更全面的監控組合的風險情況。
有時候可以將最大回撤(MaxDrawDown)和最大回撤持續期(MaxDrawDownDuration)綜合起來生成一個複合指標來綜合描述凈值空間維度和時間維度的波動情況,比如上面的下部的子圖,就是將MaxDrawDown和MaxDrawDownDuration做某種變換後,乘在一起,生成的複合指標,綜合監控凈值的波動。
好了,最大回撤(MaxDrawDown)和最大回撤持續期(MaxDrawDownDuration)的介紹大概就到這裡了。上面所有測試的代碼如下:
%% NetValueDemoTemplaten% by LiYang_faruton% Email:farutoliyang@foxmail.comn% 2015/02/14nn%% A Little Clean Workntic;n% clear;n% clc;n% close all;nformat compact;n%% load Datannload FundValue_FQuant.mat;nFund = FundNetValue_FQuant(:,2);nDates = FundNetValue_FQuant(:,1);n%% Cal Investment Performance Metricsnn[DrawDownPercent,DrawDownAbs,DDduration,DDdTe] = IPM_MaxDrawDown(Fund,1);nnDrawDownPercent = DrawDownPercent*100;nn%% Fund & MDDnLen = length(Fund);nscrsz = get(0,ScreenSize);nfigure(Position,[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);nnsubplot(3,1,1:2)nh = plot(Fund);nh.LineWidth = 1.5;nxlim([0,Len+1]);nLabelSet(gca, Dates, [], [], 1);nstr = [Fund Net Value];ntitle(str,FontWeight,Bold,FontSize,15);nntX = Len/2;ntY = sum(ylim)/2;ntH = text(tX,tY,FarutoQuant);ntH.HorizontalAlignment = center;ntH.VerticalAlignment = middle;ntH.FontSize = 40;ntH.Color = [0.9 0.9 0.9];nn[MaxV,ix] = max(Fund);ntH = text(ix,MaxV,num2str(MaxV));ntH.HorizontalAlignment = center;ntH.VerticalAlignment = bottom;nn[MinV,ix] = min(Fund);ntH = text(ix,MinV,num2str(MinV));ntH.HorizontalAlignment = center;ntH.VerticalAlignment = top;nnnsubplot(3,1,3)nh = plot(DrawDownPercent);nnxlim([0,Len+1]);nLabelSet(gca, Dates, [], [], 1);nstr = [MaxDrawDown(%)];nylabel(str);nn[MinV,ix] = min(DrawDownPercent);ntH = text(ix,MinV,[num2str(MinV),%]);ntH.HorizontalAlignment = center;ntH.VerticalAlignment = top;n%% Investment Performance MetricsnLen = length(Fund);nscrsz = get(0,ScreenSize);nfigure(Position,[scrsz(3)*1/4 scrsz(4)*1/6 scrsz(3)*4/5 scrsz(4)]*3/4);nnsubplot(3,1,1)nh = plot(DrawDownPercent);nh.LineWidth = 1.5;nxlim([0,Len+1]);nLabelSet(gca, Dates, [], [], 1);nstr = [Investment Performance Metrics_MaxDrawDown(%)];ntitle(str,FontWeight,Bold,FontSize,10);nn[MinV,ix] = min(DrawDownPercent);ntH = text(ix,MinV,[num2str(MinV),%]);ntH.HorizontalAlignment = center;ntH.VerticalAlignment = top;nnsubplot(3,1,2)nh = plot(DDduration);nh.LineWidth = 1.5;nxlim([0,Len+1]);nLabelSet(gca, Dates, [], [], 1);nstr = [Investment Performance Metrics_DrawDownDuration(Day)];ntitle(str,FontWeight,Bold,FontSize,10);nntX = Len/2;ntY = sum(ylim)/2;ntH = text(tX,tY,FarutoQuant);ntH.HorizontalAlignment = center;ntH.VerticalAlignment = middle;ntH.FontSize = 40;ntH.Color = [0.9 0.9 0.9];nn[MaxV,ix] = max(DDduration);ntH = text(ix,MaxV,num2str(MaxV));ntH.HorizontalAlignment = center;ntH.VerticalAlignment = bottom;nnsubplot(3,1,3)nh = plot(DDdTe);nh.LineWidth = 1.5;nxlim([0,Len+1]);nLabelSet(gca, Dates, [], [], 1);nstr = [Investment Performance Metrics_DDDuration*DDPercent(Day*Extent)];ntitle(str,FontWeight,Bold,FontSize,10);nntX = Len/2;ntY = sum(ylim)/2;ntH = text(tX,tY,FarutoQuant);ntH.HorizontalAlignment = center;ntH.VerticalAlignment = middle;ntH.FontSize = 40;ntH.Color = [0.9 0.9 0.9];nn[MinV,ix] = min(DDdTe);ntH = text(ix,MinV,[num2str(MinV)]);ntH.HorizontalAlignment = center;ntH.VerticalAlignment = top;nn%% Record Timentoc;ndisplayEndOfDemoMessage(mfilename);n
未來《投資績效分析指標》會進行不定期系列展開,既會介紹一些常見的績效分析指標,也會介紹一些可能不常見但卻很好的魯棒績效指標,希望對您的量化建模以及實際投資有幫助。
我的微信公眾號FQuantStudio,歡迎掃碼關注。
推薦閱讀:
※股票策略回測的框架、實現、測試——以動量策略為例
※大數據指數對比分析
TAG:FQuantStudio |