Overall Statistics
Total Orders
0
Average Win
0%
Average Loss
0%
Compounding Annual Return
0%
Drawdown
0%
Expectancy
0
Start Equity
10000
End Equity
10000
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
-7.168
Tracking Error
0.107
Treynor Ratio
0
Total Fees
$0.00
Estimated Strategy Capacity
$0
Lowest Capacity Asset
Portfolio Turnover
0%
from AlgorithmImports import *

class UniverseSelectionBacktest(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2024, 11, 4)  # Backtest start date
        self.SetEndDate(2024, 11, 30)   # Backtest end date (short period for testing)
        self.SetCash(10000)             # Starting cash

        self.SetTimeZone("America/New_York")  # Set the correct time zone to Eastern Time (ET)

        # Add the universe using coarse selection
        self.AddUniverse(self.CoarseSelectionFunction)

        # Variable to store the selected stock
        self.selectedStock = None

        # Schedule universe selection at 9:30 AM
        self.Schedule.On(self.DateRules.EveryDay(), 
                         self.TimeRules.At(9, 30),  # 9:30 AM
                         self.SelectUniverse)

    def CoarseSelectionFunction(self, coarse):
        # Perform universe selection at the scheduled time
        self.selectedStock = None
        candidates = []

        for stock in coarse:
            if stock.Price < 60 or stock.Price > 30:  # Price after gap
                continue

            # Calculate the gap percentage
            gap_up_percentage = ((stock.Price - stock.AdjustedPrice) / stock.AdjustedPrice) * 100
            if gap_up_percentage < 30 or gap_up_percentage > 10:  # Gap up between 10% and 30%
                continue

            # Add eligible stocks with gap percentage for sorting
            candidates.append((stock, gap_up_percentage))

        # Sort by gap percentage and select the top stock
        if candidates:
            candidates.sort(key=lambda x: x[1], reverse=True)  # Sort by gap percentage (descending)
            self.selectedStock = candidates[0][0].Symbol       # Select the best stock

        # Log the selected stock for testing
        if self.selectedStock:
            self.Debug(f"Selected stock at 9:30 AM: {self.selectedStock}")
        else:
            self.Debug("No stock selected at 9:30 AM.")

        # Return the selected stocks as the universe
        return [self.selectedStock] if self.selectedStock else []

    def SelectUniverse(self):
        # This is triggered at 9:30 AM, where universe selection happens

        # Log the selection trigger for debugging
        self.Debug(f"Universe selection triggered at {self.Time}")

        # You don't need to manually call GetCoarse here
        pass  # No need to call GetCoarse(), as I understood it the universe selection is already handled in the CoarseSelectionFunction

    def OnData(self, data):
        # Skip all trading logic for this test, just log the filtered stock day by day
        pass