Overall Statistics
Total Trades
7881
Average Win
0.45%
Average Loss
-0.51%
Compounding Annual Return
6.201%
Drawdown
33.700%
Expectancy
0.053
Net Profit
156.591%
Sharpe Ratio
0.468
Probabilistic Sharpe Ratio
0.588%
Loss Rate
44%
Win Rate
56%
Profit-Loss Ratio
0.88
Alpha
0.018
Beta
0.397
Annual Standard Deviation
0.102
Annual Variance
0.01
Information Ratio
-0.225
Tracking Error
0.127
Treynor Ratio
0.121
Total Fees
$0.00
Estimated Strategy Capacity
$280000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
'''Test Overnight Anomaly for a given security.'''

from AlgorithmImports import *


class Singleovernight(QCAlgorithm):
    def Initialize(self):
        self.debug = False
        self.zero_fee_model = True
        self.overnight = True # If false, Intraday
        self.ticker = "SPY"
        self.SetStartDate(2007, 1, 1)  # Set Start Date
        self.SetCash(100000)  # Set Strategy Cash
        security = self.AddEquity(self.ticker, Resolution.Minute)
        if self.zero_fee_model:
            security.SetFeeModel(ConstantFeeModel(0))
        if self.overnight:
            self.Schedule.On(self.DateRules.EveryDay(self.ticker), 
                            self.TimeRules.BeforeMarketClose(self.ticker, 1),
                            self.OpenPositions)
            self.Schedule.On(self.DateRules.EveryDay(self.ticker), 
                            self.TimeRules.BeforeMarketClose(self.ticker, 0),
                            self.ClosePositions)
        else:
            # Intraday
            self.Schedule.On(self.DateRules.EveryDay(self.ticker), 
                            self.TimeRules.BeforeMarketClose(self.ticker, 0),
                            self.OpenPositions)
            self.Schedule.On(self.DateRules.EveryDay(self.ticker), 
                            self.TimeRules.BeforeMarketClose(self.ticker, 1),
                            self.ClosePositions)


    def ClosePositions(self,):
        if self.Portfolio.Invested:
            self.SetHoldings(self.ticker, 0)
            if self.debug:
                self.Debug(f"{self.Time}: Sold {self.ticker}")

    def OpenPositions(self,):
        if not self.Portfolio.Invested:
            self.SetHoldings(self.ticker, 1)
            if self.debug:
                self.Debug(f"{self.Time}: Purchased {self.ticker}")

    def OnData(self, data):
        """OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
            Arguments:
                data: Slice object keyed by symbol containing the stock data
        """
        pass