Overall Statistics
Total Trades
102
Average Win
0.94%
Average Loss
-0.52%
Compounding Annual Return
61.225%
Drawdown
10.400%
Expectancy
1.069
Net Profit
61.225%
Sharpe Ratio
2.777
Probabilistic Sharpe Ratio
91.872%
Loss Rate
26%
Win Rate
74%
Profit-Loss Ratio
1.80
Alpha
0.55
Beta
-0.186
Annual Standard Deviation
0.181
Annual Variance
0.033
Information Ratio
1.099
Tracking Error
0.224
Treynor Ratio
-2.698
Total Fees
$133.38
from datetime import timedelta
from QuantConnect.Data.UniverseSelection import *
from Selection.FundamentalUniverseSelectionModel import FundamentalUniverseSelectionModel

class NadionUncoupledPrism(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2019, 1, 1)
        self.SetEndDate(2020,1 ,1)
        self.SetCash(100000)
        self.AddUniverseSelection(LiquidValueUniverseSelectionModel())
        self.UniverseSettings.Resolution = Resolution.Daily
    
    def OnSecuritiesChanged(self, changes):
    
        self.changes = changes
        
        for security in self.changes.RemovedSecurities:
            if security.Invested:
                self.Liquidate(security.Symbol)
                
        for security in self.changes.AddedSecurities:
            if not security.Invested:
                self.SetHoldings(security.Symbol, .10)

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)
        filteredByYields = [f for f in fine if f.ValuationRatios.EarningYield > 0]
        universe = filteredByYields[:10]
        return [f.Symbol for f in universe]