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.012 Tracking Error 0.169 Treynor Ratio 0 Total Fees $0.00 Estimated Strategy Capacity $0 Lowest Capacity Asset |
from AlgorithmImports import * from QuantConnect.DataSource import * from statistics import stdev import time # endregion class MeasuredTanTermite(QCAlgorithm): def Initialize(self): self.SetStartDate(2021, 6, 10) self.SetCash(100000) self.rebalanceTime = datetime.min self.AddUniverse(self.CoarseSelectionFilter, self.FineSelectionFilter) self.UniverseSettings.Resolution = Resolution.Daily #resolution of the securities in the universe, default is minute self.Data = {} self.ValueCheck= {} self.banned_tickers = {} self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol #initializes bond yeild data from FRED self.fred_peak_to_trough = self.AddData(Fred, Fred.ICEBofAML.USHighYieldMasterIIOptionAdjustedSpread, Resolution.Daily).Symbol self.nasdaqCode = "FRED/UNRATE" self.unrate = self.AddData(NasdaqDataLink, self.nasdaqCode, Resolution.Minute).Symbol def OnData(self, data): if data.ContainsKey(self.nasdaqCode): self.Plot("Unemployment Rate", "Value", self.Securities[self.nasdaqCode].Price) for symbol in self.Data.keys(): symbolData = self.Data[symbol] if not symbolData.IsReady: continue #self.Log("Symbol " + str(symbol)) #checks for availability of FRED data by using SPY trading days, plots spread if data.ContainsKey(self.fred_peak_to_trough) and data.ContainsKey(self.spy): peak_to_trough = data.Get(Fred, self.fred_peak_to_trough).Value self.Plot('FRED HY Spread', 'Bond Spread', peak_to_trough) # The CoarseFundamental class provides access to the following information that you can base your selection upon: self.Market, self.DollarVolume (for the day), self.Volume (for the day), self.HasFundamentalData, self.PriceFactor, self.SplitFactor, self.PriceScaleFactor, self.AdjustedPrice, self.EndTime. def CoarseSelectionFilter(self, coarse): #updates at midnight during backtesting, and around 6-7am in live trading, based on previous day data if self.Time <= self.rebalanceTime: #checks if it has been 1 day since rebalancing return self.Universe.Unchanged #if not do not change the universe self.rebalanceTime = self.Time + timedelta(35) #set rebalance time in days symbols_by_price = [c for c in coarse if c.HasFundamentalData and len(c.Symbol.Value) <= 4] self.filteredByPrice = symbols_by_price[:10] #for c in symbols_by_price[:30]: # self.Log(",Symbol," + str(c.Symbol.Value) + ",DollarVolume," + str(c.DollarVolume) + ",Price," + str(c.Price) + ",Volume," + str(c.Volume)) return [c.Symbol for c in self.filteredByPrice] def FineSelectionFilter(self, fine): sortedByMarketCap = sorted(fine, key=lambda c: c.MarketCap) symbols_by_marketcap = [c for c in sortedByMarketCap if c.MarketCap > 0 and c.CompanyReference.IsREIT is False] self.filteredBymarketcap = symbols_by_marketcap #return self.filteredBymarketcap return [c.Symbol for c in self.filteredBymarketcap] def OnSecuritiesChanged(self, changes): for security in changes.AddedSecurities: symbol = security.Symbol if symbol not in self.Data: self.Data[symbol] = SymbolData(self, symbol) for security in changes.RemovedSecurities: symbol = security.Symbol if symbol in self.Data: symbolData = self.Data.pop(symbol, None) self.SubscriptionManager.RemoveConsolidator(symbol, symbolData.consolidator) class SymbolData: def __init__(self, algorithm, symbol): self.algorithm = algorithm self.symbol = symbol self.Bars = RollingWindow[TradeBar](7) self.consolidator = TradeBarConsolidator(timedelta(days=1)) self.consolidator.DataConsolidated += self.OnDataConsolidated algorithm.SubscriptionManager.AddConsolidator(symbol, self.consolidator) def OnDataConsolidated(self, sender, bar): self.Bars.Add(bar) @property def IsReady(self): return self.Bars.IsReady class NasdaqCustomColumns(NasdaqDataLink): '''Custom nasdaq data type for setting customized value column name. Value column is used for the primary trading calculations and charting.''' def __init__(self): self.ValueColumnName = "Unrate"