#python #python-3.x #function #math #quantitative-finance
#python #python-3.x #функция #математика #количественный-финансы
Вопрос:
Я пытаюсь закодировать
Он работает хорошо, когда calc_spotRate(1)
, но выдает ошибку, когда дело доходит до calc_spotRate(2)
import math
unit_tenor = [3, 6, 9, 12, 18]
tenor_spot = [0.25, 0.50, 0.75, 1.00, 1.5]
ytm = [0.0346, 0.0354, 0.0359, 0.0361, 0.0369]
spot_rate = []
def calc_spotRate(i):
sum = 0
for x in range(0, i 1):
if x == 0:
SpotRate = (1/ tenor_spot[x]) * (math.log(1 tenor_spot[x] * ytm[x]))
spot_rate.append(SpotRate)
else:
for x in range(1, i 1):
sum = ytm[x] math.exp(-1 * tenor_spot[0] * spot_rate[x-1])
SpotRate = (1/tenor_spot[i]) * (math.log((1 tenor_spot[0] ytm[i]) / (1 - tenor_spot[0] * sum)))
spot_rate.append(SpotRate)
calc_spotRate(2)
pring(spot_rate)
Ошибка IndexError: список индексов вне диапазона
calc_spotRate(2)
предполагается, что результат 0.037 (приблизительно)
Комментарии:
1. Я проверил значения spot_rate и x прямо перед строкой 17 (ошибка). spot_rate не изменяет размер в этом цикле for , поэтому у spot_rate есть один элемент, поэтому spot_rate[2-1] не является допустимым индексом.
2. Во всей остальной части spot_rate имеет один элемент внутри. Однако, когда i= 2, на второй итерации цикла внутри else вы запрашиваете второй элемент списка. Которого, конечно, не существует, поэтому вы получаете сообщение об ошибке. Вы могли бы устранить ошибку, изменив spot_rate[x-1] на spot_rate [0] . Я не проверял результат этого, так что, возможно, это вам не подходит
3. итак .. я немного изменил код, с
sum = ytm[x] math.exp(-1 * tenor_spot[0] * spot_rate[x-1])
наsum = ytm[x] math.exp(-1 * tenor_spot[0] * spot_rate[0])
. он не выдает ошибку, но результат дает неправильный ответ. Не могли бы вы сказать мне, что не так с моим кодом? Я думаю, что мой код и приведенная выше функция совпадают..4. Перед exp у вас есть вместо * может быть, это так
Ответ №1:
Как и в случае ошибки, проблема в том, что вы вызываете элемент в списке, который не существует, индекс находится вне диапазона. Посмотрите на следующую строку:
for x in range(1, i 1):
sum = ytm[x] math.exp(-1 * tenor_spot[0] * spot_rate[x-1])
и следуйте за мной. Как i=2
, x
будет между 1...3
, не включая 3
.
Теперь, когда x=2
вы будете пытаться получить доступ spot_rate[1]
к желанию, его нет в списке. Это пройдет сразу после x
того, как значение on в первом цикле будет равно 1, когда оно достигнет предложения else .
ПРИМЕЧАНИЕ: я думаю, что вы должны называть переменные в первом и втором цикле по-разному. В противном случае это вызовет у вас много путаницы.
Комментарии:
1. Привет, спасибо за совет. о записке… вы имеете в виду «x» во втором цикле for?
2. Да, точно, по крайней мере, для меня, это то, что вызвало у меня больше проблем с отслеживанием.
3. итак .. я немного изменил код, с
sum = ytm[x] math.exp(-1 * tenor_spot[0] * spot_rate[x-1])
наsum = ytm[x] math.exp(-1 * tenor_spot[0] * spot_rate[0])
. он не выдает ошибку, но результат дает неправильный ответ. Не могли бы вы сказать мне, что не так с моим кодом? Я думаю, что мой код и приведенная выше функция совпадают..