3.3 业绩度量

3.3 业绩度量

量化交易员有很多不错的业绩度量指标,究竟使用哪些指标,很大程度上取决于个人偏好。但我认为,在策略之间、交易员之间进行横向比较,最重要的两个指标是夏普比率和挫跌。注意,我并没有提到平均年化收益率这个投资者最常用的度量指标,因为如果要使用这个指标,就必须得详细说明计算收益率所用到的分母c 例如,在多空策略中,分母用一个方向的资本还是两个方向的呢?收益率是杠杆收益率(分母用账户净值)还是无杠杆(分母用投资组合的市场价值)呢?如果净值或市场价值每日变化,分母是用移动平均值还是每天或每月末的价值呢?使用夏普比率和挫跌,而非标准的业绩度量指标,在对不同策略进行比较时,上述绝大多数(并非全部)问题就能避免。

第2 章介绍了夏普比率、最大挫跌和最长挫跌期的概念。本章结合Excel 和MATLAB 中的例子,指出夏普比率计算中的一些细节问题。

计算夏普比率时,甚至老练的投资经理也会混淆的一个细节问题是:是否需要从货币中性组合的收益中减去无风险收益?答案是否定的。货币中性组合可以用卖空所得现金买入证券,故它是自融资的,其融资成本很小(存贷利率差),在回测时可以忽略。同时,保证金余额能获得与无风险利率η 近似的存款利率D 假定策略收益率(组合收益率减去存款利率)为R ,无风险利率为η 。所以,用于计算夏普比率的超额收益率就是R+rF-rF=R 。因此在实际计算中,完全可以忽略无风险利率,只需关注股票头寸的收益率即可。

同样,一个没有隔夜头寸的纯多头当日交易策略也没有资金成本,其超额收益率也是策略本身的收益率。一般而言,在计算夏普比率时,仅当策略需要支付资金成本时,才需要减掉无风险利率。

年化夏普比率可以使策略更加容易。大多数人都知道如何年化平均收益率。例如,年均收益率就是月均收益率的12 倍。

然而,年化收益率标准差就稍微复杂一点。这里,假设月收益率是序列不相关的( Sharpe, 1994 ),年收益率标准差就是月收益率标准差的d言倍。于是,年化夏普比率就是月夏普比率的v'I2倍。

一般而言,假设每个交易时段的长度为T, T 可以是1 个月、1 天、1 小时等,若要计算平均收益率、标准差以及相应的年化指标,就必须先算出一年的交易时段数Nro 然后

年化夏普比率=./万7 ×基于T 的夏普比率

例如,策略只在纽约证券交易所交易时间(美国东部时间9: 30-16: 00 )持仓,每小时平均收益率为R ,每小时收益率标准差为5 ,则年化夏普比率为: ./f百BX.Rls 。因为, Nr= (252 个交易日)×( 6. 5 每一交易日交易小时) = 1 6380 一个常见的错误计算是: NT= 252 ×24=6 0480

例3. 4 计算纯多头策略和市场中性策略的夏普比率

先考虑一个关于IGE 的纯多头策略: 2001 年11 月26 日以收盘价买入1 股并持有, 2007 年11 月14 日以收盘价卖出。假设持有期内无风险利率为每年4% ,从雅虎财经下载持有期内IGE 的每日价格,保存为Excel 文件IGE. xis (不是默认的逗号分隔文件〉。使用Excel 或MATLAB 的步骤如下:

使用Excel

1. 下载的数据已在A-G 列;

2. 接日期升序对所有列进行排序〈使用数据排序功能,选择“扩展选定区域”单选按钮,选择“升序”和“有标题行”单选按钮〉;

3. 在H3 单元格内输入“= (G3-G2) /G2”,计算日收益率$

4. 选定H3 单元格,双击羊元格右下角的黑点,使H 列的整列按H3羊元格的方法计算IGE 的日收益率;

5. 在Hl 单元格内输入“日收益卒”以使阅读';

6. 在13 单元格内输入“= H3 一0.04/252”,计算超额日收益卒,假设元风险利率为每年4% ,一年有252 个交易日;

7. 选定13 单元格,双击单元格右下角的黑点,使I 列的整列按13 单元格的方法计算超额日收益率s

8. 在I1 单元格内输入“超额日收益卒”以便阅读$

9. 在11506 单元格内输入“= SQRT (252 )铃AVERAGE (13:11505) /STDEV 03: Il505 )飞

10. 11505 单元格显示结呆应该是“ 0.789317538”,这个结呆是购买并持有策略的夏普比率。

在我的个人网站上有已经做好的电子表格epchan. com/book/example3 4. xls 。

使用MATLAB

%清除工作空间已有变量

clear;

%从” IGE. xls”读入数据

[num, txt]=xlsread(’IGE');

%第一列〈从第二行开始〉是交易日,格式为mm/dd/ yyyy.

tday= txt(2: end, 1);

%将时间格式转化为yyyymmdd.

tday= dates tr( datenum ( tday ,’ mm/dd/yyyy丁,’ yyyymmdd');

%将数据字符串转化为单元型数组,再转化为数佳型交量

tday= str2double( cells tr( tday>;

%最后一列是调整后的收盘价

cls=num(:, end);

%将tday 按时间升序排列

[ tday sortlndex] =sort( tday ,’ascend');

%将els 按时间升序排列

cls= cls ( sortlndex) ;

%计算日收益率

dailyret= ( els(2: end)-els(l: end-1)). I els( 1: end-1) ;

%假设元风险利率为4% /年,每年252 个交易日,计算超额收益率;

excessRet= dailyret-0. 04/252;

%输出结果应该是0.7893

sharpeRatio=sqrt(252 )'铸mean( excessRet) /std ( excessRet)

MATLAB 代码可以从我的个人网站上下载epchan. com/book/example3 4. m。

再考虑多空市场中性策略。这个策略由前面策略变化而来z 在买入IGE 时,做空等量美元的标准普尔存托凭证( SPY )进行对冲, 2007 年11 月14 日同时将这两个头寸平仓。从雅虎财经下载SPY 价格数据,保存为SPY. xis 文件。Excel 和MATLAB 的使用步骤与上面很相似,留给读者做练习写出其精确步骤:

使用Excel

1. 按上面的方法对SPY. xis 的列按日期升序排序z

2. 复制SPY. xls 的G 列(调整后收盘价〉,粘贴到IGE. xls 的J 111;

3. 检查J 列的行数是否与A-I 列一样。如果不一样,说明数据有问题,核实从雅虎财经下载的数据是否是同一日期范围内的数据;

4. 使用同样的方法在K 列计算日收益率;

5. 在K 列的首行输入“日收益率”以便阅读;

6. 在L 列,计算H 和K 的差并除以2 ,得到套期保值策略的日净收益率(除以2 是因为使用了2 倍的资本〉;

7. 在Ll506 单元格内计算对冲策略的夏普比卒,结果应该是“0.783681 ”。

使用MATLAB

%接上例MATLAB 代码

%在此插入你自己的代码,像上例那样从SPY. xis 读入数据

%将包含SPY 每日收益的数组命名为“SPY 日收益卒”

%日净收益率〈除以2 是因为使用了2 倍的资金〉netRet= (dailyret-dailyretSPY) /2;

%输出结果应该是0. 7837.

sharpeRatio= sqrt(252 )祷mean( excessRet) Is td ( excessRet)

例3. 5 计算最大挫跌和最长挫跌期

继续使用上面的多空市场中性策略,来说明如何计算最大挫躁和最长拉政期。第一步需要在每日收盘时计算“高水位线”,即到这一天为止,策略的最大累积收益率。〈用累积收益率曲线来计算高水位线和拉跌,与用净值曲线是一样的,因为净值正是初始投资额与“ 1 +累积收益卒”的来积。〉有了高水位线,我们就可以计算出挫政、最大挫政和最长挫政期。使用Excel

1. 在M3 单元格内输入“= L3 ”;

2. 在M4 单元格内输入“= O+M3 )铃O+L4) -I ”,计算策略到某天为止的累积收益率。按此方法计算M 列,得到策咯的累积复合收益卒,并制除该列最后一个单元格,将这列命名为“累积收益卒” z

3. 在N3 单元格内输入“= M3”;

4. 在N4 羊元格内输入“= MAX (N3, N4 )”,计算到某天为止的“高水位线”。按此方法计算N 列并删除该列最后一个单元格,将这列命名为“高水位线” ;

5. 在03 单元格内输入“= (1 +N3) I O+M3) -I ”,计算每日收盘后的挫跌,按此方法计算O 列,得到策咯的拉政g

6. 在01506 单元格内输入“= MAX (03: 01505 )”,计算策咯的最大挫跌,结采约为o. 1053 ,即最大拉跌是10. 53%;

7. 在P3 单元格内输入“= IF (03=0, O, P2+1) ”,计算当前拉政期。按此方法计算P 列,是为策略的挫政期,并倒除该列最后一个单元格;

8. 在Pl506 单元格内输入“= MAX (P3: Pl505 )”,计算策咯的最长拉跌期,这个位大概是497 ,即最长挫政期合497 个交易日。

使用MATLAB

%接上例MATLAB 代码

%累积收益率

cumret=cumprod(l +netRet)-1 ;plot(cumret);

[maxDrawdown maxDrawdownDuration] = ...

calculateMaxDD( cumret) ;

[ maxDrawdown maxDrawdownDuration] = ??

cal cu la teMaxDD( cumret) ;

%最大挫跌,输出结采应该是o. 1053

maxDrawdown

%最长挫跌期,输出结果应该为497

maxDrawdownDuration

注意,上述代码调用了子程序“ calculateMaxDrawdown 气内容所示:

function [maxDD maxDDD]=calculateMaxDD(cumret)

% [maxDD maxDDD]=calculateMaxDD(cumret)

%在累积收益率的基础上计算最大挫政和最长挫跌期

%将高水位线初始化为o.highwatermark= zeros(size(cumret));

%将挫跌初始化为o.

drawdown =zeros( size( cumret)) ;

%将最长挫跌期初始化为0.

drawdownduration = zeros(size( cumret> z

for t=2 :length(cumret)

highwatermark( t) = max(highwatermark( t-1), cumret( t));

%计算每日挫跌〈相对于高水位〉

drawdown( t) = (1 + highwatermark( t)) I (1 + cumret( t) )-1;

if (drawdown(t) = =0)

drawdownduration(t) =O;

else

drawdownduration( t) = drawdownduration( t-1) + 1;

end

end

maxDD=max(drawdown); %最大拉政

maxDDD= max( drawdownduration) ; %最长挫政期

这个程序文件可在epchan. com/book/ calculateMaxDD. m 下载。因3-1 中的这段累积收益率曲线显示了最大挫歧和最长挫政期。