Overall Statistics
Total Orders
267
Average Win
1.59%
Average Loss
-0.36%
Compounding Annual Return
19.585%
Drawdown
6.500%
Expectancy
3.108
Start Equity
100000
End Equity
427695.33
Net Profit
327.695%
Sharpe Ratio
0.848
Sortino Ratio
1.816
Probabilistic Sharpe Ratio
54.546%
Loss Rate
24%
Win Rate
76%
Profit-Loss Ratio
4.38
Alpha
0.117
Beta
-0.099
Annual Standard Deviation
0.129
Annual Variance
0.017
Information Ratio
0.142
Tracking Error
0.218
Treynor Ratio
-1.1
Total Fees
$0.00
Estimated Strategy Capacity
$690000.00
Lowest Capacity Asset
BIL TT1EBZ21QWKL
Portfolio Turnover
2.88%
Drawdown Recovery
242
# region imports
from AlgorithmImports import *
# endregion

class QuantLeague(QCAlgorithm):
    def initialize(self):
        self.set_start_date(2018, 1, 1)
        self.set_cash(100000)

        tqqq = self.add_equity("TQQQ", Resolution.MINUTE)
        tqqq.SetDataNormalizationMode(DataNormalizationMode.Raw)
        self.tqqq = tqqq.Symbol

        self.uvxy = self.add_equity("UVXY", Resolution.MINUTE)
        self.bil = self.add_equity("BIL", Resolution.MINUTE)

        self.uvxy.set_fee_model(ConstantFeeModel(0))
        self.bil.set_fee_model(ConstantFeeModel(0))

        self.rsi3 = RelativeStrengthIndex(3)
        self.rsi4 = RelativeStrengthIndex(4)
        self.rsi5 = RelativeStrengthIndex(5)
        self.rsi6 = RelativeStrengthIndex(6)
        self.rsi7 = RelativeStrengthIndex(7)
        self.rsi8 = RelativeStrengthIndex(8)
        self.rsi9 = RelativeStrengthIndex(9)
        self.rsi10 = RelativeStrengthIndex(10)

        self.set_warmup(20 * 60 * 24)

    def on_data(self, slice):
        if self.time.hour == 15 and self.time.minute == 40:
            if slice.bars.contains_key(self.tqqq):
                bar = slice.bars[self.tqqq]
                self.rsi3.update(bar.end_time, bar.close)
                self.rsi4.update(bar.end_time, bar.close)
                self.rsi5.update(bar.end_time, bar.close)
                self.rsi6.update(bar.end_time, bar.close)
                self.rsi7.update(bar.end_time, bar.close)
                self.rsi8.update(bar.end_time, bar.close)
                self.rsi9.update(bar.end_time, bar.close)
                self.rsi10.update(bar.end_time, bar.close)

            if not self.rsi10.is_ready:
                return
            
            if self.is_warming_up:
                return

            uvxyCount = 0
            bilCount = 0

            if self.rsi3.current.value > 95:
                uvxyCount += 1
            else: 
                bilCount += 1

            if self.rsi4.current.value > 93:
                uvxyCount += 1
            else: 
                bilCount += 1

            if self.rsi5.current.value > 90:
                uvxyCount += 1
            else: 
                bilCount += 1

            if self.rsi6.current.value > 88:
                uvxyCount += 1
            else: 
                bilCount += 1

            if self.rsi7.current.value > 86:
                uvxyCount += 1
            else: 
                bilCount += 1

            if self.rsi8.current.value > 83:
                uvxyCount += 1
            else: 
                bilCount += 1

            if self.rsi9.current.value > 79:
                uvxyCount += 1
            else: 
                bilCount += 1

            if self.rsi10.current.value > 76:
                uvxyCount += 1
            else: 
                bilCount += 1

            bilWeigth = bilCount / (bilCount + uvxyCount)
            uvxyWeigth = uvxyCount / (bilCount + uvxyCount)

            self.set_holdings([PortfolioTarget("UVXY", uvxyWeigth), PortfolioTarget("BIL", bilWeigth)])
    #        self.debug(str(self.time.date()) + ": UVXY=" + str(uvxyWeigth) + ", BIL=" + str(bilWeigth))