HW7

You might also like

Download as ppt, pdf, or txt
Download as ppt, pdf, or txt
You are on page 1of 24

HW7

鮑欣禾 112071469
筆記
LatticeEurCallDivP vs. LatticeAmCallDivP

import numpy as np

def LatticeEurCallDivP(S0, X, r, T, sigma, N, div):


deltaT = T / N
u = np.exp(sigma * np.sqrt(deltaT))
d=1/u
p = (np.exp(r * deltaT) - d) / (u - d)
lattice = np.zeros((N + 1, N + 1))

for j in range(N + 1):


lattice[N, j] = max(0, S0 * (u ** j) * (d ** (N - j)) * (1 - div) - X)

for i in range(N - 1, -1, -1):


for j in range(i + 1):
lattice[i, j] = np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j])

price = lattice[0, 0]
return price, lattice
LatticeEurCallDivP vs. LatticeAmCallDivP

np.set_printoptions(precision=2, suppress=True)
price, lattice =LatticeEurCallDivP(50, 50, 0.02, 1, 0.2, 10, 0.1)
print("Option price:", price)
print("\nLattice:\n",lattice)
LatticeEurCallDivP vs. LatticeAmCallDivP
import numpy as np

def lattice_am_call_div_p(S0, X, r, T, sigma, N, div, tau):


deltaT = T / N
u = np.exp(sigma * np.sqrt(deltaT))
d=1/u
p = (np.exp(r * deltaT) - d) / (u - d)
lattice = np.zeros((N + 1, N + 1))

for j in range(N + 1):


lattice[N, j] = max(0, S0 * (u ** j) * (d ** (N - j)) * (1 - div) - X)

for i in range(N - 1, tau - 1, -1):


for j in range(i + 1):
lattice[i, j] = max(S0 * u ** j * d ** (i - j) * (1 - div) - X,
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))

for i in range(tau - 1, -1, -1):


for j in range(i + 1):
lattice[i, j] = max(S0 * u ** j * d ** (i - j) * (1 - div) - X,
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))

price = lattice[0, 0]
return price, lattice
LatticeEurCallDivP vs. LatticeAmCallDivP

price, lattice = lattice_am_call_div_p(50, 50, 0.02, 1, 0.2, 10, 0.1,3)


print("Option price:", price)
print("\nLattice:\n",lattice)
多少股利美式才會 early
exercise
# Test different dividend levels
dividends = np.linspace(0.01, 0.1, 10) # Dividends from 1% to 10%
for div in dividends:
price, _ = lattice_am_call_div_p(100, 100, 0.05, 1, 0.2, 100, div, 50)
if price > 0: # If option price is greater than 0, early exercise occurs
print(f"With dividend {div:.2%}, early exercise occurs.")
break
LatticeEurPutDivP
import numpy as np

def LatticeEurPutDivP(S0, X, r, T, sigma, N, div):


deltaT = T / N
u = np.exp(sigma * np.sqrt(deltaT))
d=1/u
p = (np.exp(r * deltaT) - d) / (u - d)
lattice = np.zeros((N + 1, N + 1))

for j in range(N + 1):


lattice[N, j] = max(0, X - S0 * (u ** j) * (d ** (N - j)) * (1 - div))

for i in range(N - 1, -1, -1):


for j in range(i + 1):
lattice[i, j] = np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j])

price = lattice[0, 0]
return price, lattice
LatticeEurPutDivP
np.set_printoptions(precision=2, suppress=True)
price, lattice = LatticeEurPutDivP(50, 50, 0.02, 1, 0.2, 10, 0.1)
print("Option price:", price)
print("\nLattice:\n", lattice)
LatticeEurCallDivD vs. LatticeAmCallDivD
import numpy as np

def LatticeEurCallDivD(S0, X, r, T, sigma, N, D, tau):


deltaT = T / N
u = np.exp(sigma * np.sqrt(deltaT))
d=1/u
p = (np.exp(r * deltaT) - d) / (u - d)
S0a = S0 - D * np.exp(-r * tau * deltaT)
lattice = np.zeros((N + 1, N + 1))

for j in range(N + 1):


lattice[N, j] = max(0, S0a * (u ** j) * (d ** (N - j)) - X)

for i in range(N - 1, tau - 1, -1):


for j in range(i + 1):
lattice[i, j] = max(S0a * u ** j * d ** (i - j) - X,
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))
LatticeEurCallDivD vs. LatticeAmCallDivD

for i in range(tau - 1, -1, -1):


for j in range(i + 1):
lattice[i, j] = max(S0a * u ** j * d ** (i - j) - X + D * np.exp(-r * (tau - i) * deltaT),
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))

price = lattice[0, 0]
return price, lattice

np.set_printoptions(precision=2, suppress=True)
price, lattice =LatticeEurCallDivD(50, 50, 0.02, 1, 0.2, 10, 5, 3)
print("Option price:", price)
print("\nLattice:\n", lattice)
LatticeEurCallDivD vs. LatticeAmCallDivD
import numpy as np

def LatticeAmCallDivD(S0, X, r, T, sigma, N, D, tau):


deltaT = T / N
u = np.exp(sigma * np.sqrt(deltaT))
d=1/u
p = (np.exp(r * deltaT) - d) / (u - d)
S0a = S0 - D * np.exp(-r * tau * deltaT)
lattice = np.zeros((N + 1, N + 1))

for j in range(N + 1):


lattice[N, j] = max(0, S0a * (u ** j) * (d ** (N - j)) - X)

for i in range(N - 1, tau - 1, -1):


for j in range(i + 1):
lattice[i, j] = max(S0a * u ** j * d ** (i - j) - X,
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))
LatticeEurCallDivD vs. LatticeAmCallDivD

for i in range(tau - 1, -1, -1):


for j in range(i + 1):
lattice[i, j] = max(S0a * u ** j * d ** (i - j) - X + D * np.exp(-r * (tau - i) * deltaT),
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))
lattice[i, j] = max(lattice[i, j], S0a * (u ** j) * (d ** (i - j)) - X) # Early exercise

price = lattice[0, 0]
return price, lattice

price, lattice = LatticeAmCallDivD(50, 50, 0.02, 1, 0.2, 10, 5, 3)


print("Option price:", price)
print("\nLattice:\n", lattice)
LatticeEurPutDivD
import numpy as np

def lattice_eu_put_div_d(S0, X, r, T, sigma, N, D, tau):


deltaT = T / N
u = np.exp(sigma * np.sqrt(deltaT))
d=1/u
p = (np.exp(r * deltaT) - d) / (u - d)
S0a = S0 - D * np.exp(-r * tau * deltaT)
lattice = np.zeros((N + 1, N + 1))

for j in range(N + 1):


lattice[N, j] = max(0, X - S0a * (u ** j) * (d ** (N - j)))

for i in range(N - 1, tau - 1, -1):


for j in range(i + 1):
lattice[i, j] = max(X - S0a * u ** j * d ** (i - j),
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))
LatticeEurPutDivD
for i in range(tau - 1, -1, -1):
for j in range(i + 1):
lattice[i, j] = max(X - S0a * u ** j * d ** (i - j) - D * np.exp(-r * (tau - i) * deltaT),
np.exp(-r * deltaT) * (p * lattice[i + 1, j + 1] + (1 - p) * lattice[i + 1, j]))

price = lattice[0, 0]
return price, lattice

price, lattice = lattice_eu_put_div_d(50, 50, 0.02, 1, 0.2, 10, 5,3)


print("Option price:", price)
print("\nLattice:\n",lattice)
TriEurPut
import numpy as np
import pandas as pd

def tri_eur_put(S0, X, r, T, sigma, N, lamda):


deltaT = T / N
u = np.exp(lamda * sigma * np.sqrt(deltaT))
d=1/u
pu = 1 / (2 * lamda**2) + (r - (sigma**2 / 2)) * np.sqrt(deltaT) / (2 * lamda * sigma)
pm = 1 - 1 / (lamda**2)
pd = 1 - pu - pm
lattice = np.zeros((N + 1, 2 * N + 1))

for j in range(1, N + 2):


lattice[N, j - 1] = max(0, X - S0 * (d**(N - j + 1)))

for j in range(N + 2, 2 * N + 2):


lattice[N, j - 1] = max(0, X - S0 * (u**(j - N - 1)))
TriEurPut
for i in range(N - 1, -1, -1):
for j in range(1, 2 * i + 2):
lattice[i, j - 1] = np.exp(-r * deltaT) * (
pd * lattice[i + 1, j - 1] +
pm * lattice[i + 1, j] +
pu * lattice[i + 1, j + 1]
)

price = lattice[0, 0]
return price, lattice

price, lattice = tri_eur_put(100, 100, 0.05, 1, 0.2, 100, 0.5)

df_lattice = pd.DataFrame(lattice)
print("Price:", price)
print("Lattice:")
print(df_lattice)
TriEurPut
TriEurPut
TriAmPut
import numpy as np
import pandas as pd

def tri_am_put(S0, X, r, T, sigma, N, lamda):


deltaT = T / N
u = np.exp(lamda * sigma * np.sqrt(deltaT))
d=1/u
pu = 1 / (2 * lamda**2) + (r - (sigma**2 / 2)) * np.sqrt(deltaT) / (2 * lamda * sigma)
pm = 1 - 1 / (lamda**2)
pd = 1 - pu - pm
lattice = np.zeros((N + 1, 2 * N + 1))

for j in range(1, N + 2):


lattice[N, j - 1] = max(0, X - S0 * (d**(N - j + 1)))

for j in range(N + 2, 2 * N + 2):


lattice[N, j - 1] = max(0, X - S0 * (u**(j - N - 1)))
TriAmPut
for i in range(N - 1, -1, -1):
for j in range(1, 2 * i + 2):
exercise_value = X - S0 * (d**(i - j + 1)) # 立即行权价值
continuation_value = np.exp(-r * deltaT) * (pd * lattice[i + 1, j - 1] +
pm * lattice[i + 1, j] +
pu * lattice[i + 1, j + 1]) # 持有到期的期权价值
lattice[i, j - 1] = max(exercise_value, continuation_value)
price = lattice[0, 0]
return price, lattice

price, lattice = tri_am_put(80, 100, 0.05, 1, 0.2, 100, 0.5)


df_lattice = pd.DataFrame(lattice)
print("Price:", price)
print("Lattice:")
print(df_lattice)
TriAmPut
TriAmPut
CompBlsBinTri.m
for i=(1:N)
[LatticeC1(i),tree1] = LatticeEurCall(S0,X,r,T,sigma,i);
[LatticeC2(i),tree2] = TriEurCall(S0,X,r,T,sigma,i,lamda);
end
plot(1:N, ones(1,N)*BlsC);
hold on; 4.8

4.6
plot(1:N, LatticeC1);
4.4

plot(1:N, LatticeC2); 4.2

3.8

3.6

3.4

3.2
0 10 20 30 40 50 60 70

You might also like