Overall Statistics
Total Trades
496
Average Win
0.50%
Average Loss
-0.46%
Compounding Annual Return
36.672%
Drawdown
55.200%
Expectancy
0.151
Net Profit
16.853%
Sharpe Ratio
1.023
Probabilistic Sharpe Ratio
40.845%
Loss Rate
44%
Win Rate
56%
Profit-Loss Ratio
1.07
Alpha
0.946
Beta
0.084
Annual Standard Deviation
0.948
Annual Variance
0.898
Information Ratio
0.721
Tracking Error
0.954
Treynor Ratio
11.537
Total Fees
$681.81
Estimated Strategy Capacity
$31000000.00
Lowest Capacity Asset
MEDS XC03HZ3KX3L1
from AlgorithmImports import *
class MorningStarDataAlgorithm(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2021, 1, 1)
        self.SetEndDate(2021, 7, 1)
        self.SetCash(100000) 
        
        # Requesting data
        self.AddUniverse(self.SelectCoarse, self.SelectFine)
        self.num_coarse_symbols = 100
        self.num_fine_symbols = 10
        self.UniverseSettings.Resolution = Resolution.Daily
        
        
    def SelectCoarse(self, coarse):
        selected = [c for c in coarse if c.HasFundamentalData]
        sorted_by_dollar_volume = sorted(selected, key=lambda c: c.DollarVolume, reverse=True)
        return [ c.Symbol for c in sorted_by_dollar_volume[:self.num_coarse_symbols] ]
        
        
    def SelectFine(self, fine):
        sorted_by_pe_ratio = sorted(fine, key=lambda f: f.ValuationRatios.PERatio, reverse=True)
        return [ f.Symbol for f in sorted_by_pe_ratio[:self.num_fine_symbols] ]
        

    def OnData(self, data):
        # if we have no changes, do nothing
        if self._changes is None: return

        # liquidate removed securities
        for security in self._changes.RemovedSecurities:
            if security.Invested:
                self.Liquidate(security.Symbol)

        # we want 1/N allocation in each security in our universe
        for security in self._changes.AddedSecurities:
            self.SetHoldings(security.Symbol, 1 / self.num_fine_symbols)

        self._changes = None
           
           
    def OnSecuritiesChanged(self, changes):
        self._changes = changes
        
        for security in changes.AddedSecurities:
            # Historical data
            history = self.History(security.Symbol, 7, Resolution.Daily)
            self.Debug(f"We got {len(history)} from our history request for {security.Symbol}")