Hi,

I try to use the covered call example in the Tutorials. It basically just sell monthly covered calls.

The security used is "IBM", from 2020-01-01 to 2020-03-01. I used the "SetFilter" method, which by default only looks at the monthly. 

I run into 2 questions which I can't explain. 

1. why after the 1st monlty option (200117C00135000) is expired, the next option is submitted on 2020-01-22, which is a Wednesday, but not on 2020-01-21 (that Monday is a holiday I believe)

2. the next monthly option is (IBM   200221C00143000), which is set to expire on 2/21, but there is an assignment on 2/18. 

Can anyone explain why? Thanks. 

I attached my code here, and also the log file. 

Thanks.

from datetime import timedelta class CoveredCallAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) self.SetEndDate(2020, 3, 1) self.SetCash(100000) equity = self.AddEquity("IBM", Resolution.Minute) option = self.AddOption("IBM", Resolution.Minute) self.symbol = option.Symbol # set strike/expiry filter for this option chain option.SetFilter(-3, +3, timedelta(0), timedelta(30)) # use the underlying equity as the benchmark self.SetBenchmark(equity.Symbol) def OnData(self,slice): if not self.Portfolio["IBM"].Invested: self.MarketOrder("IBM",100) # buy 100 shares of underlying stocks self.Log(str(self.Time) + " bought IBM " + "@" + str(self.Securities["IBM"].Price) + " Cash balance: " + str(self.Portfolio.Cash) + " Equity: " + str(self.Portfolio.HoldStock)) option_invested = [x.Key for x in self.Portfolio if x.Value.Invested and x.Value.Type==SecurityType.Option] if len(option_invested) < 1: self.TradeOptions(slice) def TradeOptions(self,slice): for i in slice.OptionChains: if i.Key != self.symbol: continue chain = i.Value # filter the call options contracts call = [x for x in chain if x.Right == OptionRight.Call] # sorted the contracts according to their expiration dates and choose the ATM options contracts = sorted(sorted(call, key = lambda x: abs(chain.Underlying.Price - x.Strike)), key = lambda x: x.Expiry, reverse=True) if len(contracts) == 0: return self.call = contracts[0].Symbol # short the call options self.MarketOrder(self.call, -1) def OnOrderEvent(self, orderEvent): self.Log(str(orderEvent)) self.Log("Cash balance: " + str(self.Portfolio.Cash))

 

2020-01-01 00:00:00 Launching analysis for d2d7894f981e5c6562aca1d75163f84b with LEAN Engine v2.4.0.0.8588 2020-01-01 00:00:00 Warning: The IBM equity security was set the raw price normalization mode to work with options. 2020-01-02 09:31:00 Time: 01/02/2020 14:31:00 OrderID: 1 EventID: 1 Symbol: IBM Status: Submitted Quantity 100 2020-01-02 09:31:00 Cash balance: 100000.0 2020-01-02 09:31:00 Time: 01/02/2020 14:31:00 OrderID: 1 EventID: 2 Symbol: IBM Status: Filled Quantity 100 FillQuantity: 100 FillPrice: 135.08 USD OrderFee: 1 USD 2020-01-02 09:31:00 Cash balance: 86491.0 2020-01-02 09:31:00 2020-01-02 09:31:00 bought IBM @135.025 Cash balance: 86491.0 Equity: True 2020-01-02 09:31:00 Time: 01/02/2020 14:31:00 OrderID: 2 EventID: 1 Symbol: IBM 200117C00135000 Status: Submitted Quantity -1 2020-01-02 09:31:00 Cash balance: 86491.0 2020-01-02 09:31:00 Time: 01/02/2020 14:31:00 OrderID: 2 EventID: 2 Symbol: IBM 200117C00135000 Status: Filled Quantity -1 FillQuantity: -1 FillPrice: 1.63 USD OrderFee: 1 USD 2020-01-02 09:31:00 Cash balance: 86653.0 2020-01-17 16:00:00 Time: 01/17/2020 21:00:00 OrderID: 3 EventID: 1 Symbol: IBM 200117C00135000 Status: Submitted Quantity -1 2020-01-17 16:00:00 Cash balance: 86653.0 2020-01-18 00:00:00 Time: 01/18/2020 05:00:00 OrderID: 3 EventID: 2 Symbol: IBM 200117C00135000 Status: Filled Quantity -1 FillQuantity: 1 FillPrice: 0 Message: Adjusting(or removing) the exercised/assigned option 2020-01-18 00:00:00 Cash balance: 86653.0 2020-01-18 00:00:00 Time: 01/18/2020 05:00:00 OrderID: 3 EventID: 3 Symbol: IBM Status: Filled Quantity -1 FillQuantity: -100 FillPrice: 135 Message: Option Exercise/Assignment 2020-01-18 00:00:00 Cash balance: 100153.0 2020-01-18 00:00:00 Time: 01/18/2020 05:00:00 OrderID: 4 EventID: 1 Symbol: IBM Status: Submitted Quantity 100 2020-01-18 00:00:00 Cash balance: 100153.0 2020-01-18 00:00:00 2020-01-18 00:00:00 bought IBM @138.28 Cash balance: 100153.0 Equity: False 2020-01-21 09:31:00 Time: 01/21/2020 14:31:00 OrderID: 4 EventID: 2 Symbol: IBM Status: Filled Quantity 100 FillQuantity: 100 FillPrice: 138.29 USD OrderFee: 1 USD 2020-01-21 09:31:00 Cash balance: 86323.0 ? why the option is submitted on 1/22, but not 1/21 2020-01-22 09:31:00 Time: 01/22/2020 14:31:00 OrderID: 5 EventID: 1 Symbol: IBM 200221C00143000 Status: Submitted Quantity -1 2020-01-22 09:31:00 Cash balance: 86323.0 2020-01-22 09:31:00 Time: 01/22/2020 14:31:00 OrderID: 5 EventID: 2 Symbol: IBM 200221C00143000 Status: Filled Quantity -1 FillQuantity: -1 FillPrice: 1.88 USD OrderFee: 1 USD 2020-01-22 09:31:00 Cash balance: 86510.0 ? The option is set to expire on 2/21, why there are some many operation on 2/18 2020-02-18 14:04:00 Time: 02/18/2020 19:04:00 OrderID: 6 EventID: 1 Symbol: IBM 200221C00143000 Status: Submitted Quantity -1 2020-02-18 14:04:00 Cash balance: 86672.0 2020-02-18 14:05:00 Time: 02/18/2020 19:05:00 OrderID: 6 EventID: 2 Symbol: IBM 200221C00143000 Status: Filled Quantity -1 FillQuantity: 1 FillPrice: 0 Message: Adjusting(or removing) the exercised/assigned option 2020-02-18 14:05:00 Cash balance: 86672.0 2020-02-18 14:05:00 Time: 02/18/2020 19:05:00 OrderID: 6 EventID: 3 Symbol: IBM Status: Filled Quantity -1 FillQuantity: -100 FillPrice: 143 Message: Option Exercise/Assignment 2020-02-18 14:05:00 Cash balance: 100972.0 2020-02-18 14:05:00 Time: 02/18/2020 19:05:00 OrderID: 7 EventID: 1 Symbol: IBM Status: Submitted Quantity 100 2020-02-18 14:05:00 Cash balance: 100972.0 2020-02-18 14:05:00 Time: 02/18/2020 19:05:00 OrderID: 7 EventID: 2 Symbol: IBM Status: Filled Quantity 100 FillQuantity: 100 FillPrice: 150.67 USD OrderFee: 1 USD 2020-02-18 14:05:00 Cash balance: 85904.0 2020-02-18 14:05:00 2020-02-18 14:05:00 bought IBM @150.67 Cash balance: 85904.0 Equity: True 2020-02-18 14:05:00 Time: 02/18/2020 19:05:00 OrderID: 8 EventID: 1 Symbol: IBM 200221C00150000 Status: Submitted Quantity -1 2020-02-18 14:05:00 Cash balance: 85904.0 2020-02-18 14:05:00 Time: 02/18/2020 19:05:00 OrderID: 8 EventID: 2 Symbol: IBM 200221C00150000 Status: Filled Quantity -1 FillQuantity: -1 FillPrice: 1.51 USD OrderFee: 1 USD 2020-02-18 14:05:00 Cash balance: 86054.0 2020-02-21 16:00:00 Time: 02/21/2020 21:00:00 OrderID: 9 EventID: 1 Symbol: IBM 200221C00150000 Status: Submitted Quantity -1 2020-02-21 16:00:00 Cash balance: 86054.0 2020-02-22 00:00:00 Time: 02/22/2020 05:00:00 OrderID: 9 EventID: 2 Symbol: IBM 200221C00150000 Status: Filled Quantity -1 FillQuantity: 1 FillPrice: 0 Message: Adjusting(or removing) the exercised/assigned option 2020-02-22 00:00:00 Cash balance: 86054.0 2020-02-24 09:31:00 Time: 02/24/2020 14:31:00 OrderID: 10 EventID: 1 Symbol: IBM 200320C00146000 Status: Submitted Quantity -1 2020-02-24 09:31:00 Cash balance: 86054.0 2020-02-24 09:31:00 Time: 02/24/2020 14:31:00 OrderID: 10 EventID: 2 Symbol: IBM 200320C00146000 Status: Filled Quantity -1 FillQuantity: -1 FillPrice: 3.6 USD OrderFee: 1 USD 2020-02-24 09:31:00 Cash balance: 86413.0 2020-02-28 16:00:00 Algorithm Id:(d2d7894f981e5c6562aca1d75163f84b) completed in 15.14 seconds at 1034k data points per second. Processing total of 15,662,196 data points.

 

Author