Program: Python Code for Exotic Option Trading

1 minute read

Complete Code and Question is available here

Question

Picture1

Solution


import math
import numpy as np

#Initial value of asset
initial_S0 = 42
#Risk free rate
risk_free_rate = 0.04
#volatility
volatility = 0.2
#time_to_maturity = 2

#delta time or number of intervals within exercise time
delta_t = float(input("Enter number of time intervals : "))
#Exercise time
number_years = 2

#Adding one because ther is always one extra value at each interval
n = int(delta_t)+1

#Calculating the subintervals or time for each period
delta_t = float(number_years/delta_t)

#u value from volatility and delta (up value)
u = math.exp(volatility*math.sqrt(delta_t))
#d value from volatility and delta (down value)
d = math.exp(-volatility*math.sqrt(delta_t))

#Calculating the qu(Probability og up) value
q_u = (math.exp(risk_free_rate * delta_t) - d)/(u-d)

#Matrix to store current asset price
S_matrix = np.zeros([n,n])
#Setting the first assest price
S_matrix[0,0] = initial_S0


print("\n")
print("u:",u,"d:",d, "qu",q_u,"qd",1-q_u)


#Calculating the asset price at for each interval
for j in range(1,n):
    for i in range(0,j+1):
        S_matrix[j,i] = initial_S0*(u**i)*(d**(j-i))

#Transpose the asset price martix to which would be easy to work
S_matrix = np.transpose(S_matrix)

#Matrix to store American options
optionprice_American = np.zeros([n,n])

#Matrix to store Europian options
optionprice_Europian = np.zeros([n,n])

#Payoff for europian
optionprice_Europian[:, n - 1] = [(max(1500-(x**2)+(30*x),0)) for x in S_matrix[:, n - 1]]

#Calculating the option prices europian
for j in range(n-2,-1,-1):
    for i in range(0,j+1):
        optionprice_Europian[i,j] = math.exp(-risk_free_rate*delta_t)*((q_u*optionprice_Europian[i+1,j+1])+((1-q_u)*optionprice_Europian[i,j+1]))

#Calculating the Payoff American
optionprice_American[:, n - 1] = [(max(1500-(x**2)+(30*x),0)) for x in S_matrix[:, n - 1]]

#print(optionprice_American)

#Calculating the option prices American
for j in range(n-2,-1,-1):
    for i in range(0,j+1):
        optionprice_American[i,j] = max((1500-(S_matrix[i,j]**2)+(30*S_matrix[i,j])),math.exp(-risk_free_rate*delta_t)*((q_u*optionprice_American[i+1,j+1])+((1-q_u)*optionprice_American[i,j+1])))

print("\n")
print("Assest Price:")    
print(S_matrix[:,:])
print("\n")
print("American option:")
print(optionprice_American[:,:])
print("\n")
print("Europian option:")
print(optionprice_Europian[:,:])

print("\n")
print("Optimal Option:")    

#Optimal Option:
optimal_option = np.zeros([n-1,n-1])
count = 0

#Early Exercise is optimal are nodes (j,i) and option value at optimal early exercise
for j in range(n-2,-1,-1):
    for i in range(0,j+1):
        k = max((1500-(S_matrix[i,j]**2)+(30*S_matrix[i,j])),0)
        if(max(k,optionprice_American[i,j]) <= k and k > 0 ):
            count+=1
            print("Early exercise is optimal at:",j,i,"And Option Value at this node is:",k)

print("\n")
print("Numbber of optimal early exercise:",count)