1. 首页 > 股票投资

回测一月效应策略的回测代码

回测一月效应

回测一月效应策略的回测代码

这里给出了在标准普尔600小盘股上运用一月效应策略计算收益率的MATLAB代码。(源代码和数据可以从epchan.com/book/example7_6.m下载。)

clear

load(’IJR20080131’);

onewaytcost=0.0005;%5bponewaytransactioncost

years=.。

year(cellstr(datestr(datenum(cellstr(..

num2str(tday)),'yyyymmdd'))));

months=二

month(cellstr(datestr(datenum(cellstr(..

num2str(tday)),'yyyymmdd'))));

nextdayyear=fwdshift(1,years);

nextdaymonth=fwdshift(1,months);

lastdayofDec=find(months==12&nextdaymonth==1);

lastdayofJan=find(months==1&nextdaymonth==2);

%lastdayofDec从2004年开始,

%所以将2004从lastdayofJan中删掉

IastdayofJan(1)=[];0o确定每个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),:);

%]月收益率

fory=1:size(annret,1)

%选取年收益率可观的股票

hasData=..

find(isfinite(annret(y,:)));

%根据前一年的收益率排序

[foosortidx]=sort(annret(y.hasData),fascend');

%买入十分位数(decile)收益率最低的股票,卖出十分位数收益率最高的股票

topN=round(length(hasData)/10);

%组合收益率

portRet=..

(smartmean(janret(y.hasData(sortidx(I:topN))))—..

smartmean(janret(y,hasData(..

sortidx(end一topN+1:end)))))/2-2*onewaytcost;

fprintf(1,'Lastholdingdate%i:Portfolio

return=%7.4f\n’.tday(lastdayofDec(y+1)).portRet));

end

%这里应该是输出

%最后持有期20051230:组合收益率=-0.0244

%最后持有期20061229:组合收益率=-0.0068

%最后持有期20071231:组合收益率=0.0881

这一程序用到了大量的工具函数。第一个是assert函数,用于确保程序是正确的。

functionassert(pred,str)

写若前提条件非真,ASSERT会报错.

%assert(pred,string)

ifnargin<2,str=’;end

if^~pred

s=sprintf('assertionviolated:%s,str);

error(s);

end

第二个函数足fwdshift函数,与lag1函数相反,是将时间序列函数向前移动一步。

functiony=fwdshift(day,x)

assert(day>=0);

y=[x(day+1:end,:,:);..

NaN*ones(day,size(x,2),size(x,3))];

本文来源于网友自行发布,不代表本站立场,转载联系作者并注明出处