У меня возникли проблемы с кодированием математической функции (подробное объяснение)

#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]) . он не выдает ошибку, но результат дает неправильный ответ. Не могли бы вы сказать мне, что не так с моим кодом? Я думаю, что мой код и приведенная выше функция совпадают..