algo_trading_book/original_code/andrewlo_2007_2012.m
2025-06-05 08:48:33 +02:00

75 lines
2.7 KiB
Matlab

%port_trade.m
clear;
load('../Data/inputDataOHLCDaily_20120424');
idxStart=find(tday==20070103);
idxEnd=find(tday==20111230);
tday=tday(idxStart:idxEnd);
cl=cl(idxStart:idxEnd, :);
op=op(idxStart:idxEnd, :);
% cl is a TxN array of closing prices, where T is the number of trading
% days, and N is the number of stocks in the S&P 500
ret=(cl-lag(cl, 1))./lag(cl, 1); % daily returns
marketRet=smartmean(ret, 2); % equal weighted market index return
weights=-(ret-repmat(marketRet, [1 size(ret, 2)]));
weights=weights./repmat(smartsum(abs(weights), 2), [1 size(weights, 2)]);
dailyret=smartsum(backshift(1, weights).*ret, 2); % Capital is always one
dailyret(isnan(dailyret))=0;
plot(cumprod(1+dailyret)-1); % Cumulative compounded return
fprintf(1, 'APR=%f Sharpe=%f\n', prod(1+dailyret).^(252/length(dailyret))-1, sqrt(252)*mean(dailyret)/std(dailyret));
% APR=13.7%, Sharpe=1.3
% daily pnl with transaction costs deducted
% onewaytcost=0.0005; % assume 5 basis points
%
% dailyretMinustcost=dailyret - ...
% smartsum(abs(weights./cl-backshift(1, weights)./backshift(1, cl)).*backshift(1, cl), 2).*onewaytcost./smartsum(abs(weights), 2); % transaction costs are only incurred when the weights change
%
% annavgretMinustcost=252*smartmean(dailyretMinustcost, 1)*100
%
% sharpeMinustcost=sqrt(252)*smartmean(dailyretMinustcost, 1)/smartstd(dailyretMinustcost, 1)
%
% % switch to use open prices
%
ret=(op-backshift(1, cl))./backshift(1, cl); % daily returns
marketRet=smartmean(ret, 2); % equal weighted market index return
weights=-(ret-repmat(marketRet, [1 size(ret, 2)])); % weight of a stock is proportional to the negative distance to the market index.
weights=weights./repmat(smartsum(abs(weights), 2), [1 size(weights, 2)]);
dailyret=smartsum(weights.*(cl-op)./op, 2)./smartsum(abs(weights), 2);
dailyret(isnan(dailyret))=0;
plot(cumprod(1+dailyret)-1); % Cumulative compounded return
fprintf(1, 'APR=%f Sharpe=%f\n', prod(1+dailyret).^(252/length(dailyret))-1, sqrt(252)*mean(dailyret)/std(dailyret));
% APR=0.731553 Sharpe=4.713284
% annavgret=252*smartmean(dailyret, 1)*100
%
% sharpe=sqrt(252)*smartmean(dailyret, 1)/smartstd(dailyret,1) % Sharpe ratio should be about 0.25
%
% % daily pnl with transaction costs deducted
% onewaytcost=0.0005; % assume 5 basis points
%
% dailyretMinustcost=dailyret - ...
% smartsum(abs(weights./cl-backshift(1, weights)./backshift(1, cl)).*backshift(1, cl), 2).*onewaytcost./smartsum(abs(weights), 2); % transaction costs are only incurred when the weights change
%
% annavgretMinustcost=252*smartmean(dailyretMinustcost, 1)*100
%
% sharpeMinustcost=sqrt(252)*smartmean(dailyretMinustcost, 1)/smartstd(dailyretMinustcost, 1)
%
% % kelly optimal leverage
%
% f=smartmean(dailyretMinustcost, 1)/smartstd(dailyretMinustcost, 1)^2