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
Tracking Error
0
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
Portfolio Turnover
0%
# region imports
from AlgorithmImports import *
# endregion

class UglyBlackDog(QCAlgorithm):
    def initialize(self):
        self.spy = self.add_equity("SPY", Resolution.DAILY).symbol

        #1 Warming up indicators with history data
        self.sma = self.SMA(self.spy, 30, Resolution.DAILY)
        history = self.History(self.spy, 30, Resolution.DAILY)
        if self.spy in history.index:
            closing_prices = history.loc[self.spy]["close"]
            for time, price in closing_prices.iteritems():
                self.sma.update(time, price)
        else:
            self.Debug(f"No historical data available for {self.spy}")


        #2 Making sure your algorithm deploys immediately
        self.rebalance_period = 30  # Rebalance monthly
        self.next_rebalance = self.Time + timedelta(days = self.rebalance_period) # This will start your algorithm a month after deployment
        self.next_rebalance = self.Time # This will start your algorithm immediately


        #3 Use dummy algorithms to your advantage
        self.bnd = self.add_equity("BND", Resolution.DAILY).symbol


        #4 Expand the universe or lower the trading criteria
        self.tickers = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'NVDA', 'META', 'TSLA', 'JNJ', 'JPM', 'V'] 
        self.symbols = [] 
        for ticker in self.tickers:
            self.symbols.append(self.AddEquity(ticker, Resolution.Daily).Symbol) # This is a tiny, manual universe
        
        self.add_universe_selection(EmaCrossUniverseSelectionModel()) # This is a larger, dynamic universe
        self.add_universe_selection(FundamentalUniverseSelectionModel()) 


    def on_data(self, data: Slice):
        #2 Rebalance Monthly
        if self.Time < self.next_rebalance:
            return
        # Rebalance the portfolio
        # Update the next rebalance time
        self.next_rebalance = self.Time + timedelta(days = self.rebalance_period)


        #3 Invest the cash while you are finalizing your algorithm 
        # Deploy a dummy algorithm and then update it once you are finalized
        self.set_holdings(self.bnd, 1)


        #4 Some very specific trading requirement will leave your algorithm idle for a large portion of the competition
        for symbol in self.symbols: 
            pass