Как мне запустить эту функцию для нескольких значений N?

#python

#python

Вопрос:

Я пытаюсь запустить приведенный ниже код для N = np.linspace(20,250,47) , но я получаю несколько ошибок при попытке изменить N . Я новичок в python и не уверен, как получить несколько значений этой функции, используя несколько значений N. Ниже приведен код с N = 400 , и он работает, но я не уверен, как заставить его работать для нескольких N одновременно.

 import matplotlib.pyplot as plt
import numpy as np

S0 = 9
K = 10
T = 3
r = 0.06
sigma = 0.3
N = 400
dt = T / N
u = exp(sigma*sqrt(dt) (r-0.5*sigma**2)*dt)
d = exp(-sigma*sqrt(dt) (r-0.5*sigma**2)*dt)
p = 0.5

def binomial_tree_put(N, T, S0, sigma, r, K, array_out=False):
    dt = T / N
    u = exp(sigma*sqrt(dt) (r-0.5*sigma**2)*dt)
    d = exp(-sigma*sqrt(dt) (r-0.5*sigma**2)*dt)
    p = 0.5
    
    price_tree = np.zeros([N 1,N 1])

    for i in range(N 1):
        for j in range(i 1):
            price_tree[j,i] = S0*(d**j)*(u**(i-j))

    option = np.zeros([N 1,N 1])
    option[:,N] = np.maximum(np.zeros(N 1), K - price_tree[:,N])
    
    for i in np.arange(N-1, -1, -1):
        for j in np.arange(0, i 1):
            option[j, i] = np.exp(-r*dt)*(p*option[j, i 1] (1-p)*option[j 1, i 1])
            
    if array_out:
        return [option[0,0], price_tree, option]
    else:
        return option[0,0]
 

Комментарии:

1. Первое, что бросается в глаза, — это использование np.zeros(N 1) and range(N 1) в нескольких местах. Они не будут работать, если вы отправите N, который имеет более одного значения.

Ответ №1:

Предположим, у вас есть список значений N , например N = [400, 300, 500, 800] , тогда вам нужно вызвать функцию для каждого значения, для этого вы можете использовать цикл. Например,

 for num in N:
    binomial_tree_put(num, *other arguments*)
 

Ответ №2:

np.linspace() создает np.array, но функция ожидает одно целое число. Если вы хотите выполнить функцию для каждого элемента, содержащегося внутри массива / списка, вы можете сделать это внутри цикла, подобного этому:

 # your code as defined above goes here

for num in np.linspace(20,250,47):
    N = int(num)      # you could just put N in the line above - this is just to illustrate
    binomial_tree_put(N, T, S0, sigma, r, K, array_out=False)
 

Имейте в виду, в зависимости от того, сколько времени требуется для выполнения вашей функции и сколько элементов в вашей итерации (например, 47 для вашего случая), выполнение может занять некоторое время.

Редактировать: я также заметил, что вам, похоже, не хватает импорта в вашем примере кода. exp() и sqrt() являются частью math модуля.

Ответ №3:

Вы также можете использовать partial функцию, например:

 from functools import partial

N = [1, 2, ...]  # all your N values

binom_fct = partial(binomial_tree_put, T=T, S0=S0, sigma=sigma, r=r, K=K, array_out=array_out)
for num in N:
    binom_fct(num)
 

частичная помощь здесь