EDITED (Remade Post): определение предполагаемой волатильности американского опциона пут с использованием теоремы о делении пополам - PullRequest
1 голос
/ 30 марта 2020

Мне было дано это задание:

"Внедрить американский 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) Чего мне не хватает в моем коде для его завершения?

...