-
Option Payoffs 4
-
Lecture1.1
-
Lecture1.2
-
Lecture1.3
-
Lecture1.4
-
-
Binomial Model 8
-
Lecture2.1
-
Lecture2.2
-
Lecture2.3
-
Lecture2.4
-
Lecture2.5
-
Lecture2.6
-
Lecture2.7
-
Lecture2.8
-
-
Black-Scholes 6
-
Lecture3.1
-
Lecture3.2
-
Lecture3.3
-
Lecture3.4
-
Lecture3.5
-
Lecture3.6
-
-
Monte Carlo Simulations 3
-
Lecture4.1
-
Lecture4.2
-
Lecture4.3
-
Delta Hedging Calls
The idea of delta hedging a portfolio is to provide immunity to movements in the short term. You’ll see what this means soon. The method by which we do this is to first find the number of calls and the delta at the current state. This delta will inform how much of the actual stock we need to go to short to make the portfolio delta neutral. If a portfolio is delta neutral, then minor changes in the stock price will not effect the overall portfolio. For example, the following is the number of shares of the stock and its value that we would go short to make the portfolio delta neutral. Notice it about 200 shares because the delta is not very high, that amount will create a delta neutral portfolio. Also notice that the nominal value of those shares is much higher than the cost of the options.
n_calls = 1000
delta = black_scholes_delta(50, 55, .08, .03, 1)
print("Call Delta")
print(delta)
print()
long_calls_t0 = black_scholes_call(50, 55, .08, .03, 1)*n_calls
print("Value of Calls")
print(long_calls_t0)
print()
n_stock = delta * n_calls * -1
print("Number of shares of stock to hedge")
print(n_stock)
print()
short_stock_t0 = n_stock * 55
print("Value of shares of stock")
print(short_stock_t0)
And with these values, we can map the profits and losses if we assume that after we enter this position the stock price immediately changes. This means that time to expiration does not change. Let’s see around a $1 change what happens as well as larger changes.
#If there is an immediate change in price either way we are protected
df = pd.DataFrame(np.arange(49,51.01,.01), columns = ['Stock Price'])
#The call profit is the difference between the starting value and current value
df['Call Value'] = df['Stock Price'].apply(lambda x: black_scholes_call(x, 55, .08, .03, 1) * n_calls ) - long_calls_t0
#The stock profit is the difference times the number of stocks (we are short so the profits are flipped)
df['Stock Value'] = (df['Stock Price'] - 50) * n_stock
#The hedged call value is the two profits added together
df['Hedged Call'] = df['Call Value'] + df['Stock Value']
#Plot the profits
df = df.set_index('Stock Price')
df['Hedged Call'].plot(kind='line')
plt.show()
#Repeat for a wider range
df = pd.DataFrame(np.arange(40,65.1,.1), columns = ['Stock Price'])
df['Call Value'] = df['Stock Price'].apply(lambda x: black_scholes_call(x, 55, .08, .03, 1) * n_calls ) - long_calls_t0
df['Stock Value'] = (df['Stock Price'] - 50) * n_stock
df['Hedged Call'] = df['Call Value'] + df['Stock Value']
df = df.set_index('Stock Price')
df['Hedged Call'].plot(kind='line')
plt.show()
From these graphs, you will notice that no matter what the value can only go up. The value is immune to changes in the immediate term! However, it does not mean it is a pure profit strategy. Look at the payoffs at the expiration and you will see that if the stock does not move up or down by a decent amount that we lose money.
#At expiration the payoff profile is different though...
df = pd.DataFrame(np.arange(40,65.1,.1), columns = ['Stock Price'])
#The call profit is the intrinsic value at expiration
df['Call Value'] = df['Stock Price'].apply(lambda x: max(x-55, 0) * n_calls ) - long_calls_t0
#The stock profit is the difference times the number of stocks (we are short so the profits are flipped)
df['Stock Value'] = (df['Stock Price'] - 50) * n_stock
#The hedged call value is the two profits added together
df['Hedged Call'] = df['Call Value'] + df['Stock Value']
#Plot the profits
df = df.set_index('Stock Price')
df['Hedged Call'].plot(kind='line')
plt.show()
One further point. We should be considering the cash position. Since we go short in the stock, we actually receive cash from that end of the deal, and so we need to find what cash we get in the beginning as well as the interest that we would receive for holding the cash.
#We should also consider the interest that we would get. Because we are short we have an inflow of cash from it
net_cash = long_calls_t0 - short_stock_t0
print("Net cash:")
print(net_cash)
print()
#And we would get the 3% interest over the year so
interest = np.exp(.03) * net_cash - net_cash
print("Interest:")
print(interest)
Add this value to our graph.
#So we can add that in to the final graph
#At expiration the payoff profile is different though...
df = pd.DataFrame(np.arange(40,65.1,.1), columns = ['Stock Price'])
#The call profit is the intrinsic value at expiration
df['Call Value'] = df['Stock Price'].apply(lambda x: max(x-55, 0) * n_calls ) - long_calls_t0
#The stock profit is the difference times the number of stocks (we are short so the profits are flipped)
df['Stock Value'] = (df['Stock Price'] - 50) * n_stock
#The hedged call value is the two profits added together
df['Hedged Call'] = df['Call Value'] + df['Stock Value'] + interest
#Plot the profits
df = df.set_index('Stock Price')
df['Hedged Call'].plot(kind='line')
plt.show()