Overall Statistics |
Total Trades 0 Average Win 0% Average Loss 0% Compounding Annual Return 0% Drawdown 0% Expectancy 0 Net Profit 0% Sharpe Ratio 0 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0 Beta 0 Annual Standard Deviation 0 Annual Variance 0 Information Ratio 0 Tracking Error 0 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
#region imports from AlgorithmImports import * #endregion class VerticalNadionShield(QCAlgorithm): def Initialize(self): self.SetStartDate(2019, 1, 1) # Set Start Date self.SetCash(100000) # Set Strategy Cash self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin) self.leverage = 1 self.AddRiskManagement(MaximumDrawdownPercentPerSecurity(0.025)) self.equities = ["GBTC", "ETHE"] self.equityCombinedMomentum = {} self.bonds = ["SHY", "SHY"] self.bondCombinedMomentum = {} for equity in self.equities: self.AddEquity(equity, Resolution.Hour) self.Securities[equity].SetDataNormalizationMode(DataNormalizationMode.TotalReturn) self.equityCombinedMomentum[equity] = CombinedMomentum(self, equity) for bond in self.bonds: self.AddEquity(bond, Resolution.Hour) self.Securities[bond].SetDataNormalizationMode(DataNormalizationMode.TotalReturn) self.bondCombinedMomentum[bond] = CombinedMomentum(self, bond) self.SetWarmUp(125) def shiftAssets(self, target): if not (self.Portfolio[target].Invested): for symbol in self.Portfolio.Keys: self.Liquidate(symbol) if not self.Portfolio.Invested: self.MarketOrder(target, self.CalculateOrderQuantity(target, 1 * self.leverage)) def getMonthLastTradingDay(self): month_last_day = DateTime(self.Time.year, self.Time.month, DateTime.DaysInMonth(self.Time.year, self.Time.month)) tradingDays = self.TradingCalendar.GetDaysByType(TradingDayType.BusinessDay, DateTime(self.Time.year, self.Time.month, 1), month_last_day) tradingDays = [day.Date.date() for day in tradingDays] return tradingDays[-1] def OnData(self, data): if self.IsWarmingUp: return self.Schedule.On(self.DateRules.WeekEnd('GBTC'), self.TimeRules.BeforeMarketClose('GBTC', 5), Action(self.Rebalance)) def Rebalance(self): topEquities = sorted(self.equityCombinedMomentum.items(), key=lambda x: x[1].getValue(), reverse=True) topBonds = sorted(self.bondCombinedMomentum.items(), key=lambda x: x[1].getValue(), reverse=True) if (topEquities[0][1].getValue() > 0): self.shiftAssets(topEquities[0][0]) else: self.Liquidate() #self.shiftAssets(topBonds[0][0]) class CombinedMomentum(): def __init__(self, algo, symbol): self.fst = algo.MOMP(symbol, 30, Resolution.Daily) #self.med = algo.MOMP(symbol, 90, Resolution.Daily) #self.slw = algo.MOMP(symbol, 180, Resolution.Daily) def getValue(self): #value = (self.fst.Current.Value + self.med.Current.Value + self.slw.Current.Value) / 3 value = (self.fst.Current.Value) return value