Code covered by the BSD License  

Highlights from
Candlestick Quantification

image thumbnail
from Candlestick Quantification by ted teng
Function to quantify candlesticks.

candleStickEvaluation.m
% 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')

Contact us