Overall Statistics
Total Orders
10540
Average Win
0.06%
Average Loss
-0.07%
Compounding Annual Return
-0.047%
Drawdown
7.100%
Expectancy
0.000
Start Equity
100000
End Equity
99539.49
Net Profit
-0.461%
Sharpe Ratio
-1.015
Sortino Ratio
-1.008
Probabilistic Sharpe Ratio
0.008%
Loss Rate
49%
Win Rate
51%
Profit-Loss Ratio
0.95
Alpha
-0.029
Beta
0.078
Annual Standard Deviation
0.023
Annual Variance
0.001
Information Ratio
-0.711
Tracking Error
0.138
Treynor Ratio
-0.302
Total Fees
$0.00
Estimated Strategy Capacity
$34000000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
Portfolio Turnover
96.21%
# region imports
from AlgorithmImports import *

import random
from statsmodels.tsa.regime_switching.markov_regression import MarkovRegression
# endregion


class FearAndGreedExampleAlgorithm(QCAlgorithm):

    def initialize(self) -> None:
        self.set_start_date(2015, 7, 12)
        self.set_end_date(2025, 4, 1)
        self.set_cash(100_000)
        # Set the random seed.
        random.seed(self.get_parameter('seed', 30))
        # Set the flag of whether or not to use the regime filter.
        self._filter = bool(self.get_parameter('filter', 0))  # True
        self._probability_of_trade = 0.01  # per minute
        # Add the SPY to trade.
        self._equity = self.add_equity('SPY')
        self._equity.set_fee_model(ConstantFeeModel(0)) # Remove fees.
        self._equity.rsi = self.rsi(self._equity.symbol, 14, resolution=Resolution.DAILY)
        self.warm_up_indicator(self._equity.symbol, self._equity.rsi)
        # Liquidate positions at market close.
        self.schedule.on(self.date_rules.every_day(self._equity.symbol), self.time_rules.before_market_close(self._equity.symbol, 1), self.liquidate)
    
    def on_data(self, data: Slice) -> None:
        if self._equity.symbol in data and self._equity.exchange.hours.is_open(self.time + timedelta(minutes=1), False):
            # Check if we should trade.
            trade = random.random() < self._probability_of_trade
            if not trade:
                return
            if self._filter and self._equity.rsi.current.value < 50: # If filter is on, only trade when RSI is low
                return
            self.market_order(self._equity.symbol, 100 if not self.portfolio.invested else -100)