Overall Statistics
Total Trades
87
Average Win
2.11%
Average Loss
-2.68%
Compounding Annual Return
-22.050%
Drawdown
40.000%
Expectancy
-0.149
Net Profit
-11.678%
Sharpe Ratio
0.038
Probabilistic Sharpe Ratio
20.722%
Loss Rate
52%
Win Rate
48%
Profit-Loss Ratio
0.79
Alpha
-0.213
Beta
1.01
Annual Standard Deviation
0.645
Annual Variance
0.416
Information Ratio
-0.332
Tracking Error
0.635
Treynor Ratio
0.024
Total Fees
$160.12
Estimated Strategy Capacity
$85000000.00
Lowest Capacity Asset
TSLA UNU3P8Y3WFAD
from AlgorithmImports import *

class USCoarseUniverseConstituentsDataAlgorithm(QCAlgorithm):

    _number_of_symbols = 3
    _changes = None

    def Initialize(self):
        self.SetStartDate(2021, 1, 1)
        self.SetEndDate(2021, 7, 1)
        self.SetCash(100000)
        
        # Requesting data
        self.AddUniverse(self.CoarseSelectionFunction)

    def CoarseSelectionFunction(self, coarse):
        sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
        return [ x.Symbol for x in sortedByDollarVolume[:self._number_of_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._number_of_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}")