| Overall Statistics |
|
Total Trades 396 Average Win 0.10% Average Loss -0.13% Compounding Annual Return -3.027% Drawdown 8.000% Expectancy -0.121 Net Profit -3.027% Sharpe Ratio -0.236 Probabilistic Sharpe Ratio 6.796% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 0.74 Alpha -0.095 Beta 0.39 Annual Standard Deviation 0.077 Annual Variance 0.006 Information Ratio -2.343 Tracking Error 0.092 Treynor Ratio -0.047 Total Fees $398.01 Estimated Strategy Capacity $25000000.00 Lowest Capacity Asset ROL R735QTJ8XC9X |
# region imports
from AlgorithmImports import *
from datetime import timedelta, datetime
from QuantConnect.Data.UniverseSelection import *
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel
from Execution.ImmediateExecutionModel import ImmediateExecutionModel
from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel
# endregion
class Third_Attempt(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2021, 1, 1) # Set Start Date
self.SetEndDate(2022, 1, 1) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.AddUniverseSelection(Highperformance())
self.UniverseSettings.Resolution = Resolution.Daily
self.AddAlpha(BuyPerformance())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel(lambda time: None))
self.SetExecution(ImmediateExecutionModel())
class Highperformance (FundamentalUniverseSelectionModel):
def __init__(self):
super().__init__( True, None)
self.lastMonth = -1
self.spy = Symbol.Create('SPY', SecurityType.Equity, Market.USA)
def SelectCoarse(self, algorithm, coarse):
#run the algorithm once a month, return Universe.Unchanged in case we are looking at exactly the same month
if algorithm.Time.month == self.lastMonth:
return Universe.Unchanged
self.lastMonth = algorithm.Time.month
sortedByVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
filteredByFundamentals = [x.Symbol for x in sortedByVolume if x.HasFundamentalData]
return filteredByFundamentals
def SelectFine(self, algorithm, fine):
sorted_high = sorted([x for x in fine if x.MarketCap > 2e9
and 0.5 > x.OperationRatios.AVG5YrsROIC.FiveYears > 0.20
and 50 > x.ValuationRatios.PERatio > 20
and x.AssetClassification.MorningstarSectorCode != MorningstarSectorCode.FinancialServices
and x.AssetClassification.MorningstarSectorCode != MorningstarSectorCode.Healthcare],
key = lambda x: x.ValuationRatios.PERatio, reverse=True)
fundamental_universe = [x.Symbol for x in sorted_high[:5]] + [self.spy]
algorithm.Debug('Universe Selection:')
algorithm.Debug(str(algorithm.Time))
algorithm.Debug('/n ')
for security in fundamental_universe:
algorithm.Debug(str(security))
#return [x.Symbol for x in sorted_high[:5]] + [self.spy]
return [x.Symbol for x in sorted_high[:5]]
class BuyPerformance(AlphaModel):
def __init__(self):
self.lastMonth = -1
self.newAdds = []
#removals to be removed
self.newRemovals = []
def Update(self, algorithm, data):
insights = []
for added in self.newAdds:
if not algorithm.Securities[added].Invested and algorithm.Securities[added].HasData:
insights.append(Insight(added, timedelta(30), InsightType.Price, InsightDirection.Up))
# to be removed at a later stage
for removed in self.newRemovals:
if removed not in data.Bars:
continue
insights.append(Insight(removed, timedelta(30), InsightType.Price, InsightDirection.Flat))
return insights
def OnSecuritiesChanged(self, algorithm, changes):
#When assets are added to the universe, they will trigger OnSecuritiesChanged() event.
#From there, you can initialize any state or history required for the Alpha Model
for security in changes.AddedSecurities:
#if security.Symbol != self.spy and security.Symbol not in self.newAdds:
if security.Symbol not in self.newAdds and security.IsTradable:
self.newAdds.append(security.Symbol)
for security in changes.RemovedSecurities:
#if security.Symbol != self.spy:
if security.IsTradable:
self.newRemovals.append(security.Symbol)