| 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}")