Overall Statistics
Total Orders
14
Average Win
0.24%
Average Loss
-0.71%
Compounding Annual Return
-3.537%
Drawdown
5.900%
Expectancy
-0.239
Start Equity
100000
End Equity
98806.43
Net Profit
-1.194%
Sharpe Ratio
-0.929
Sortino Ratio
-0.882
Probabilistic Sharpe Ratio
18.921%
Loss Rate
43%
Win Rate
57%
Profit-Loss Ratio
0.33
Alpha
-0.105
Beta
0.575
Annual Standard Deviation
0.082
Annual Variance
0.007
Information Ratio
-1.78
Tracking Error
0.071
Treynor Ratio
-0.133
Total Fees
$14.00
Estimated Strategy Capacity
$71000000.00
Lowest Capacity Asset
IWM RV0PWMLXVHPH
Portfolio Turnover
3.78%
Drawdown Recovery
38
# region imports
from AlgorithmImports import *
# endregion

class EquitiesStaticTemplateAlgorithm(QCAlgorithm):
    _tolerance = 0.0025

    def initialize(self) -> None:
        self.set_start_date(2024, 9, 1)
        self.set_end_date(2024, 12, 31)
        self.set_cash(100000)
        # automatic_indicator_warm_up only supports automatic indicators, not manual indicators.
        self.settings.automatic_indicator_warm_up = True
        for ticker in ["SPY", "QQQ", "IWM"]:
            equity = self.add_equity(ticker)
            equity.macd = self.macd(equity, 12, 26, 9, MovingAverageType.EXPONENTIAL, Resolution.DAILY)
            # Alternatively, use a manual indicator.
            # equity.macd = MovingAverageConvergenceDivergence(12, 26, 9, MovingAverageType.EXPONENTIAL)
            # self.warm_up_indicator(equity, equity.macd, Resolution.DAILY)
            # self.register_indicator(equity, equity.macd, Resolution.DAILY)
            self.plot_indicator(ticker, equity.macd)
        self.schedule.on(self.date_rules.every_day('SPY'), self.time_rules.after_market_open('SPY', 1), self._rebalance)

    def _rebalance(self) -> None:
        for security in self.securities.values():
            quantity = security.holdings.quantity
            macd = security.macd
            signal_delta_percent = (macd.current.value - macd.signal.current.value)/macd.fast.current.value
            if quantity <= 0 and signal_delta_percent > self._tolerance:
                self.set_holdings(security, 1 / len(self.securities))
            if quantity >= 0 and signal_delta_percent < -self._tolerance:
                self.liquidate(security)