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