Exploring Greeks – Delta (Δ) with Python

Delta vs Stock Price

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import norm

# Black-Scholes model for calculating option price and delta
def black_scholes_delta(S, K, r, T, sigma, option_type):
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    if option_type == 'call':
        delta = norm.cdf(d1)
    elif option_type == 'put':
        delta = norm.cdf(d1) - 1
    return delta

# Parameters
S_values = np.arange(50, 151, 10)  # Stock price range with intervals of 5
K = 100  # Strike price
r = 0.05  # Risk-free rate
T = 1  # Time to maturity
sigma = 0.2  # Volatility

# Calculate call and put deltas for different stock prices
call_deltas = [black_scholes_delta(S, K, r, T, sigma, 'call') for S in S_values]
put_deltas = [black_scholes_delta(S, K, r, T, sigma, 'put') for S in S_values]

# Create a table of stock price vs call and put deltas
data = {'Stock Price': S_values, 'Call Delta': call_deltas, 'Put Delta': put_deltas}
df = pd.DataFrame(data)
print(df)

# Plotting call and put deltas against stock prices
plt.figure(figsize=(8, 6))
plt.plot(S_values, call_deltas, label='Call Delta', marker='o')
plt.plot(S_values, put_deltas, label='Put Delta', marker='o')
plt.title('Call and Put Deltas vs Stock Price')
plt.xlabel('Stock Price')
plt.ylabel('Delta Value')
plt.legend()
plt.grid(True)
plt.show()

Output


Impact of Changes in Implied Volatility on Delta

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# Functions to calculate call and put deltas
def calculate_call_delta(S, K, r, T, sigma):
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    call_delta = np.exp(-r * T) * norm.cdf(d1)
    return call_delta

def calculate_put_delta(S, K, r, T, sigma):
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    put_delta = -np.exp(-r * T) * norm.cdf(-d1)
    return put_delta

# Parameters
S = 100  # Current stock price
K_range = np.linspace(80, 120, 9)  # Strike price range
T = 1  # Time to expiry
r = 0.05  # Risk-free rate
sigma_values = [0.2, 0.3, 0.4]  # Implied volatility values

# Calculate call and put deltas for different implied volatilities and strike prices
call_deltas = {}
put_deltas = {}

for sigma in sigma_values:
    call_deltas[sigma] = [calculate_call_delta(S, K, r, T, sigma) for K in K_range]
    put_deltas[sigma] = [calculate_put_delta(S, K, r, T, sigma) for K in K_range]

# Plotting Delta vs. Strike Price for call and put options
plt.figure(figsize=(8, 6))

for sigma in sigma_values:
    plt.plot(K_range, call_deltas[sigma], label=f'Call, Sigma={sigma}', linestyle='-', marker='o')
    plt.plot(K_range, put_deltas[sigma], label=f'Put, Sigma={sigma}', linestyle='--', marker='x')

plt.title('Delta vs. Strike Price for Call and Put Options (Different Volatilities)')
plt.xlabel('Strike Price')
plt.ylabel('Delta')
plt.legend()
plt.grid(True)
plt.show()

Output


Impact of changes in time to expiration on Delta

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# Functions to calculate call and put deltas
def calculate_call_delta(S, K, r, T, sigma):
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    call_delta = np.exp(-r * T) * norm.cdf(d1)
    return call_delta

def calculate_put_delta(S, K, r, T, sigma):
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    put_delta = -np.exp(-r * T) * norm.cdf(-d1)
    return put_delta

# Parameters
S = 100  # Current stock price
K_range = np.linspace(80, 120, 9)  # Strike price range
sigma = 0.2  # Implied volatility
T_values = [0.5, 1, 2]  # Time to expiry values
r = 0.05  # Risk-free rate

# Calculate call and put deltas for different time to expiry values and strike prices
call_deltas = {}
put_deltas = {}

for T in T_values:
    call_deltas[T] = [calculate_call_delta(S, K, r, T, sigma) for K in K_range]
    put_deltas[T] = [calculate_put_delta(S, K, r, T, sigma) for K in K_range]

# Plotting Delta vs. Strike Price for call and put options
plt.figure(figsize=(8, 6))

for T in T_values:
    plt.plot(K_range, call_deltas[T], label=f'Call, T={T}', linestyle='-', marker='o')
    plt.plot(K_range, put_deltas[T], label=f'Put, T={T}', linestyle='--', marker='x')

plt.title('Delta vs. Strike Price for Call and Put Options (Different Time to Expiry)')
plt.xlabel('Strike Price')
plt.ylabel('Delta')
plt.legend()
plt.grid(True)
plt.show()