# # Call Option Pricing with Circular Convolution (Simple) # 06_fou/call_convolution.py # # (c) Dr. Yves J. Hilpisch # Derivatives Analytics with Python # import math import numpy as np from convolution import revnp, convolution # Parameter Definitions M = 4 # number of time steps dt = 1.0 / M # length of time interval r = 0.05 # constant short rate C = [49.18246976, 22.14027582, 0, 0, 0] # call payoff at maturity q = 0.537808372 # martingale probability qv = np.array([q, 1 - q, 0, 0, 0]) # probabilitiy vector filled with zeros # Calculation V = np.zeros((M + 1, M + 1), dtype=np.float) V[M] = C for t in range(M - 1, -1, -1): V[t] = convolution(V[t + 1], revnp(qv)) * math.exp(-r * dt) print "Value of the Call Option %8.3f" % V[0, 0]
# Call Option Pricing with Circular Convolution (General) import numpy as np from convolution import revnp, convolution from parameters import * # Parameter Adjustments M = 3 #numberoftimesteps dt, df, u, d, q = get_binomial_parameters(M) # Array Generation for Stock Prices mu = np.arange(M + 1) mu = np.resize(mu, (M + 1, M + 1)) md = np.transpose(mu) mu = u**(mu - md) md = d**md S = S0 * mu * md # Valuation V = np.maximum(S - K, 0) qv = np.zeros((M + 1), dtype=np.float) qv[0] = q qv[1] = 1 - q for t in range(M - 1, -1, -1): V[:, t] = convolution(V[:, t + 1], revnp(qv)) * df print("Value of the Call Option %8.3f" % V[0, 0])
import numpy as np from numpy.fft import fft, ifft from convolution import revnp from parameters import * # Parmeter Adjustments M = 3 # number of time steps dt, df, u, d, q = get_binomial_parameters(M) # Array Generation for Stock Prices mu = np.arange(M + 1) mu = np.resize(mu, (M + 1, M + 1)) md = np.transpose(mu) mu = u ** (mu - md) md = d ** md S = S0 * mu * md # Valuation by fft CT = np.maximum(S[:, -1] - K, 0) qv = np.zeros(M + 1, dtype=np.float) qv[0] = q qv[1] = 1 - q C0_a = fft(math.exp(-r * T) * ifft(CT) * ((M + 1) * ifft(revnp(qv))) ** M) C0_b = fft(math.exp(-r * T) * ifft(CT) * fft(qv) ** M) C0_c = ifft(math.exp(-r * T) * fft(CT) * fft(revnp(qv)) ** M) # Results Outpu print "Value of European option is %8.3f" % np.real(C0_a[0]) print "Value of European option is %8.3f" % np.real(C0_b[0]) print "Value of European option is %8.3f" % np.real(C0_c[0])
import math import numpy as np from numpy.fft import fft, ifft from convolution import revnp from parameters import * # Parmeter Adjustments M = 3 # number of time steps dt, df, u, d, q = get_binomial_parameters(M) # Array Generation for Stock Prices mu = np.arange(M + 1) mu = np.resize(mu, (M + 1, M + 1)) md = np.transpose(mu) mu = u ** (mu - md) md = d ** md S = S0 * mu * md # Valuation by fft CT = np.maximum(S[:, -1] - K, 0) qv = np.zeros(M + 1, dtype=np.float) qv[0] = q qv[1] = 1 - q C0_a = fft(math.exp(-r * T) * ifft(CT) * ((M + 1) * ifft(revnp(qv))) ** M) C0_b = fft(math.exp(-r * T) * ifft(CT) * fft(qv) ** M) C0_c = ifft(math.exp(-r * T) * fft(CT) * fft(revnp(qv)) ** M) # Results Outpu print("Value of European option is %8.3f" % np.real(C0_a[0])) print("Value of European option is %8.3f" % np.real(C0_b[0])) print("Value of European option is %8.3f" % np.real(C0_c[0]))
# 06_fou/call_convolution_general.py # # (c) Dr. Yves J. Hilpisch # Derivatives Analytics with Python # import numpy as np from convolution import revnp, convolution from parameters import * # Parmeter Adjustments M = 3 # number of time steps dt, df, u, d, q = get_binomial_parameters(M) # Array Generation for Stock Prices mu = np.arange(M + 1) mu = np.resize(mu, (M + 1, M + 1)) md = np.transpose(mu) mu = u ** (mu - md) md = d ** md S = S0 * mu * md # Valuation V = np.maximum(S - K, 0) qv = np.zeros((M + 1), dtype=np.float) qv[0] = q qv[1] = 1 - q for t in range(M - 1, -1, -1): V[:, t] = convolution(V[:, t + 1], revnp(qv)) * df print("Value of the Call Option %8.3f" % V[0, 0])