| Overall Statistics |
|
Total Trades 1630 Average Win 0.32% Average Loss -0.36% Compounding Annual Return 3.700% Drawdown 17.300% Expectancy 0.057 Net Profit 19.575% Sharpe Ratio 0.342 Probabilistic Sharpe Ratio 5.236% Loss Rate 44% Win Rate 56% Profit-Loss Ratio 0.89 Alpha 0.037 Beta -0.011 Annual Standard Deviation 0.105 Annual Variance 0.011 Information Ratio -0.47 Tracking Error 0.176 Treynor Ratio -3.428 Total Fees $2069.83 Estimated Strategy Capacity $830000.00 |
from datetime import timedelta
from QuantConnect.Data.UniverseSelection import *
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel
class LiquidValueStocks(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2011, 1, 1)
self.SetEndDate(2015, 12, 1)
self.SetCash(100000)
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverseSelection(LiquidValueUniverseSelectionModel())
#1. Create and instance of the LongShortEYAlphaModel
self.AddAlpha(LongShortEYAlphaModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel(lambda time: None))
self.SetExecution(ImmediateExecutionModel())
#self.Settings.RebalancePortfolioOnInsightChanges = False
#self.Settings.RebalancePortfolioOnSecurityChanges = False
def OnData(self, data):
self.Plot("Positions", "Number of open positions", len(self.Portfolio))
class LiquidValueUniverseSelectionModel(FundamentalUniverseSelectionModel):
def __init__(self):
super().__init__(True, None, 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)
return [f.Symbol for f in sortedByYields[:10] + sortedByYields[-10:]]
# Define the LongShortAlphaModel class
class LongShortEYAlphaModel(AlphaModel):
def __init__(self):
self.lastMonth = None
self.symbols = []
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 symbol in self.symbols:
security = algorithm.Securities[symbol]
direction = 1 if security.Fundamentals.ValuationRatios.EarningYield > 0 else -1
insights.append(Insight.Price(symbol, Expiry.EndOfMonth(data.Time) - timedelta(seconds=1), direction))
return insights
def OnSecuritiesChanged(self, algorithm, changes):
for security in changes.AddedSecurities:
self.symbols.append(security.Symbol)
for security in changes.RemovedSecurities:
if security.Symbol in self.symbols:
self.symbols.remove(security.Symbol)