| Overall Statistics |
|
Total Trades 79 Average Win 11.47% Average Loss -15.00% Compounding Annual Return 0% Drawdown 100.000% Expectancy -0.412 Net Profit -100.012% Sharpe Ratio -0.23 Probabilistic Sharpe Ratio 0.000% Loss Rate 67% Win Rate 33% Profit-Loss Ratio 0.76 Alpha -3.5 Beta 11.302 Annual Standard Deviation 4.547 Annual Variance 20.68 Information Ratio -0.28 Tracking Error 4.503 Treynor Ratio -0.092 Total Fees $2063.75 Estimated Strategy Capacity $720000.00 Lowest Capacity Asset SPY Y5BMQ8ZJJZ3A|SPY R735QTJ8XC9X Portfolio Turnover -10010.61% |
from AlgorithmImports import *
class MorningStarDataAlgorithm(QCAlgorithm):
UnderlyingTicker = "SPY"
def Initialize(self):
self.SetStartDate(2023, 1, 1) # Cambiar fechas en las que quieres que corra
self.SetEndDate(2023, 11, 1)
self.SetCash(100000)
self.UniverseSettings.Resolution = Resolution.Daily
equity = self.AddEquity(self.UnderlyingTicker, Resolution.Daily)
option = self.AddOption(self.UnderlyingTicker)
self.option_symbol = option.Symbol
symbols = [self.option_symbol]
#self.AddUniverseSelection(ManualUniverseSelectionModel(symbols))
option.SetFilter(lambda u: (u.Strikes(-2, +2).Expiration(0, 90)))
self.SetBenchmark(equity.Symbol)
self.last_month = None
self.ticket = None
# Use the following method for a Framework Algorithm
self.etf_constituents = []
self.universe_etf = self.Universe.ETF("SPY", Market.USA,
self.UniverseSettings, self.ETFConstituentsFilter)
self.num_symbols = 2 # Número de acciones en el portafolio
#self.AddUniverse(self.universe_etf)
self.securities = []
self.lastTradeDay = self.Time.date()
#self.AddRiskManagement(MaximumDrawdownPercentPerSecurity())
#self.AddRiskManagement(MaximumDrawdownPercentPortfolio(0.10, True))
#self.AddRiskManagement(TrailingStopRiskManagementModel(0.40))
#self.Schedule.On(self.DateRules.On(self.EndDate),
# self.TimeRules.At(15, 55),
# self.Liquidate)
self.changes = None
def ETFConstituentsFilter(self, constituents: List[ETFConstituentData]) -> List[Symbol]:
selected = sorted([c for c in constituents if c.Weight],
key=lambda c: c.Weight, reverse=True)
if not selected:
# keep the current universe if all weights are None
return Universe.Unchanged
self.etf_constituents = []
for i in range(len(selected)):
symbol = selected[i].Symbol
if symbol in self.etf_constituents:
continue
self.etf_constituents.append(symbol)
if len(self.etf_constituents) == self.num_symbols:
return self.etf_constituents
return Universe.Unchanged
def OnData(self, data):
##### Options #####
if self.IsMarketOpen(self.option_symbol):
current_month = self.Time.month
if current_month != self.last_month:
if not self.ticket is None:
self.MarketOrder(self.ticket.Symbol, -1)
chain = data.OptionChains.GetValue(self.option_symbol)
if chain is None:
self.Debug('Chain is none')
return
underlying_price = self.Securities[self.option_symbol.Underlying].Price
expiry = max([x.Expiry for x in chain])
# we sort the contracts to find OTM contract with farthest expiration
contracts = sorted([x for x in chain if x.Right == OptionRight.Put and x.Expiry == expiry], key=lambda x: x.Expiry, reverse=True)
# Select contracts with a strike price 30% below the current market price
contracts = [i for i in chain if i.Strike <= underlying_price * 0.71 and i.Strike >= underlying_price * 0.69]
# if found, trade it
if len(contracts) == 0:
self.Debug('No contracts found..')
return
self.Debug('Strike [-1]: '+str(contracts[-1].Strike))
self.Debug('Expiry [-1]: '+str(contracts[-1].Expiry))
symbol = contracts[-1].Symbol
self.ticket = self.MarketOrder(symbol, 1)
self.last_month = current_month
##### SPY Constituents #####
if not self.changes is None:
if self.Time.date() != self.lastTradeDay:
# liquidate removed securities
for security in self.changes.RemovedSecurities:
if security.Invested:
self.Liquidate(security.Symbol)
self.Debug("Liquidated Stock: " + str(security.Symbol.Value))
# we want 50% allocation in each security in our universe
for security in self.changes.AddedSecurities:
self.SetHoldings(security.Symbol, 1/self.num_symbols)
self.Debug("Bought Stock: " + str(security.Symbol.Value))
self.changes = None
self.lastTradeDay = self.Time.date()
def OnSecuritiesChanged(self, changes):
self.changes = changes
self.Log(str(changes))
def OnOrderEvent(self, orderEvent):
self.Log(str(orderEvent))