Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
-0.364%
Drawdown
0.000%
Expectancy
0
Net Profit
-0.010%
Sharpe Ratio
-5.604
Probabilistic Sharpe Ratio
0.923%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
-0.002
Beta
-0.001
Annual Standard Deviation
0.001
Annual Variance
0
Information Ratio
-7.968
Tracking Error
0.131
Treynor Ratio
3.079
Total Fees
$1.00
# https://seekingalpha.com/article/4299701-leveraged-etfs-for-long-term-investing
# Momentum addaped verision of:
# https://www.quantconnect.com/forum/discussion/7708/using-levered-etfs-in-ira-10-years-24-cagr-1-56-sharpe/p1
# with some extra symbols.

import pandas as pd
import numpy as np

class MultidimensionalTransdimensionalPrism(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 7, 7)  # Set Start Date
        self.SetCash(10000)  # Set Strategy Cash
        self.SetEndDate(2020, 7, 16)
        
        # create a dictionary to store momentum indicators for all symbols 
        self.mom = {}
        self.rsi = {}
        self.momp = {}
        
        #MOM period
        period = 21*4
        #rsi period
        period2 = 10
        #MOMP period
        period3 = 44
        
        self.SetRiskManagement(TrailingStopRiskManagementModel(0.25))
        
        # warm up the MOM indicator
        self.SetWarmUp(period)
        self.symbols = []
        tickers = ["TQQQ", "UBT", "TECL","UGLD","TYD"]
        for ticker in tickers:
            symbol = self.AddEquity(ticker, Resolution.Hour).Symbol
            self.symbols.append(symbol)
            self.mom[symbol] = self.MOM(symbol, period, Resolution.Hour)
            self.rsi[symbol] = self.RSI(symbol, period2, Resolution.Daily)
            self.momp[symbol] = self.MOMP(symbol, period3, Resolution.Daily)

        self.Schedule.On(self.DateRules.Every(DayOfWeek.Wednesday), \
                 self.TimeRules.At(15, 30), \
                 self.Rebalance)
                
    def Rebalance(self):
        if self.IsWarmingUp: return
        
        alldata = pd.DataFrame({'momp':[self.mom[symbol].Current.Value for symbol in self.symbols],
                                'rsi': [self.rsi[symbol].Current.Value for symbol in self.symbols]})
        highest_rsi = alldata[alldata['rsi'] > 80]
        top3 = highest_rsi.sort_values(by='momp', ascending = False)[:3]
        top3_symbols = [self.symbols[i] for i in top3.index]
        
        for kvp in self.Portfolio:
            security_hold = kvp.Value
            if security_hold.Invested and (security_hold.Symbol not in top3_symbols):
                self.Liquidate(security_hold.Symbol)
        
        added_symbols = []        
        for symbol in top3_symbols:
            if not self.Portfolio[symbol].Invested:
                added_symbols.append(symbol)
        for added in added_symbols:
            self.SetHoldings(added, 1/len(added_symbols))