Overall Statistics
Total Orders
451
Average Win
1.25%
Average Loss
-0.64%
Compounding Annual Return
201.593%
Drawdown
31.600%
Expectancy
0.546
Start Equity
100000
End Equity
173379.93
Net Profit
73.380%
Sharpe Ratio
2.321
Sortino Ratio
3.468
Probabilistic Sharpe Ratio
63.329%
Loss Rate
48%
Win Rate
52%
Profit-Loss Ratio
1.95
Alpha
2.1
Beta
-1.286
Annual Standard Deviation
0.776
Annual Variance
0.602
Information Ratio
1.949
Tracking Error
0.804
Treynor Ratio
-1.399
Total Fees
$722.29
Estimated Strategy Capacity
$40000000.00
Lowest Capacity Asset
MEDS XC03HZ3KX3L1
Portfolio Turnover
24.59%
from AlgorithmImports import *
from QuantConnect.DataSource import *

class MorningStarDataAlgorithm(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2021, 1, 1)
        self.set_end_date(2021, 7, 1)
        self.set_cash(100000) 
        
        # Requesting data
        self.universe_settings.resolution = Resolution.DAILY
        self.universe_size = 10
        self.add_universe(self.fundamental_selection_function)
        
        
    def fundamental_selection_function(self, fundamental: List[Fundamental]) -> List[Symbol]:
        selected = [f for f in fundamental if f.has_fundamental_data and f.price > 1 and not np.isnan(f.valuation_ratios.pe_ratio)]
        sorted_by_dollar_volume = sorted(selected, key=lambda f: f.dollar_volume, reverse=True)[:100]

        sorted_by_pe_ratio = sorted(sorted_by_dollar_volume, key=lambda f: f.valuation_ratios.pe_ratio, reverse=True)[:self.universe_size]
        return [ f.symbol for f in sorted_by_pe_ratio ]
        

    def on_data(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.removed_securities:
            if security.invested:
                self.liquidate(security.symbol)

        # we want 1/N allocation in each security in our universe
        for security in self._changes.added_securities:
            self.set_holdings(security.symbol, 1 / self.universe_size)

        self._changes = None
           
           
    def on_securities_changed(self, changes: SecurityChanges) -> None:
        self._changes = changes
        
        for security in changes.added_securities:
            # Historical data
            history = self.history(security.symbol, 7, Resolution.DAILY)
            self.debug(f"We got {len(history)} from our history request for {security.symbol}")