Hello,
I've coded a monthly short strangle on the S&P500, however I'm having a hard time understanding how are options assignments computed.
By looking at the "trades" tab, it appears that all options that are "against me" (strike value < underlying value on calls, the opposite on puts) are assigned at expiration.
I would like options to be assigned at the worst possible case scenario. For example, if I sell a monthly call with strike 100, and during the month the underlying goes from 100 to 110 and goes back to 105 when the option expire, I'd like the backtester to assume that the option gets assigned when the underlying is at 110, not 105.
Is this possible?
Thanks a lot!
Jing Wu
Hi Joseph, if you don't liquidate the contract, the algorithm will hold the contract until it expires. If you want to liquidate the position before it expires, you should save the contract symbol and compare the contract strike price with the current underlying price and send the liquidation order. For example
if self.Portfolio[self.atm_call[0].Symbol].Invested: if self.Securities[self.atm_call[0].Symbol].AskPrice > self.atm_call[0].Strike: self.Liquidate(self.atm_call[0].Symbol)
Using Ask or Bid price depends on your algorithm.
Joseph Cohen Bacchilega
Hello Jing,
Thank you very much for your time, code example and expertise: this is very much appreciated.
You explained to me how to liquidate an option contract before expiration and how to verify its strike price relative to the underlying price.
What I'd ideally want to achieve now is to liquidate the option contract at the worst possible moment: out of all the prices the underlying will touch, I'd like to identify the one which is further away from the option strike and liquidate it that day. Can you kindly confirm to me there is no way to do this automatically? I think I can code it myself if there's not: maybe it'll be useful to other people as well (LEAN engine's assumptions that american options are always liquidated at expiry might show some strategies to be performing better than what they'd do in the real market, where options might be assigned, for the better or for the worse, before they expire).
The only problem in coding something like this is that the OnData() function only looks at a single tick values: we can't possibly check the future or the past in there (nor we want to - we'd be searching every tick for something we only need once: the liquidation date according to the "worst possible" idea).
If I might ask: what do you think would be the best way to code something like this? I'm not asking for specific code examples, just a general "best practice" idea. I was thinking about a function that gets called every time we sell an option: the function would need the option strike and the underlying prices for the period before expiration, and would return either nothing or a flag that indicates when the market will assign the option. The result of this function should be stored in a global variable and OnData will always check this variable and call .Liquidate based on what's stored in it (we could use a date, or the underlying price).
Thanks again for your input!
Joseph.
Jing Wu
If your liquidation condition is complicated you can create a function with arguments with the underlying price. if not, "if else" statement would be easier to implement. "identify the one which is further away from the option strike and liquidate it that day" This "further away" is hard to define as you only have the history price without the future price. If you need the history price of underlying, you can use the rolling window to save the history bar.
Deniz Erkan
Has this issue been addressed? Jing Wu's post is not really answering Joseph's question above. I am facing the same issue here : How does the backtesting engine decide WHEN to assign the options to the short seller? i.e. I sold put options on GOOG for $100 strike due date Jan 31. Before the expiration, on Jan20, GOOG trades at $99. Does the engine auto-assign the option on Jan 20 in this case? How does the algorithm work here?
Marcello Ranone
Hi there, I am interested knowing how to do this too. I hope someone more expert could help and reply. Maybe it may be sufficient to retrieve future prices from the underlying in OnData (although I don't know how)?Â
Jared Broad
They are simulated with the BasicOptionAssignmentSimulation class which is added to the backtesting brokerage here.Â
This is not configurable at this time but it was designed in a way it could be configurable. It's not simple stuff though, so I'm not sure it makes sense to 99% of the community to make it configurable on the algorithm layer.
What are you trying to achieve?
The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by QuantConnect. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. QuantConnect makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances. All investments involve risk, including loss of principal. You should consult with an investment professional before making any investment decisions.
Marcello Ranone
Hi Jared, thank you for your reply. As Joseph mentioned the objective is to simulate how we get assigned on an option in the worst case scenario. Let's assume we are in a SELL PUT strategy, we may want to be assigned when the underlying goes at its minimum, ie. at our most potential loss, and not at expiration. I know that none of the two policies would be 100% realistic, but I believe both of them are useful for backtesting purposes. In other words, we would like the "backend" to be the oracle, knowing what's the best time for it to sell stocks to us (in case of a SELL PUT strategy).
Anyway I will have a look at the class to figure out how it works. Thanks!
MichaelM
I'm not an expert in Options, but as far as I understand the likelihood of being assigned early on a short option is directy related to the extrinsic value of that option.
ATM or slighlty ITM options have mostly extrinsic value, so the option owner will make more money selling his option rather then exercise it, i.e. assignment is unlikely.
There are 3 cases where assignment is highly likely:
I think coding these conditions into the backtest would produce more realistic results.
Looking at the LEAN backend implemenmtation of BasicOptionAssignmentSimulation:
/Brokerages/Backtesting/BasicOptionAssignmentSimulation.cs
It seems to use a heuristic of assigining short options if they are deeper then 5% ITM and close to expiration, which I think is over simplification and would produce overly optimistic backtest results.
Joseph Cohen Bacchilega
The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by QuantConnect. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. QuantConnect makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances. All investments involve risk, including loss of principal. You should consult with an investment professional before making any investment decisions.
To unlock posting to the community forums please complete at least 30% of Boot Camp.
You can continue your Boot Camp training progress from the terminal. We hope to see you in the community soon!