Overall Statistics |
Total Trades 902 Average Win 0.04% Average Loss -0.01% Compounding Annual Return 9.812% Drawdown 3.700% Expectancy 0.713 Net Profit 1.577% Sharpe Ratio 0.731 Probabilistic Sharpe Ratio 44.323% Loss Rate 72% Win Rate 28% Profit-Loss Ratio 5.09 Alpha 0.109 Beta -0.412 Annual Standard Deviation 0.081 Annual Variance 0.006 Information Ratio -0.5 Tracking Error 0.123 Treynor Ratio -0.143 Total Fees $934.31 Estimated Strategy Capacity $6000000.00 Lowest Capacity Asset TTD WE3561IA1KKL |
from datetime import timedelta from QuantConnect.Data.UniverseSelection import * from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel class LiquidValueStocks(QCAlgorithm): def Initialize(self): self.SetStartDate(2017, 5, 15) self.SetEndDate(2017, 7, 15) self.SetCash(100000) self.UniverseSettings.Resolution = Resolution.Hour self.AddUniverseSelection(LiquidValueUniverseSelectionModel()) #1. Create and instance of the LongShortEYAlphaModel self.AddAlpha(LongShortEYAlphaModel()) self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel()) self.SetExecution(ImmediateExecutionModel()) class LiquidValueUniverseSelectionModel(FundamentalUniverseSelectionModel): def __init__(self): super().__init__(True, None) self.lastMonth = -1 def SelectCoarse(self, algorithm, coarse): if self.lastMonth == algorithm.Time.month: return Universe.Unchanged self.lastMonth = algorithm.Time.month sortedByDollarVolume = sorted([x for x in coarse if x.HasFundamentalData], key=lambda x: x.DollarVolume, reverse=True) return [x.Symbol for x in sortedByDollarVolume[:100]] def SelectFine(self, algorithm, fine): sortedByYields = sorted(fine, key=lambda f: f.ValuationRatios.EarningYield, reverse=True) universe = sortedByYields[:10] + sortedByYields[-10:] return [f.Symbol for f in universe] # Define the LongShortAlphaModel class class LongShortEYAlphaModel(AlphaModel): def __init__(self): self.lastMonth = -1 def Update(self, algorithm, data): insights = [] #2. If else statement to emit signals once a month if self.lastMonth == algorithm.Time.month: return insights self.lastMonth = algorithm.Time.month #3. For loop to emit insights with insight directions # based on whether earnings yield is greater or less than zero once a month for security in algorithm.ActiveSecurities.Values: direction = 1 if security.Fundamentals.ValuationRatios.EarningYield > 0 else -1 insights.append(Insight.Price(security.Symbol, timedelta(28), direction)) return insights