Мне было дано это задание:
"Внедрить американский Al go. И бисексуальный Al go., Чтобы найти подразумеваемую волатильность опции со следующими параметрами,
dt = T/N (delta t)
R = 0.03 (continuously compounded)
u= 1/d (up factor)
N=4
S0 = 100 (starting price)
T= 1.0 (time)
K = 100 (strike price)
[sigma 'a', sigma 'b'] = [0.10, 0.40]
Остановите все go., Когда разница между наблюдаемой ценой опциона и опцией модели меньше, чем эпсилон = 10 ^ -4. Сообщите о биномиальной подразумеваемой волатильности для этого американского опциона. ".
На бумаге я знаю, как применить теорему о делении пополам и решить эту проблему (т.е. если мне дали, скажем, 2 итерации). Тем не менее, я только начал изучать python пару месяцев go и немного борюсь.
До сих пор, после того, как мы много читали в Интернете и читали книги, многие программы используют модель Блэка-Шоулза (которую мой профессор не хочет, чтобы мы использовали). Мне удалось придумать этот код, большая часть которого пришла из «Аналитики деривативов с Python Ива Хилпиша».
import math
import numpy as np
def set_parameters(otype = 1, M=4): # M = N
otype: int
if otype ==1:
S0 = 100
T = 1
r = 0.03
sigmaA = 0.10
sigmaB = 0.40
sigmaC = ((sigmaA+sigmaB)/2)
dt = T/M #Time interval
df = math.exp(-r*dt) #Discount factor
u = math.exp(sigmaC*math.sqrt(dt)) #up factor
d = 1/u #down factor
p=(math.exp(r*dt) - d) /(u-d)
return S0, T, r, sigmaC, M, dt, df, u, d, p
def inner_value(S, otype=1):
otype: int
if otype ==1:
return np.maximum(100-S, 0)
def CRR_option_valuation(otype, M=4):
S0, T, r, sigmaC, M, dt, df, u, d, p = set_parameters(otype, 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 backwards induction
h = inner_value(S, otype) #Inner value matrix
V = inner_value(S, otype) #value matrix
C = np.zeros((M+1, M+1), dtype = np.float)
ex = np.zeros((M+1, M+1), dtype=np.float) #Exercise matrix
z = 0
for i in range(M-1, -1, -1):
C[0:M-z, i] = (p*V[0:M-z, i+1] + (1-p)*V[1:M-z+1, i+1])*df
V[0:M-z, i] = np.where(h[0:M-z, i] > C[0:M-z, i], h[0:M-z, i], C[0:M-z, i])
ex[0:M-z, i] = np.where(h[0:M-z,i] > C[0:M-z, i], 1, 0)
z+=1
return V[0,0]
Мои вопросы:
1) Почему ничего не выводится в конце этой программы? (Или просто я не даю python времени на запуск)
2) Нужно ли создавать другую функцию для использования теоремы о делении пополам. Т.е. если V (0,0) <или> исходная наблюдаемая цена $ 9,25, параметры волатильности изменятся).
3) Чего мне не хватает в моем коде для его завершения?