Overall Statistics |
Total Trades 8500 Average Win 0.14% Average Loss -0.11% Compounding Annual Return -9.324% Drawdown 43.200% Expectancy -0.080 Net Profit -38.734% Sharpe Ratio -0.41 Probabilistic Sharpe Ratio 0.021% Loss Rate 59% Win Rate 41% Profit-Loss Ratio 1.23 Alpha -0.067 Beta 0.008 Annual Standard Deviation 0.16 Annual Variance 0.026 Information Ratio -0.966 Tracking Error 0.232 Treynor Ratio -7.911 Total Fees $10062.66 Estimated Strategy Capacity $18000.00 Lowest Capacity Asset NRP SIRDXS4GAD0L |
forLong = [] forShort = [] class FundStrat(QCAlgorithm): def Initialize(self): self.SetStartDate(2016, 6, 14) self.SetEndDate(2021, 6, 14) self.SetCash(100000) self.SetBenchmark("SPY") self.SetBrokerageModel(BrokerageName.AlphaStreams) self.SetExecution(ImmediateExecutionModel()) self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) self.UniverseSettings.Resolution = Resolution.Daily self.AddUniverseSelection( FineFundamentalUniverseSelectionModel(self.SelectCoarse, self.SelectFine)) self.AddAlpha(MyAlphaModel()) self.num_fine = 5 def SelectCoarse(self, coarse): hasFundamentalData = [c for c in coarse if c.HasFundamentalData] filteredByPrice = [c.Symbol for c in hasFundamentalData if c.Price > 10] return filteredByPrice def SelectFine(self, fine): filter_sector = [f for f in fine if f.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.Energy] sortedByFactor = sorted(filter_sector, key=lambda f: f.ValuationRatios.CashReturn, reverse=True) self.forLong = [f.Symbol for f in sortedByFactor[:self.num_fine]] self.forShort = [f.Symbol for f in sortedByFactor[-self.num_fine:]] return self.forShort + self.forLong class SymbolData: def __init__(self,security): self.symbol = security.Symbol self.factor = security.Fundamentals.ValuationRatios.CashReturn class MyAlphaModel: def __init__(self): self.dataBySymbol = {} def Update(self, algorithm, slice): insights = [] for symbol in self.forLong: if symbol in slice.Bars: insights.append(Insight.Price(symbol, timedelta(1), InsightDirection.Up)) for symbol in self.forShort: if symbol in slice.Bars: insights.append(Insight.Price(symbol, timedelta(1), InsightDirection.Down)) return insights def OnSecuritiesChanged(self, algorithm, changes): self.changes = changes self.forLong = [] self.forShort = [] for security in self.changes.RemovedSecurities: if security.Symbol in self.dataBySymbol: self.dataBySymbol.pop(security.Symbol) algorithm.Debug(str(len(self.changes.RemovedSecurities)+len(self.changes.AddedSecurities))) for security in self.changes.AddedSecurities: if security.Symbol not in self.dataBySymbol: self.dataBySymbol[security.Symbol] = SymbolData(security) selected = list(self.dataBySymbol.values()) sortedByFactor = sorted(selected,key = lambda x : x.factor) self.forLong = [x.symbol for x in sortedByFactor[:5]] self.forShort = [x.symbol for x in sortedByFactor[-5:]]