All,
I am trying to separate data into a "training set" and a "train set" for a co-integration analysis of two stocks. GDL and GDX. I need to attach a function called "ols" for linear regression. I grabbed that code off of spatial-econometrics.com. It's the "Regress" folder, once the file is downloaded. I have attached the main code that I am using to do the analysis, and the ols code that needs to be used for the linear regression, yet I am having a hard time figuring out how to have the analysis talk with the ols to make the code work.
The first code is the main part, the analysis.
>>
clear;
[num, txt]=xlsread('GLD');
tday1=txt(2:end, 1);
tday1=datestr(datenum(tday1, 'mm/dd/yyyy'), 'yyyymmdd');
tday1=str2double(cellstr(tday1));
adjcls1=num(:, end);
[num, txt]=xlsread('GDX');
tday2=txt(2:end, 1);
tday2=datestr(datenum(tday2, 'mm/dd/yyyy'), 'yyyymmdd');
tday2=str2double(cellstr(tday2));
adjcls2=num(:, end);
[tday, idx1, idx2]=intersect(tday1, tday2);
cl1=adjcls1(idx1);
cl2=adjcls2(idx2);
trainset=1:252;
testset=trainset(end)+1:length(tday);
results=ols(cl1(trainset), cl2(trainset));
hedgeRatio=results.beta;
spread=cl1-hedgeRatio*cl2;
plot(spread(trainset));
figure;
plot(spread(testset));
figure;
spreadMean=mean(spread(trainset));
spreadStd=std(spread(trainset));
zscore=(spread - spreadMean)./spreadStd;
longs=zscore<=-2;
shorts=zscore>=2;
exits=abs(zscore)<=1;
positions=NaN(length(tday), 2);
positions(shorts, :)=repmat([-1 1], [length(find(shorts)) 1]);
positions(longs, :)=repmat([1 -1], [length(find(longs)) 1]);
positions(exits, :)=zeros(length(find(exits)), 2);
positions=fillMissingData(positions);
cl=[cl1 cl2];
dailyret=(cl - lag1(cl))./lag1(cl);
pnl=sum(lag1(positions).*dailyret, 2);
sharpeTrainset=sqrt(252)*mean(pnl(trainset(2:end)))./std(pnl(trainset(2:end)))
sharpeTestset=sqrt(252)*mean(pnl(testset))./std(pnl(testset))
plot(cumsum(pnl(testset)));
save example3_6_positions positions;
??? Undefined function or method 'tdis_inv' for input arguments of type 'double'.
Error in ==> ols at 64
tcrit=-tdis_inv(.025,nobs);
This second code is the ols for the linear regression.
function results=ols(y,x)
if (nargin ~= 2); error('Wrong # of arguments to ols');
else
[nobs nvar] = size(x); [nobs2 junk] = size(y);
if (nobs ~= nobs2); error('x and y must have same # obs in ols');
end;
end;
results.meth = 'ols';
results.y = y;
results.nobs = nobs;
results.nvar = nvar;
if nobs < 10000
[q r] = qr(x,0);
xpxi = (r'*r)\eye(nvar);
else
xpxi = (x'*x)\eye(nvar);
end;
results.beta = xpxi*(x'*y);
results.yhat = x*results.beta;
results.resid = y - results.yhat;
sigu = results.resid'*results.resid;
results.sige = sigu/(nobs-nvar);
tmp = (results.sige)*(diag(xpxi));
sigb=sqrt(tmp);
results.bstd = sigb;
tcrit=-tdis_inv(.025,nobs);
results.bint=[results.beta-tcrit.*sigb, results.beta+tcrit.*sigb];
results.tstat = results.beta./(sqrt(tmp));
ym = y - mean(y);
rsqr1 = sigu;
rsqr2 = ym'*ym;
results.rsqr = 1.0 - rsqr1/rsqr2;
rsqr1 = rsqr1/(nobs-nvar);
rsqr2 = rsqr2/(nobs-1.0);
if rsqr2 ~= 0
results.rbar = 1 - (rsqr1/rsqr2);
else
results.rbar = results.rsqr;
end;
ediff = results.resid(2:nobs) - results.resid(1:nobs-1);
results.dw = (ediff'*ediff)/sigu;
I am very new to Matlab. I am pretty sure I need to modify the "If" statement to fit the main analysis but am having a hard time figuring out the proper language. After 3 days of trying, I figured I try the forums.