Overall Statistics |
Total Trades 4 Average Win 0.06% Average Loss -0.82% Compounding Annual Return 4.934% Drawdown 0.200% Expectancy -0.463 Net Profit 0.445% Sharpe Ratio 5.847 Probabilistic Sharpe Ratio 98.261% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 0.07 Alpha 0.005 Beta 0.099 Annual Standard Deviation 0.008 Annual Variance 0 Information Ratio -6.776 Tracking Error 0.052 Treynor Ratio 0.446 Total Fees $2.00 Estimated Strategy Capacity $11000000.00 Lowest Capacity Asset GOOCV WIJN29E3NU86|GOOCV VP83T1ZUHROL |
from AlgorithmImports import * class BullCallSpreadStrategy(QCAlgorithm): def Initialize(self): self.SetStartDate(2017, 2, 1) self.SetEndDate(2017, 3, 6) self.SetCash(500000) option = self.AddOption("GOOG", Resolution.Minute) self.symbol = option.Symbol option.SetFilter(self.UniverseFunc) def UniverseFunc(self, universe): return universe.IncludeWeeklys().Strikes(-15, 15).Expiration(timedelta(0), timedelta(31)) def OnData(self, data): # avoid extra orders if self.Portfolio.Invested: return # Get the OptionChain of the self.symbol chain = data.OptionChains.get(self.symbol, None) if not chain: return # sorted the optionchain by expiration date and choose the furthest date expiry = sorted(chain, key = lambda x: x.Expiry, reverse=True)[0].Expiry # filter the call options from the contracts which expire on the furthest expiration date in the option chain. calls = [i for i in chain if i.Expiry == expiry and i.Right == OptionRight.Call] if len(calls) == 0: return # sort the call options with the same expiration date according to their strike price. call_strikes = sorted([x.Strike for x in calls]) # select the strike prices for forming the option legs # the ITM call option with the lowest strike price (long) and the OTM call with the highest strike price (short). itm_strike = call_strikes[0] otm_strike = call_strikes[-1] option_strategy = OptionStrategies.BullCallSpread(self.symbol, itm_strike, otm_strike, expiry) # We open a position with 1 unit of the option strategy self.Buy(option_strategy, 1)