这里给出了我之前提到的跨年李节趋势文易策略的.MATLAB代码。(源代码可从epchan. com/book/example7_7. m下载。)由于数据是基于2007年12月23日获取的标准普尔500指数,所以存在存活偏差。
clear;
load('SPX 20071123','tday','stocks','c1');
%找到月底几天的指数.
monthEnds= find (isLastTradingDayOf Month( tday));
monthlyRet=..
(cl(monthEnds,:)-lagl (cl(monthEnds,:)))./..
lagl(cl(monthEnds,:));
mycl=fillMissingData(cl);
%按月收益率升序排列
[monthlyRetSorted sortIndex]=sort(monthly,Ret,2);
%排序后的前一年本月收益率
prevYearMonthlyRetSorted=backshift(12 , monthlyRetSorted) ;%去年排序后的指数
prevYearSortIndex=backshift(12,sortIndex);
positions= zeros(size( month IyRet));
for m=13:size( monthlyRet,1)
hasReturns=...
isfinite(prevYearMonthlyRetSorted(m,:))&..
isf inite(cl(monthEnds( m-1),:));
mySortIndex=prevYearSortlndex(m,hasReturns);
%买入十分位数最高的几只股票,卖出十分位数最低的几只股票
topN=floor( length(mySortlndex) /10);
posiions(m-1,inySortlndex(1:topN))=-1;
positions(m-1,..
mySortlndex(end-topN+1:end))=1;’
end
ret=smartsum (lag1(positions) .*monthlyRet,2);
avgannret=12 * smartmean(ret);
sharpe= sqrt (12)*smartmean(ret)/smartstd(ret);
fprintf (1,..
'Avg ann return= %7.4f Sharpe ratio= %7.4f\n',..
avgannret,sharpe);
%输出应该是年收益率均位=-0.9167 Sharpe ratio=-0.1055
这一程序用到T几个工具函数,第一个是LastTradingDayOf Month,它返回1和0的逻辑数组,用以判断某个文易日是否是一个月的最后一个交易日。
function isLastTradingDay0f Month=..
isLastTradingDayOfMonth( tday)
% isLastTradingDayOfMonth= isLastTradingDayOfMonth( tday)返回一个逻择序列。如果tday(t)确为当月的最后交易日,返回True.
tdayStr=datestr(datenum(num2str(tday),'yyyymmdd'));
todayMonth= month(tdayStr);
tmrMonth=fwdshift( ],todayMonth);%tomorrow's month
isLastTradingDayOfMonth= false( size(tday));
isLastTradingDayOfMonth (todayMonth?二tmrMonth &..
isfinite(todayMonth)衣isfinite(tmrMonth))=true;
另一个工具函数是backshift函数,它与lagl函数类似,但可以平移任意天数。
function y=backshift(day,x)
%y= backshift (day, x)
assert(day> = 0);
y= [NaN(day,size(x,2),size(x,3));x(1:end-day,:,:)];
如果你尝试录近5年而不是全部数据,会发现平均收益率更低。