| Overall Statistics |
|
Total Trades 8 Average Win 0% Average Loss 0% Compounding Annual Return 119.014% Drawdown 8.900% Expectancy 0 Net Profit 5.753% Sharpe Ratio 0.446 Probabilistic Sharpe Ratio 42.733% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.263 Beta 1.925 Annual Standard Deviation 0.507 Annual Variance 0.257 Information Ratio 0.508 Tracking Error 0.483 Treynor Ratio 0.118 Total Fees $8.00 Estimated Strategy Capacity $9000000.00 Lowest Capacity Asset SSYS R735QTJ8XC9X |
import pandas as pd
from datetime import datetime
class SectorMomentumAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 11, 1)
#self.SetEndDate(datetime.now())
self.SetCash(10000)
self.Settings.FreePortfolioValuePercentage = 0.01
self.data = {}
# self.trailing_stop = self.GetParameter("trailing-stop")
# self.trailing_stop = float(self.trailing_stop) if self.trailing_stop else 0.10
# self.AddRiskManagement(TrailingStopRiskManagementModel(self.trailing_stop))
period = 3*21
self.symbols = ["SOFI", "PLUG", "NIO", "MJ", "ASAN", "FVRR" "UPWK", "LTRX", "MTTR", "SEMR", "FUBO", "QRHC", "RBLX", "SSYS", "SYK", "LCID", "TWLO", "RIOT", "OCGN", "NVDA"]
#self.symbols = ["AMZN", "AAPL", "TSLA", "GOOGL", "FB", "NVDA" "PYPL", "ADBE", "MSFT", "CSCO", "AVGO"]
#self.symbols = ["GIGE", "ARKF", "CIBR", "MJ", "WCLD", "HAIL", "IDNA", "ICLN"]
self.vix_price = self.GetParameter("vix-price")
self.vix_price = float(self.vix_price) if self.vix_price else 30
self.vix = self.AddIndex("VIX", Resolution.Minute).Symbol
self.SPY = self.AddEquity("SPY", Resolution.Minute).Symbol
# warm up the MOM indicator
self.SetWarmUp(period)
for symbol in self.symbols:
self.AddEquity(symbol, Resolution.Daily)
self.data[symbol] = self.MOM(symbol, period, Resolution.Daily)
# shcedule the function to fire at the month start
self.Schedule.On(self.DateRules.MonthStart("SPY"), self.TimeRules.AfterMarketOpen("SPY"), self.Rebalance)
self.allowTrades = True
def OnData(self, data):
self.Log(". VIX: " + str(self.Securities[self.vix].Price))
if self.Securities[self.vix].Price > self.vix_price:
self.Liquidate()
self.Log("ONDATA VIX CHECK FAILED LIQUIDATING")
self.allowTrades = False
if self.Securities[self.vix].Price < self.vix_price:
self.allowTrades = True
def Rebalance(self):
if self.IsWarmingUp: return
top3 = pd.Series(self.data).sort_values(ascending = False)[:8]
for kvp in self.Portfolio:
security_hold = kvp.Value
# liquidate the security which is no longer in the top3 momentum list
if security_hold.Invested and (security_hold.Symbol.Value not in top3.index):
self.Liquidate(security_hold.Symbol)
for symbol in top3.index:
if self.allowTrades == False: return
self.SetHoldings(symbol, 1/len(top3))