Overall Statistics
Total Orders
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Start Equity
100000
End Equity
100000
Net Profit
0%
Sharpe Ratio
0
Sortino Ratio
0
Probabilistic Sharpe Ratio
0%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0
Beta
0
Annual Standard Deviation
0
Annual Variance
0
Information Ratio
-0.906
Tracking Error
0.21
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
Portfolio Turnover
0%
Drawdown Recovery
0
# region imports
from AlgorithmImports import *
# endregion

class WellDressedSkyBlueChimpanzee(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2019, 1, 1)
        self.set_end_date(2021, 1, 1)
        self.set_cash(100000)

        self.rebalance_time = datetime.min  # since we want the bot to start trading immediately
        self.active_stocks = set()

        self.add_universe(self.CoarseFilter, self.FineFilter)
        self.universe_settings.resolution = Resolution.HOUR

        self.portfolio_targets = []
    
    def CoarseFilter(self, coarse):
        if self.time <= self.rebalance_time:
            return self.universe.unchanged
        
        self.rebalance_time = self.time + timedelta(30)
        sorted_by_dollar_volume = sorted(coarse, key=lambda x: x.dollar_volume, reverse=True)
        
        return [x.symbol for x in sorted_by_dollar_volume if x.price > 10 and x.has_fundamental_data][:200]
        # Note that the choice of 200 securities is quite arbitrary ^


    def FineFilter(self, fine):
        sorted_by_PE = sorted(fine, key=lambda x: x.market_cap)
        
        return [x.symbol for x in sorted_by_PE if x.market_cap > 0][:10]

    def on_securities_changed(self, changes):
        for x in changes.removed_securities:
            self.liquidate(x.symbol)
            self.active_stocks.remove(x.symbol)
        
        for x in changes.added_securities:
            self.active_stocks.add(x.symbol)
        
        self.portfolio_targets = [PortfolioTarget(symbol, 1 / len(self.active_stocks))
                                  for symbol in self.active_stocks]

    def on_data(self, data: Slice):
        if not self.portfolio_targets:
            return
        
        for symbol in self.active_stocks:
            if symbol in self.active_stocks:
                return
        
        self.set_holdings(self.portfolio_targets)
        self.portfolio_targets = []