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 中的这段累积收益率曲线显示了最大挫歧和最长挫政期。
