回測一月效應

這裏給出了在標準普爾600小盤股上運用一月效應策略計算收益率的MATLAB代碼。(源代碼和數據可以從epchan. com/book/ example7_6. m下載。)
clear
load(’IJ R 20080131’);
onewaytcost=0. 0005;% 5bp one way transaction cost
years=.。
year(cellstr(datestr(datenum(cellstr(..
num2str(tday)),'yyyymmdd'))));
months=二
month( cellstr(datestr( datenum (cellstr(..
num2str(tday)),'yyyymmdd'))));
nextdayyear=f wdshif t (1, years);
nextdaymonth=fwdshift(1,months);
lastdayofDec=find (months==12&nextdaymonth==1);
lastdayofJan=find( months==1&nextdaymonth ==2 );
%lastdayofDec從2004年開始,
%所以將2004從lastdayofJan中刪掉
IastdayofJan(1) = []; 0 o確定每個IastdayofDec後的lastdayofJan
assert (all(tday(lastdayofJan)> tday(lastdayofDec)));
eoy=find(years? =nextdayyear);%年末指數
eoy(end) _ [] ;%上一個指數不是年末的
%確保eoy日期與lastdayofDec日期匹配
assert (all(tday(eoy)==tday(lastdayofDec)));
annret=.。
(cl(eoy(2:end),:)-cl(eoy(1:end-1),:))./..
cl(eoy(1:end-1),:);%年收益率
]anret=..
(cl(lastdayofJan(2:end),:)-
cl(lastdayofDec(2: end).:))./cl(lastdayofDec(2:end),:);
% ]月收益率
for y=1:size(annret,1)
%選取年收益率可觀的股票
hasData=..
find( isf inite(annret( y,:)));
%根據前一年的收益率排序
[foo sortidx]=sort (annret (y . hasData ),fascend');
%買入十分位數(decile)收益率最低的股票,賣出十分位數收益率最高的股票
topN = round (length (hasData)/10);
%組合收益率
portRet=..
(smart mean (janret(y. hasData(sortidx(I:topN))))—..
smart mean (j anret (y, hasData(..
sortidx(end一topN+1 :end)))))/2-2*onewaytcost;
fprintf(1,'Last holding date%i:Portfolio
return=% 7. 4f\n’.tday(lastdayofDec(y+1)).portRet));
end
%這裏應該是輸出
%最後持有期20051230:組合收益率=-0.0244
%最後持有期20061229:組合收益率=-0.0068
%最後持有期20071231:組合收益率=0.0881
這一程序用到了大量的工具函數。第一個是assert函數,用於確保程序是正確的。
function assert( pred,str)
寫若前提條件非真,ASSERT會報錯.
%assert (pred, string)
if nargin<2,str=’;end
if ^~ pred
s=sprintf ('assertion violated:% s,str);
error(s);
end
第二個函數足fwdshift函數,與lag1函數相反,是將時間序列函數向前移動一步。
function y=fwdshift(day, x)
assert(day>=0);
y=[x(day+1:end,:,:);..
NaN*ones(day, size(x,2),size(x,3))];