Overall Statistics
Total Orders
139
Average Win
10.49%
Average Loss
-8.19%
Compounding Annual Return
14.951%
Drawdown
52.000%
Expectancy
0.719
Start Equity
1000000
End Equity
36940752.91
Net Profit
3594.075%
Sharpe Ratio
0.51
Sortino Ratio
0.62
Probabilistic Sharpe Ratio
0.337%
Loss Rate
25%
Win Rate
75%
Profit-Loss Ratio
1.28
Alpha
0.05
Beta
1.024
Annual Standard Deviation
0.195
Annual Variance
0.038
Information Ratio
0.475
Tracking Error
0.107
Treynor Ratio
0.097
Total Fees
$247852.27
Estimated Strategy Capacity
$320000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
Portfolio Turnover
1.47%
# region imports
from AlgorithmImports import *
# endregion

class DeterminedOrangeArmadillo(QCAlgorithm):

    _black_fridays = [
        datetime(1998, 11, 27),
        datetime(1999, 11, 26),
        datetime(2000, 11, 24),
        datetime(2001, 11, 23),
        datetime(2002, 11, 29),
        datetime(2003, 11, 28),
        datetime(2004, 11, 26),
        datetime(2005, 11, 25),
        datetime(2006, 11, 24),
        datetime(2007, 11, 23),
        datetime(2008, 11, 28),
        datetime(2009, 11, 27),
        datetime(2010, 11, 26),
        datetime(2011, 11, 25),
        datetime(2012, 11, 23),
        datetime(2013, 11, 29),
        datetime(2014, 11, 28),
        datetime(2015, 11, 27),
        datetime(2016, 11, 25),
        datetime(2017, 11, 24),
        datetime(2018, 11, 23),
        datetime(2019, 11, 29),
        datetime(2020, 11, 27),
        datetime(2021, 11, 26),
        datetime(2022, 11, 25),
        datetime(2023, 11, 24),
    ]

    _prime_days = [
        datetime(2015, 7, 15),
        datetime(2016, 7, 12),
        datetime(2017, 7, 11),
        datetime(2018, 7, 17),
        datetime(2019, 7, 15),
        datetime(2020, 10, 13),
        datetime(2021, 7, 21),
        datetime(2022, 7, 12),
        datetime(2023, 7, 11),
    ]

    def initialize(self):
        self.set_start_date(1998, 11, 13)
        self.set_end_date(2024, 10, 1)
        self.set_cash(1_000_000)
        amzn = self.add_equity('AMZN')
        spy = self.add_equity('SPY')
        holding_period = self.get_parameter('holding_period', 14)
        for holidays in [self._black_fridays, self._prime_days]:
            for holiday in holidays:
                # Hold AMZN before the holiday.
                self.schedule.on(
                    self.date_rules.on(spy.exchange.hours.get_next_market_close(holiday - timedelta(holding_period), False)), 
                    self.time_rules.before_market_close(spy.symbol, 1), 
                    lambda: self.set_holdings([PortfolioTarget(amzn.symbol, 1)], True)
                )
                # Hold SPY after the holiday.
                self.schedule.on(
                    self.date_rules.on(spy.exchange.hours.get_next_market_close(holiday + timedelta(1), False)), 
                    self.time_rules.before_market_close(spy.symbol, 1), 
                    lambda: self.set_holdings([PortfolioTarget(spy.symbol, 1)], True)
                )