In the case of
ITM options we also have a perfect match with the broker computations. For instance:
Now, if the options were "
cash settled" we would
need to do nothing, just as for the OTM options, because the PNL would already be accurate. However, being a "physical delivery" we have that the broker has assigned +100 shares at a price equal to the strike (15.5) of the option:
So we need to "re sync" the application. This is actually simple to do.
"Virtual fill" feature
First of all let's introduce the "
virtual fill" feature.
This dialog, as the name suggests, allows us to "add" a position in the application, without actually executing the order. It obviously has the purpose to re-sync the application position with the account position, whenever necessary, without actually executing anything (in our case the shares were added by IB due to assignment.)
Re-syncing the shares:
We just open the virtual fill dialog on the TZA shares' layer and specify fill size and price.
Fill size: assigned shares, for instance BUY 100 in this case.
Price: strike of the option, in this case 15.5
So, before re-sync, we have:
We open the "virtual fill" dialog and add the 100 shares assigned:
And we get:
So, what have we done so far ? We have simply
moved part of the PNL which was on the option layer to the shares which have been assigned. Therefore, now it just remains to adjust the PNL of the option layer, because the loss has actually been "moved" to the shares' layer.
This is also simple to do. We just
compute the PNL of the option "as if" the close price were 0 (that is, just like it had expired OTM). [This is just an option (a checkbox) of the PNL computations dialog.] So we get:
The PNL of the options, which we want to maintain, just moving the loss, from the option layer to shares' layer, is composed by:
PNL (put option) = [OpenPrice * quantity * multiplier] - [(strike - Underlying) * quantity * multiplier] - OpenComms
= [0.67 * 1 * 100] - [(15.5 - 14.65) * 1 * 100] - 1.54
= 67 - 85 - 1.54
= -19.54
When we assume a closing price of 0, it becomes:
PNL (option adjusted) = [OpenPrice* quantity * multiplier] - 0 - OpenComms
= [0.67 * 1 * 100] - 1.54
= 67 - 1.54
= 65.46
The "removed" piece simply goes on the shares' layer. In fact, the strike is the price we use for filling the assigned shares, so we have:
PNL (long shares assigned) = - [(strike - Underlying) * quantity * multiplier]
= - (15.5 - 14.65) * 100
= -
85
(in the case of shares, quantity= 100 and multiplier=1, so the product is the same as above)
Clearly, we have simply "split" the original option PNL into two meaningful components: -19.54 = 65.46 - 85. That's all.
In brief, dealing with expiration of ITM options (without closing them before expiration) is also simple and we still remain accurate to the penny. We can do it in a couple minutes during the weekend:
Code:
** SUMMARY **
- OTM options: do nothing
- ITM options (cash settled): do nothing
- ITM options with out of sync shares: Re-sync the shares (virtual fill at strike),
force the option PNL to be computed with null closing price
- remove the expired layers.
------------------------------
(As to the re-sync, there is also another way, even quicker, which in case we will see later, that leaves completely unchanged the option layer, and merely re-syncs the position on the shares layer, clearly using a different fill price.)