| Overall Statistics |
|
Total Trades 42 Average Win 13.87% Average Loss -9.48% Compounding Annual Return -8.393% Drawdown 27.900% Expectancy 0.120 Net Profit -1.625% Sharpe Ratio 0.383 Probabilistic Sharpe Ratio 36.546% Loss Rate 55% Win Rate 45% Profit-Loss Ratio 1.46 Alpha 0.335 Beta 1.264 Annual Standard Deviation 0.875 Annual Variance 0.766 Information Ratio 0.388 Tracking Error 0.864 Treynor Ratio 0.265 Total Fees $3382.30 Estimated Strategy Capacity $6000.00 Lowest Capacity Asset SPY 2Z4U27US75QZQ|SPY R735QTJ8XC9X |
# region imports
from AlgorithmImports import *
# endregion
class EnergeticBrownCobra(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2012, 3, 1) # Set Start Date
self.SetEndDate(2012, 5, 8) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
self.SetWarmUp(50, Resolution.Daily)
self.equity = self.AddEquity("SPY", Resolution.Minute)
self.option = self.AddOption(self.equity.Symbol, Resolution.Minute)
self.equity.SetDataNormalizationMode(DataNormalizationMode.Raw)
self.equity.VolatilityModel = StandardDeviationOfReturnsVolatilityModel(30)
self.option.SetFilter(lambda universe: universe.IncludeWeeklys().Strikes(-5, 5).Expiration(timedelta(0), timedelta(10)))
self.option.PriceModel = OptionPriceModels.BinomialTian()
self.option.VolatilityModel = StandardDeviationOfReturnsVolatilityModel(30)
def withinPercent(self, number, target, pctTarget, absolute=True):
if absolute:
absNumber=abs(number)
absTarget=abs(target)
pctFromTarget = abs((absNumber/absTarget)-1)*100
return pctFromTarget < pctTarget
def OnData(self, slice):
if not self.IsWarmingUp and not self.Portfolio.Invested:
for kvp in slice.OptionChains:
chain = kvp.Value
puts = [x for x in chain if x.Greeks.Delta!=0 and x.Right==OptionRight.Put and self.withinPercent(x.Strike, self.equity.Price, 5)]
if len(puts)>0:
putToSell = puts[0]
putToBuy = min([x for x in chain if x.Strike > putToSell.Strike and x.Right == OptionRight.Put and x.Expiry == putToSell.Expiry], key=lambda y: abs(putToSell.Strike-y.Strike))
self.sellToOpenBullSpread(50, putToSell, putToBuy)
self.sellPut = putToSell
self.buyPut = putToBuy
if self.Time.hour==15 and self.Time.minute==59:
self.Plot("SPY", "SPY", self.equity.Price)
if self.Portfolio.Invested:
self.Plot("SPY", "sellPutStrike", self.sellPut.Strike)
self.Plot("SPY", "buyPutStrike", self.buyPut.Strike)
def sellToOpenBullSpread(self, equityPct, sellPut, buyPut):
#sell put with higher strike
#buy put with lower strike
#This is selling a put spread with limited risk, which should not get margin called
sellPutBid = self.Securities[sellPut.Symbol].BidPrice
buyPutAsk= self.Securities[buyPut.Symbol].AskPrice
bp= self.Portfolio.GetBuyingPower(sellPut.Symbol)
costPerSpread= sellPut.Strike-buyPut.Strike -(sellPutBid-buyPutAsk)
bpEffect= costPerSpread*100
optionStrategyQty = abs(math.floor((bp * (equityPct/100))/bpEffect))
legOneTicket= self.MarketOrder(sellPut.Symbol, optionStrategyQty)
legTwoTicket= self.MarketOrder(buyPut.Symbol, -optionStrategyQty)
self.legOneCost = legOneTicket.AverageFillPrice*100*optionStrategyQty
self.legTwoCost = -legTwoTicket.AverageFillPrice*100*optionStrategyQty
return
def OnOrderEvent(self, orderEvent):
if orderEvent.IsAssignment:
self.Liquidate()