Overall Statistics
Total Trades
493
Average Win
0.25%
Average Loss
-0.54%
Compounding Annual Return
-32.577%
Drawdown
70.500%
Expectancy
-0.781
Net Profit
-67.754%
Sharpe Ratio
-0.809
Probabilistic Sharpe Ratio
0.022%
Loss Rate
85%
Win Rate
15%
Profit-Loss Ratio
0.46
Alpha
-0.251
Beta
0.07
Annual Standard Deviation
0.3
Annual Variance
0.09
Information Ratio
-1.037
Tracking Error
0.358
Treynor Ratio
-3.486
Total Fees
$493.09
import numpy as np

class ResistanceHorizontalGearbox(QCAlgorithm):

    #tickers = ["CMB","NB","TRV"]
    PortFoliolioMean = -0.000621
    PortfolioStd = 0.011284
    PortfolioMeanPlusStd = PortFoliolioMean + PortfolioStd
    PortfolioMeanMinusStd = PortFoliolioMean - PortfolioStd
    closes_day_before = {}
    normal_portfolio_return_cum5 = []
    
    def Initialize(self):
        self.SetStartDate(2018, 1, 1)   # Set Start Date
        self.SetCash(10000)            # Set Strategy Cash
        self.AddEquity("CMB", Resolution.Daily)
        self.AddEquity("NB", Resolution.Daily)
        self.AddEquity("TRV", Resolution.Daily)


    def OnData(self, data):
        if len(self.closes_day_before) == 0:
            self.closes_day_before['CMB'] = data['CMB'].Close
            self.closes_day_before['NB'] = data['NB'].Close 
            self.closes_day_before['TRV'] = data['TRV'].Close
            return
        if not('CMB' in data and
            'NB' in data and
            'TRV' in data):
            return
        close1 = np.log(data['CMB'].Close) - np.log(self.closes_day_before['CMB'])        
        close2 = np.log(data['NB'].Close) - np.log(self.closes_day_before['NB'])
        close3 = np.log(data['TRV'].Close) - np.log(self.closes_day_before['TRV'])
        mean_portfolio_close = np.mean([close1, close2, close3])
        normal_portfolio_return = 0
        if mean_portfolio_close > self.PortfolioMeanPlusStd:
            normal_portfolio_return = mean_portfolio_close - self.PortfolioMeanPlusStd
        else:
            normal_portfolio_return = mean_portfolio_close - self.PortfolioMeanMinusStd
           
        if len(self.normal_portfolio_return_cum5) < 5:
            self.normal_portfolio_return_cum5.append(normal_portfolio_return)
            return
        else:
            self.normal_portfolio_return_cum5.pop(0)
            self.normal_portfolio_return_cum5.append(normal_portfolio_return)
            
        normal_portfolio_return_cum5_sum = sum(self.normal_portfolio_return_cum5)
        
        if normal_portfolio_return_cum5_sum > self.PortfolioMeanPlusStd:
            self.SetHoldings([PortfolioTarget("CMB", 0.33), 
                PortfolioTarget("NB", 0.33),
                PortfolioTarget("TRV", 0.33)]);
        elif normal_portfolio_return_cum5_sum < self.PortfolioMeanMinusStd:
            self.SetHoldings([PortfolioTarget("CMB", -0.33), 
                PortfolioTarget("NB", -0.33),
                PortfolioTarget("TRV", -0.33)]);
        else:
            self.Liquidate()