Overall Statistics
Total Orders
12
Average Win
0.97%
Average Loss
-1.43%
Compounding Annual Return
8.441%
Drawdown
4.500%
Expectancy
0.399
Start Equity
2000000
End Equity
2068935.06
Net Profit
3.447%
Sharpe Ratio
0.08
Sortino Ratio
0.049
Probabilistic Sharpe Ratio
52.362%
Loss Rate
17%
Win Rate
83%
Profit-Loss Ratio
0.68
Alpha
-0.05
Beta
0.293
Annual Standard Deviation
0.053
Annual Variance
0.003
Information Ratio
-2.255
Tracking Error
0.08
Treynor Ratio
0.015
Total Fees
$150.50
Estimated Strategy Capacity
$500000000.00
Lowest Capacity Asset
MSFT R735QTJ8XC9X
Portfolio Turnover
3.93%
from AlgorithmImports import *

class TrendReversalTradingAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2023, 12, 20)
        self.SetEndDate(2024, 5, 20)
        
        self.SetCash(2_000_000)
        
        self.symbol = self.AddEquity("MSFT", Resolution.Daily).Symbol # S2 = MSFT (Lowest Min Autocorrelation)
        
        self.sma = self.SMA(self.symbol, 20, Resolution.Daily)
        
        self.weight = 0.50  # 50% of portfolio

        self.max_daily_loss = 0
        self.max_loss_date = None
        self.previous_value = None  
        self.pnl_on_max_loss_day = {"realized": 0, "unrealized": 0}

    def OnData(self, data):
        if not self.sma.IsReady or self.symbol not in data or data[self.symbol] is None:  
            return 
        
        price = data[self.symbol].Close
        sma_value = self.sma.Current.Value

        if price < sma_value and not self.Portfolio[self.symbol].Invested:
            self.SetHoldings(self.symbol, self.weight) 
        elif price >= sma_value and self.Portfolio[self.symbol].Invested:
            self.Liquidate(self.symbol) 

    def OnEndOfDay(self):
        if self.previous_value is not None:
            daily_loss = (self.Portfolio.TotalPortfolioValue / self.previous_value) - 1

            if daily_loss < self.max_daily_loss:  # Track the worst loss day
                self.max_daily_loss = daily_loss
                self.max_loss_date = self.Time.date()
                self.pnl_on_max_loss_day["realized"] = self.Portfolio.TotalProfit  # Realized PnL
                self.pnl_on_max_loss_day["unrealized"] = (
                    self.Portfolio.TotalPortfolioValue - self.Portfolio.Cash - self.Portfolio.TotalProfit
                )  # Unrealized PnL

        self.previous_value = self.Portfolio.TotalPortfolioValue

    def OnEndOfAlgorithm(self):
        self.Debug(f"Max Daily Loss: {self.max_daily_loss:.4%} on {self.max_loss_date}")
        self.Debug(f"Realized PnL on Max Loss Day: ${self.pnl_on_max_loss_day['realized']:,.2f}")
        self.Debug(f"Unrealized PnL on Max Loss Day: ${self.pnl_on_max_loss_day['unrealized']:,.2f}")