#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)
andrange(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)
частичная помощь здесь