Текущий архив: 2008.06.22;
Скачать: CL | DM;
Вниз
Помогите с формулой расчета аннуитета&#133 Найти похожие ветки
← →
Kolan © (2008-05-02 00:22) [0]Здравствуйте,
Не могу понять где ошибка, наверно в формулах…
1. Есть формула расчета аннуитета. Формула «А».function EvalMonthPercent(AYearPercent: Integer): Double;
begin
Result := (AYearPercent / 12) / 100;
end;function EvalAnnua(ACreditSize: Currency; AYearPercent: Integer; AMonthPeriod: Integer): Currency;
var
Numerator, Denominator: Double;
MonthPercent: Double;
begin
Result := 0;
MonthPercent := EvalMonthPercent(AYearPercent);
Numerator := Power(1 + MonthPercent, AMonthPeriod) * MonthPercent;
Denominator := Power(1 + MonthPercent, AMonthPeriod) — 1;
if Denominator <> 0 then
Result := ACreditSize * (Numerator / Denominator);
end;
В ней особых сомнений нет, взял из экселевского файла из банка.
В экселе она выглядела так:=F4*((1+F6/12)^F5*F6/12)/((1+F6/12)^F5-1)
Она дает такой расчет:
Сумма кредита
2 797 689р.
Дата
25.03.2008
Дата выплаты Остаток Гашение Проценты Аннуитет
25.04.2008 2 769 412,15р. 28 276,85р. 44 296,74р. 72 573,59р.
…Ну и так далее…
А есть еще вот такая формула: Формула «Б».function EvalPariodCreditPercent(ACurrentBalance: Currency; AYearPercent: Integer;
LastPaymentDate, CurrentDate: TDateTime): Currency;
var
DayPercent: Double;
DaysCount: Integer;
begin
DayPercent := (AYearPercent / 365)/100;
DaysCount := DaysBetween(CurrentDate, LastPaymentDate);
Result := (ACurrentBalance * DayPercent) * DaysCount;
end;
Она вычисляет проценты набежавшие с прошлого платежа.
Проблемма вот в чем. Человек приходит платить 25.04.2008 и платит 72 573,59р.(точно аннуитет).
Так вот Формула «Б» расчитывает проценты не так как та, что в аннуитете.
Получается:Дата выплаты Остаток Гашение Проценты
25.04.2008 2 770 261,68р. 27 427,32р. 45 146,27р.
Если сравнить:Остаток Гашение Проценты
«А» 2 769 412,15р. 28 276,85р. 44 296,74р.
«Б» 2 770 261,68р. 27 427,32р. 45 146,27р.
Получается разница в —849,53р. То есть человек как-бы не доплатил, хотя заплатил правильно.
* Сумма бывает разной как в плюс, так и в минус.
Вопросы:
1. Что не так с формулой «Б»? — очень хочется понять откуда разница.
2. Можноли изменить формулу «Б», чтобы она работала правильно и как?
3. Если 2 невозможно, то где взять описание сценариев работы банка, например, при работе с кредитами.
← →
Palladin © (2008-05-02 00:27) [1]интересно... а ты не забыл что год високосный? или это не влияет на расчеты?
← →
Тимохов (2008-05-02 00:29) [2]чо-то это круто слишком для форума :) имхо
я бы постарался проблему выделить более узко.
← →
Kolan © (2008-05-02 00:29) [3]> интересно… а ты не забыл что год високосный? или это не
> влияет на расчеты?
Незнаю, ты думаешь дело вDayPercent := (AYearPercent / 365)/100;
? Пробовал и 364 ставить суммы несхождения меняется, но незначительно — рублей на сто в данном примере…
Или ты о чем?
← →
Kolan © (2008-05-02 00:31) [4]> я бы постарался проблему выделить более узко.
Рад бы с узить, но как?
У меня по этому поводу есть печальное подозрение, но пока хочу послушать мнение уважаемых посетителей форума…
← →
Palladin © (2008-05-02 00:31) [5]366 дней, а не 364. просто это первое что мне в глаза бросилось...
← →
Тимохов (2008-05-02 00:32) [6]Ну вот одна из претензий.
Я знал, что есть аннуитет, но забыл. Т.е. надо бы меня посветить в предметную область.
← →
Palladin © (2008-05-02 00:37) [7]еще проблема может быть в работе DaysBitween... может для верного расчета нужно на один день больше...
← →
ага-2 (2008-05-02 00:40) [8]
> Kolan ©
> Palladin © (02.05.08 00:31) [5]
В dateutils есть функции для точных вычислений.
← →
Тимохов (2008-05-02 00:41) [9]
> if Denominator <> 0 then
а 0 всегда точно представляется в Double (просто не помню)?
← →
Kolan © (2008-05-02 00:42) [10]> 366 дней, а не 364. просто это первое что мне в глаза бросилось…
Я же говорю это не то, при 366 получается —726,18р…
> Т.е. надо бы меня посветить в предметную область.
Это связано с кредитами, банковским делом. Все просто, но названия и понятия надо знать.
АННУИТЕТОМ является ежемесячная/ежегодная денежная сумма определенного размера, выплачиваемая кредитору в погашение по лученного от него займа, включая проценты.
http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%BD%D1%83%D0%B8%D1%82%D0%B5%D1%82
То есть если ты взял кредит, то каждый месяц должен платит аннуитет.
Но от месяца к месяцу проценты и гашение в аннуитете распределяется поразному. Сначала много отдаем процентов, в конце, на оборот, мало процентов и много гасим…
В конкр примере:Взносы Сальдо Гашение осн. долга Проценты за кредит Аннуитет
1 2 769 412,15 28 276,85 44 296,74 72 573,59
2 2 740 687,58 28 724,57 43 849,03 72 573,59
3 2 711 508,20 29 179,37 43 394,22 72 573,59
4 2 681 866,82 29 641,38 42 932,21 72 573,59
5 2 651 756,12 30 110,70 42 462,89 72 573,59
6 2 621 168,66 30 587,46 41 986,14 72 573,59
7 2 590 096,91 31 071,76 41 501,84 72 573,59
8 2 558 533,18 31 563,73 41 009,87 72 573,59
9 2 526 469,69 32 063,49 40 510,11 72 573,59
10 2 493 898,54 32 571,16 40 002,44 72 573,59
11 2 460 811,67 33 086,87 39 486,73 72 573,59
12 2 427 200,92 33 610,74 38 962,85 72 573,59
итд на 60 мес.
← →
Тимохов (2008-05-02 00:43) [11]Вообще, старик, завязывай для экономических рассчетов с double и прочими плавающими точками.
Юзай vartype = 14 (в дельфи, нет, но есть в ole32.dll).
Прикинь 18 знаков до запятой, 10 после. Все вычисления точные (т.е. это просто целые, но со сдвинутой точкой). С учетом д2007 можно наладить прегрузку операторов.
Если интересно, пиши, аська есть вроде.
← →
ага-2 (2008-05-02 00:43) [12]
> Kolan © (02.05.08 00:42) [10]
>
> > 366 дней, а не 364. просто это первое что мне в глаза
> бросилось…
>
> Я же говорю это не то, при 366 получается —726,18р…
см. [8]
← →
Kolan © (2008-05-02 00:47) [13]> еще проблема может быть в работе DaysBitween… может для
> верного расчета нужно на один день больше…
>dateutils есть функции для точных вычислений.
Ровно считает…
Поигрался
Добавил к сроку, дней Ошибка
0 —726,18р.
-1 +726,17р.
+1 —2 178,53р
Это с учетом 366 дней…
Вроде не тут косяк.
>
> а 0 всегда точно представляется в Double (просто не помню)?
А какая разница, лиш бы деления на 0 небыло :)
← →
Хы) (2008-05-02 00:49) [14]
> Тимохов (02.05.08 00:43) [11]
>
> Вообще, старик, завязывай для экономических рассчетов с
> double и прочими плавающими точками.
>
> Юзай vartype = 14 (в дельфи, нет, но есть в ole32.dll).
>
> Прикинь 18 знаков до запятой, 10 после. Все вычисления точные
> (т.е. это просто целые, но со сдвинутой точкой). С учетом
> д2007 можно наладить прегрузку операторов.
На кой? Для экономических расчетов стандартных типов за глаза хватает.
Уж поверь, на практике испытано.
p.s.
Чет меня напрочь банят... Ну чтож, мастера, удачи в запуздыривании. Адью.
← →
Kolan © (2008-05-02 00:49) [15]> Вообще, старик, завязывай для экономических рассчетов с
> double и прочими плавающими точками.
Юзаю везде где надо Currency а где подозрение что не так? Это не повлияет на сабж, но будет полезно…
> см. [8]
Подскажи какие?
← →
Тимохов (2008-05-02 00:49) [16]
> > а 0 всегда точно представляется в Double (просто не помню)?
ну... типа вещественные числа они такие, загадочные.
почитай антона григорьвева на королевтсве
"Неочевидные особенности вещественных чисел".
← →
Тимохов (2008-05-02 00:50) [17]С вещ. числами надо быть осторожным. Я не помню точно, но где-то (в Extended или double) 0 представялется точно, а где-то - нет.
← →
Kolan © (2008-05-02 00:50) [18]> На кой? Для экономических расчетов стандартных типов за
> глаза хватает.
Видали мы округления до 0.0000001 при каждом движении, «чтобы не потерять копейки»… Double и впрям нельзя…
← →
Kolan © (2008-05-02 00:51) [19]>
> почитай антона григорьвева на королевтсве
>
> «Неочевидные особенности вещественных чисел».
Читал ессно.
← →
Тимохов (2008-05-02 00:51) [20]попробуй заменить на сравнение с нулем на сравнение с дельтой.
← →
DrPass © (2008-05-02 00:52) [21]А ничего, что в первой формуле расчет процентов идет по месяцам (которые полагаются равными 1/12 года), а во второй - по дням (при этом каждый месяц имеет столько дней, сколько и должен)?
> Вопросы:
> 1. Что не так с формулой «Б»? — очень хочется понять откуда
> разница.
> 2. Можноли изменить формулу «Б», чтобы она работала правильно
> и как?
> 3. Если 2 невозможно, то где взять описание сценариев работы
> банка, например, при работе с кредитами.
Это формула для начисления процентов при убывающей схеме, и она просто неприменима к аннуитетной схеме. В случае аннуитета сумму к выплате в следующем периоде надо рассчитать сразу вместе с процентами перед началом периода, а не разбивать по дням. В вашем банке вообще существует отдел, который занимается методологией?
← →
Kolan © (2008-05-02 00:52) [22]> С вещ. числами надо быть осторожным.
Я их и не пользую для денегvar
DayPercent: Double;
…
begin
DayPercent := (AYearPercent / 365)/100;
Тут то не деньги — это процент в год, он измеряется в процентах :)
← →
Тимохов (2008-05-02 00:52) [23]
> Kolan © (02.05.08 00:51) [19]
> > > почитай антона григорьвева на королевтсве> > «Неочевидные
> особенности вещественных чисел».Читал ессно.
если читал, тады не можешь говорить "какая разница" ибо должен понимать, что сравнивать числа с п.т. на равенство или неравенство незя.
← →
Kolan © (2008-05-02 00:53) [24]> попробуй заменить на сравнение с нулем на сравнение с дельтой.
Да это просто защита от деления на 0 и ничего больше…
← →
Kolan © (2008-05-02 00:55) [25]> В вашем банке вообще существует отдел, который занимается
> методологией?
В банке мну не работает ессно :). Так что нет :).
Это формула для начисления процентов при убывающей схеме, и она просто неприменима к аннуитетной схеме.
Вот блин, я так и знал что оно и то и то правильно работает, только оно несовместимы. Это и были мои грусные подозрения…
Где можно узнать как правильно работать с «аннуитетной схемой»?
← →
Kolan © (2008-05-02 00:56) [26]> который занимается методологией?
Мне какую нибудь бы стандартную… Или самую распространенную…
← →
Kolan © (2008-05-02 01:02) [27]> если читал, тады не можешь говорить «какая разница» ибо
> должен понимать, что сравнивать числа с п.т. на равенство
> или неравенство незя.
Ну как же нельзя, ну будет там 0.00000000000000000000000012, ну и что? Ошибки деления не будет — вот и славно.
← →
Павел Калугин © (2008-05-02 12:08) [28]> [0] Kolan © (02.05.08 00:22)
берем лист бумаги и тестовые примеры.
1. решаем все на бумаге как надо (совместно со специалистом кредитчиком)
2. кодируем точно так как на бумаге.
3. прогоняем рукаим тестовый пример по коду. то есть все что должен слделать комп делаем на бумаге ручкой.
4. если цифири сходятся тогда начинаем вводить данные и проверять. если не сходятся то сравнивая с бумажным расчетом четко видим где и почему
СОвет
1. выяснить у кредитчиков длину года. может от договора зависеть.
2. псмотреть на DaysCount. Если оно вычисляется а еще если как datediff то оно наверняка отличается от нужного
← →
Kolan © (2008-05-02 12:11) [29]> 1. решаем все на бумаге как надо (совместно со специалистом
> кредитчиком)
Вот это и есть сабж в принципе. Можно где нить без специалиста взять его знания?
← →
Kolan © (2008-05-02 13:04) [30]Все таки интересно, окуда же разница появляется… Ворде не в днях дело…
← →
Павел Калугин © (2008-05-02 15:24) [31]> [29] Kolan © (02.05.08 12:11)
Аннуитет это выплата равными долями?
прницип рассказать можно. методику рассчета искать в гугле.
есть еще хороший форум где можно порытся - банкир ру
Раньше тут ВовчикА был мог дктально расписать но давно его я не видел.
← →
Kolan © (2008-05-02 18:44) [32]>
> Аннуитет это выплата равными долями?
Да, ты ветку читал?
> методику рассчета искать в гугле.
Методику расчета я знаю. Я хочу узнать как погашать, как определять просрочки, какие еще есть там операции…
> есть еще хороший форум где можно порытся — банкир ру
Ок гляну.
> Раньше тут ВовчикА был мог дктально расписать но давно его
> я не видел.
Поищю его, благодарю за наводку :)
← →
Павел Калугин © (2008-05-02 20:25) [33]> [32] Kolan © (02.05.08 18:44)
Читал, уточнил верно ли понял:)
> Я хочу узнать как погашать, как определять просрочки, какие
> еще есть там операции…
К тому кто тебе эту разработку заказал, ибо кроме того, что есть общие правила, есть и куча индивидуальных нюансов.
как опреелять просрочку. Взять в руки бумагу, карандаш, календарь и часы и детально описать как определять просрочено и на сколько
А как потом гасить пеню? от заплатил чел на 3 дня позже и что? у него же вся схнма выплат едет А если дополнительно кусок основного долга погасил?
так что к тому кто этот .. хмм.. гиморой заказал пусть детально ставит задачу применительно к конкретному кредиткому подразделению конктретного винансового учреждения
← →
Дмитрий С (2008-05-02 20:36) [34]Сильно не вчитывался, но, может причина в том, что в верхней функции расчитывается часть годового процента раз в месяц, а в другой раз в сутки?
← →
Дмитрий С (2008-05-02 20:48) [35]Хотя, я думаю правильно бы так (чтобы без обмана народа):
К примеру сумма 3000, под 15% годовых на 3 года:
Через три года должно быть выплачено:
Вычисляем процент раз в год: 3000 * 1.15 * 1.15 * 1.15 = 4562,625
А как дела обстоят сейчас обычно:
15% делим на 12 месяцев, получаем 1,25% в месяц.
Вычисляем процент каждый месяц:
3000 * (1.0125^36) = 4691,8314...
А если вычислять каждые сутки, получаем:
15% / 365.25 ~= 0,04106776180698151950718685832% в сутки.
Вычисляем процент каждые сутки:
3000 * (1,0004106776180698151950718685832^(365.25*3)) ~= 4704,50
Думаю причина в том, что количество набежавших процентов зависит от частоты вычисления процента :)
← →
Павел Калугин © (2008-05-04 02:14) [36]> [35] Дмитрий С (02.05.08 20:48)
Делим обязательно на количество дней. Суммы за февраль и за март разные.
а вот длина года это или в нормативке или в правилах принятых в организации или в договоре смотреть (варианты 360, 365, по календарю)
← →
Дмитрий С (2008-05-04 10:15) [37]
> Делим обязательно на количество дней. Суммы за февраль и
> за март разные.
Интересно, а почему тогда по вкладам проценты начисляются иначе? И там и там ведь сказано "годовых". Имхо, проценты начисляются за год, а не за каждый день, по крайней мере должны.
> а вот длина года это или в нормативке или в правилах принятых
> в организации или в договоре смотреть (варианты 360, 365,
> по календарю)
Я 365.25 взял для примера. Если немного изменить это число, суть не поменяется.
← →
data © (2008-05-04 10:56) [38]Kolan ©
Советую еще раз проконсультироваться с заказчиками, а лучше потребовать от них полное ТЗ с формулами расчетов. Это не дело программиста разбираться в структуре ануитента. Эта структура должна быть четко расписана бизнес аналитиками и утверждена.
Тоже самое по поводу расчета просрочки. Требуйте формулы, не экселевские, а четко прописанные на бумаге в ТЗ. Это денежные расчеты, требующие четкости постановки задачи заказчиком. Кроме того, ТЗ с формулами будет основой для проведения процедуры тестирования.
Вот какие моменты вами вообще упущены:
Во-первых, кроме процентов по кредиту может быть еще: комиссия, страховка, комиссия за страховку. Страховые деньги могут взыматься как одноразово, так и входить в ануитентный платеж. Советую почитать оферту, которую банк выдает потребителю, там должно быть все написано касательно страховки и просрочки. Оферта и условия всех выплат могут меняться для разных кредитных продуктов. Меняться от продукта к продукту может процент штрафа, размер комиссии и пр.
Во-вторых, сама структура ануитента может меняться от платежа к платежу. Поясню на примере:
Допустим, ануитент составляет 1000 руб. Из них по платежам:
Номер платежа Процент за польз. Процент погашения тела кредита
1 700 300
2 650 350
3 600 400
...
и т.п
Таким образом, кредитная организация в первую очередь взимает процент, потом само тело. Это очень распространенная практика.
Проблемы високосных годов, округлений и тп. - тоже к бизнесу и через ТЗ.
← →
KSergey © (2008-05-04 12:49) [39]И, главное, четко прописать в какой именно момент после/до/во время каждой формулы проводить округление до копеек.
← →
vrem_ (2008-05-04 12:53) [40]здравствуйте, скажите - аннуитет уже рассчитан?
:)
Страницы: 1 2 вся ветка
Текущий архив: 2008.06.22;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.02 c