For-l oop для дисконтирования облигаций - PullRequest
0 голосов
/ 10 марта 2020

Быстрый вопрос о том, как написать for-l oop, чтобы дать мне текущую стоимость (то есть дисконтированную стоимость) всех купонов. Мой код выглядит следующим образом:

я хочу, чтобы for-l oop выполнял операцию

c[0]*np.exp(-r*1)
c[1]*np.exp(-r*2)
c[2]*np.exp(-r*3) 

и т. Д. (Число раз -r всегда является индексом +1) , я хочу, чтобы сумма всех значений, например, используя x + = итерацию for-l oop

c=[7.5, 7.5, 7.5, 7.5, 7.5, 7.5, 7.5]
r=0.071
PVx=0 

for i in c:
    print(i)
    year = c.index(i)+1
    print(year)
    PV=c[i]*np.exp(-r*year)
    PVx += PV 
    print(PVx)

Каким-то образом я получаю код ошибки «TypeError: индексы списка должны быть целыми числами или ломтиками, а не float» для моей PV переменной. По сути, я хочу, чтобы каждое значение в моем списке было умножено на np.exp (-r * индексная позиция +1), а затем получить сумму: S

РЕДАКТИРОВАТЬ:

My новый код

import numpy as np
c=[7.5, 7.5, 7.5, 7.5, 7.5, 7.5, 7.5]
r=0.071
PVx=0 

for i in c:
    year = c.index(i)+1
    print(year)
    PV=i*np.exp(-r*year)
    PVx += PV
    print(PVx)

продолжает печатать год как 1 (то есть c .index (i) дает 0 +1 = 1), в то время как я ожидаю, что go с 1 до 7. I угадай, что моя проблема прямо сейчас.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Мой новый код [...] продолжает печатать год как 1 (то есть c .index (i) дает 0 +1 = 1), в то время как я ожидаю, что он будет go от 1 до 7.

list.index(i) возвращает первый индекс, где появляется i, или -1, если i отсутствует в списке.


NumPy решение:

import numpy as np

r = 0.071

arr_1 = np.full(shape=7, fill_value=7.5)
print(arr_1)

arr_2 = np.exp(-r * np.arange(1, arr_1.shape[0] + 1))
print(arr_2)

arr_3 = arr_1 * arr_2
print(arr_3)
print(arr_3.sum())

Выход:

[7.5 7.5 7.5 7.5 7.5 7.5 7.5]
[0.93146189 0.86762126 0.80815614 0.75276664 0.70117344 0.65311634
 0.60835298]
[6.98596419 6.50715942 6.06117103 5.64574984 5.25880082 4.89837257
 4.56264738]
39.919865247574606

Циклическое решение:

import math
from pprint import pprint

r = 0.071

vals = [7.5 * math.exp(-r * i) for i in range(1, 8)]

pprint(vals)
pprint(sum(vals))

Выход:

[6.985964190956941,
 6.507159423644355,
 6.0611710291236625,
 5.645749835296472,
 5.258800824064293,
 4.898372565905067,
 4.562647378583822]
39.919865247574606

Я не совсем уверен, что понял, что вы пытаетесь сделать, поэтому дайте мне знать, если я что-то упустил.

0 голосов
/ 11 марта 2020

ошибка объясняет проблему: «TypeError: list indices must be integers or slices, not float» число с плавающей запятой - это число с десятичной точкой, т.е. не целое число. к экзамену 7.5. это ваша проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...