% simply press F5 to run.
%% this file demonstrates how the quantified candlestick by createCandleStick.m
% can be used to quantify the performance of 4 types of candlestick
% patterns by calculating the Sharpe ratio
% from 10 business days after the pattern is detected.
clear all;
%function candleStickEvaluation(SPData)
%load the input 'SPData'
load StockData StockData;
SPData = StockData;
%or use the Trading Data downloader created by Marcelo Perlin
%http://www.mathworks.com/matlabcentral/fileexchange/23569
%to create your own data sets with the same format of 'StockData'.
%initialize candle sticks
%(bullish)
Morningdoji.data = [0, 1, NaN, NaN, NaN, NaN;...
0, 1, NaN, NaN, NaN, NaN;...
0, 1, 1, 0, 1, 1;...
NaN, NaN, 0, 1, NaN, NaN;...
1, 0, 1, 0, 1, 1];
%(bearish)
Eveningdoji.data = [1, 0, NaN, NaN, NaN, NaN;...
1, 0, NaN, NaN, NaN, NaN;...
1, 0, 1, 0, 1, 1;...
NaN, NaN, 0, 1, NaN, NaN;...
0, 1, 1, 0, 1, 1];
%create hammer (bullish)
Hammer.data = [0, 1, NaN, NaN, NaN, NaN;...
0, 1, NaN, NaN, NaN, NaN;...
0, 1, NaN, NaN, NaN, NaN;...
1, 0 , 0, 1, 0 , 1];
%create haningman (bearish)
Hangingman.data = [ 1, 0, NaN, NaN, NaN, NaN;...
1, 0, NaN, NaN, NaN, NaN;...
1, 0, NaN, NaN, NaN, NaN;...
0, 1, 0, 1, 0 , 1];
%check size of data.
[daySize,indSize]=size(SPData.Close);
%% analyze candlesticks
% long/short for 10 days if pattern is detected.
sellDate = 10;
% for recording sharpeRatio for each pattern
sharpeRatioArrayHammer=NaN(size(SPData.Close));
sharpeRatioArrayHangingMan=NaN(size(SPData.Close));
sharpeRatioArrayMorningDoji=NaN(size(SPData.Close));
sharpeRatioArrayEveningDoji=NaN(size(SPData.Close));
%ind=1;
for ind = 1 : indSize
output=createCandleStick(SPData.Open(:,ind),SPData.Close(:,ind),SPData.High(:,ind),SPData.Low(:,ind));
%[daysize,candlesize]=size(output);
if daySize < 21,
return;
end
for i=5:daySize-sellDate-1,
% initialize signal
signal = 0; %if signal 1 = long, signal -1 = short.
signalHammer = 0;
signalHangingMan = 0;
signalMorningDoji = 0;
signalEveningDoji = 0;
% check is signal matches Hammer or Hanging Man.
candleStick=output(i-3:i,:);
if sum (candleStick(isnan(Hammer.data) == 0) == Hammer.data( isnan(Hammer.data) == 0)) == 12,
signalHammer = 1;
growth=[0,diff(SPData.Open(i+1:i+sellDate,ind)')];
growth = signalHammer*growth;
sharpeRatioArrayHammer(i,ind)=sqrt(252)*mean(growth)/std(growth);
elseif sum (candleStick(isnan(Hangingman.data) == 0) == Hangingman.data( isnan(Hangingman.data) == 0)) == 12,
signalHangingMan = -1;
growth=[0,diff(SPData.Open(i+1:i+sellDate,ind)')];
growth = signalHangingMan*growth;
sharpeRatioArrayHangingMan(i,ind)=sqrt(252)*mean(growth)/std(growth);
end
% check is signal matches MorningDoji or EveningDoji
candleStick1=output(i-4:i,:);
if sum (candleStick1(isnan(Morningdoji.data) == 0) == Morningdoji.data( isnan(Morningdoji.data) == 0)) == 18 &&...
SPData.Open(i-2,ind) > SPData.Close(i-1,ind) &&...
SPData.Close(i,ind) > SPData.Close(i-1,ind),
signalMorningDoji = 1;
% save sharpe ratio base on signal and next 10 days.
growth=[0,diff(SPData.Open(i+1:i+sellDate,ind)')];
growth=growth*signalMorningDoji;
sharpeRatioArrayMorningDoji(i,ind)=sqrt(252)*mean(growth)/std(growth);
elseif sum (candleStick1(isnan(Eveningdoji.data) == 0) == Eveningdoji.data( isnan(Eveningdoji.data) == 0)) == 18 &&...
SPData.Open(i-2,ind) < SPData.Close(i-1,ind) &&...
SPData.Close(i,ind) < SPData.Close(i-1,ind),
signalEveningDoji = -1;
% save sharpe ratio base on signal and next 10 days.
growth=[0,diff(SPData.Open(i+1:i+sellDate,ind)')];
growth=growth*signalEveningDoji;
sharpeRatioArrayEveningDoji(i,ind)=sqrt(252)*mean(growth)/std(growth);
end
end
end
shHammer=mean(sharpeRatioArrayHammer(isnan(sharpeRatioArrayHammer)==0));
shHangingMan = mean(sharpeRatioArrayHangingMan(isnan(sharpeRatioArrayHangingMan)==0));
shMorn=mean(sharpeRatioArrayMorningDoji(isnan(sharpeRatioArrayMorningDoji)==0));
shEven=mean(sharpeRatioArrayEveningDoji(isnan(sharpeRatioArrayEveningDoji)==0));
display(sprintf('performance base within %d days after detected signal',sellDate));
display(sprintf('Mean Sharpe ratio of morning doji: %1.3f (occurring rate: %1.5f)',shMorn,...
sum(sum(isnan(sharpeRatioArrayMorningDoji)==0))/(daySize*indSize)));
display(sprintf('Mean Sharpe ratio of evening doji: %1.3f (occurring rate: %1.5f)',shEven,...
sum(sum(isnan(sharpeRatioArrayEveningDoji)==0))/(daySize*indSize)));
display(sprintf('Mean Sharpe ratio of hammer: %1.3f (occurring rate: %1.5f)',shHammer,...
sum(sum(isnan(sharpeRatioArrayHammer)==0))/(daySize*indSize)));
display(sprintf('Mean Sharpe ratio of hangingman: %1.3f (occurring rate: %1.5f)',shHangingMan,...
sum(sum(isnan(sharpeRatioArrayHangingMan)==0))/(daySize*indSize)));
subplot(2,2,1);
hist(sharpeRatioArrayMorningDoji(isnan(sharpeRatioArrayMorningDoji)==0))
title('distribution of Morning Doji Sharpe ratio')
subplot(2,2,2);
hist(sharpeRatioArrayHammer(isnan(sharpeRatioArrayHammer)==0))
title('distribution of Hammer Sharpe ratio')
subplot(2,2,3);
hist(sharpeRatioArrayEveningDoji(isnan(sharpeRatioArrayEveningDoji)==0))
title('distribution of Evening Doji Sharpe ratio')
subplot(2,2,4);
hist(sharpeRatioArrayHangingMan(isnan(sharpeRatioArrayHangingMan)==0))
title('distribution of Hanging Man Sharpe ratio')