Overall Statistics
Total Trades
810
Average Win
0.36%
Average Loss
-0.36%
Compounding Annual Return
-8.205%
Drawdown
20.000%
Expectancy
-0.018
Net Profit
-4.178%
Sharpe Ratio
-0.048
Probabilistic Sharpe Ratio
19.036%
Loss Rate
51%
Win Rate
49%
Profit-Loss Ratio
0.99
Alpha
-0.206
Beta
0.822
Annual Standard Deviation
0.311
Annual Variance
0.097
Information Ratio
-0.832
Tracking Error
0.298
Treynor Ratio
-0.018
Total Fees
$1299.13
Estimated Strategy Capacity
$52000000.00
Lowest Capacity Asset
AEMD W25U9A0OOMLH
Portfolio Turnover
44.02%
from AlgorithmImports import *

class MorningStarDataAlgorithm(QCAlgorithm):

    def Initialize(self) -> None:
        self.SetStartDate(2021, 1, 1)
        self.SetEndDate(2021, 7, 1)
        self.SetCash(100000) 
        
        # Requesting data
        self.AddUniverse(self.FundamentalSelectionFunction)
        self.num_coarse_symbols = 100
        self.num_fine_symbols = 10
        self.UniverseSettings.Resolution = Resolution.Daily
        
        
    def FundamentalSelectionFunction(self, fundamental: List[Fundamental]) -> List[Symbol]:
        selected = [f for f in fundamental if f.HasFundamentalData and f.Price > 1]
        sorted_by_dollar_volume = sorted(selected, key=lambda f: f.DollarVolume, reverse=True)[:self.num_coarse_symbols]

        sorted_by_pe_ratio = sorted(sorted_by_dollar_volume, key=lambda f: f.ValuationRatios.PERatio, reverse=False)[:self.num_fine_symbols]
        return [ f.Symbol for f in sorted_by_pe_ratio ]
        

    def OnData(self, slice: Slice) -> None:
        # 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: SecurityChanges) -> None:
        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}")