| 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))