powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как реализовать в oracle расчет процентной ставки кредита?
15 сообщений из 15, страница 1 из 1
Как реализовать в oracle расчет процентной ставки кредита?
    #40093340
E_Schekaturova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, привет

Сломала голову. Необходимо сделать аналог функции SAS FINANCE('RATE',...).
Сама с математическим расчетом процентной ставки незнакома, так что методом раскопок накопала информацию тут https://www.orafaq.com/forum/t/196472/
Собственно, в большинстве случаев результат бьется с тем, что в SAS, но в одной из строк входной информации слишком большое значение ежемесячного платежа (749) при большом количестве периодов (36) и небольшим лимитом кредита (2531).

pv = 2531
pmt = 749
nper = 36
type = 0

Функция finance на этих показателях вычисляет значение ставки 0.2959042464
finance('RATE',36,749,-2531);

Подскажите, пожалуйста, как правильно посчитать ставку по кредиту? Может, есть какая-то фиксированная формула или код функции finance()

Спасибо заранее
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093343
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E_Schekaturova,

Пожалуйста покажите, как считаете (Ваш код функции), что на входе, что хотите получить, что получилось.

p.s. Используйте ТЭГ SRC для оформления.
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093386
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E_Schekaturova,


часом nper не 3?

....
stax
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093418
E_Schekaturova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Я бы сама рада, чтобы он был 3, а плановый платёж был нормального вида, так как, скорее всего, это какие-то странные данные из источника БКИ, слишком не похожие на реальность. Но SAS нормально посчитал ставку. Моя задача - перетащить в DWH расчёт показателей, которые должны в 0 биться с тем, что бизнес в SAS получил, источники данных одни и те же
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093443
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E_Schekaturova

Но SAS нормально посчитал ставку.


SAS на "оракле"? если да, то втихаря rewrap ...

.....
stax
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093483
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
E_Schekaturova

Но SAS нормально посчитал ставку.


SAS на "оракле"? если да, то втихаря rewrap ...
SAS работает на SASе .
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093485
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejnin
E_Schekaturova,

Пожалуйста покажите, как считаете (Ваш код функции), что на входе, что хотите получить, что получилось.

p.s. Используйте ТЭГ SRC для оформления.

Да.
Функцию в студию!

И тэгом SRC её код обрамить.
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093486
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E_Schekaturova,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE FUNCTION RATE (pv IN number, fv IN number, pmt IN number, nper IN number, type IN number )
    RETURN number IS rate number;
BEGIN
	DECLARE
		guess NUMBER(6,3) := .1;
		rate BINARY_DOUBLE;
		FINANCIAL_MAX_ITERATIONS NUMBER(10) := 100;
		FINANCIAL_PRECISION BINARY_DOUBLE := .000001;
		y BINARY_DOUBLE;
		y0 BINARY_DOUBLE;
		y1 BINARY_DOUBLE;
		f BINARY_DOUBLE;
		i NUMBER(10);
		x0 BINARY_DOUBLE := 0;
		x1 BINARY_DOUBLE;
BEGIN



Если у вас вот это поделие, замените все BINARY_DOUBLE на NUMBER и посмотрите, что получится.

Предполагаю, что всё станет SASa-suki чики-пуки :-)
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093491
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

И тэгом SRC её код обрамить.


для SAS-а нет SRC шаблона

.....
stax
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093556
E_Schekaturova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

Почитала всю информацию на том форуме, там были предложения на number тип изменить, делала, не помогло )

P.s. Код да, этот пробовала (пока с подставленными аргументами функцию прислать не могу, не у компьютера 🤦🏻♀)
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093735
E_Schekaturova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vadim Lejnin,

собственно, тестирую на вот этом скрипте
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
with function getInterestRate (pv in number, fv in number, pmt in number, nper in number, type in number )
    return number is rate number;
begin
	declare
		guess number(6,3) := .1;
		rate binary_double;
		financial_max_iterations number(10) := 100;
		financial_precision binary_double := .000001;
		y binary_double;
		y0 binary_double;
		y1 binary_double;
		f binary_double;
		i number(10);
		x0 binary_double := 0;
		x1 binary_double;
begin
	rate := guess;
if(abs(rate) < financial_precision) then y := pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
									else
										f := exp(nper * ln(1 + rate));
										y := pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
									end if;

y0 := pv + pmt * nper + fv;
y1 := pv * f + pmt * (1 / rate + type) * (f - 1) + fv;

i  := x0 ;
x1 := rate;

while ((abs(y0 - y1) > financial_precision) and (i < financial_max_iterations)) 
loop
    rate := (y1 * x0 - y0 * x1) / (y1 - y0);
    x0 := x1;
    x1 := rate;

    if (abs(rate) < financial_precision) then 	y := pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
										 else 
												f := exp(nper * ln(1 + rate));
												y := pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
										 end if;

    y0 := y1;
    y1 := y;
    i := i + 1;
end loop;
return rate;
end;
end;
/* select getInterestRate(15000, 0, -2000, 6, 0) as p from dual */
/* select getInterestRate(2531, 0, -749, 36, 0) as p from dual */
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093752
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E_Schekaturova
Vadim Lejnin,

собственно, тестирую на вот этом скрипте
[src PLSQL]


+ надо разобратся в "природе" чисел (за год, за месяц, ...)

можно проверить и на данных суть которых понимаете,
и можете посчитать "вручную"

.....
stax
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093922
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
E_Schekaturova,

Сделал две функции
getInterestRate - ваша без изменений
getInterestRate_number - ваша с заменой у всех переменных типа BINARY_DOUBLE на тип NUMBER

Результаты см. ниже.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select getInterestRate(15000, 0, -2000, 6, 0) as p -- BINARY_DOUBLE
     , getInterestRate_number(15000, 0, -2000, 6, 0) as p_number -- NUMBER
from dual;

P                                        P_NUMBER                                
---------------------------------------- ----------------------------------------
-,060256107498215132                     -,06025610749821503231872383198708226704


select TO_CHAR(getInterestRate(2531, 0, -749, 36, 0)) as p 
     , TO_CHAR(getInterestRate_number(2531, 0, -749, 36, 0)) as p_number 
from dual
Error report -
ORA-06502: PL/SQL:  ошибка числа или значения
ORA-06512: на  "TEST.GETINTERESTRATE", line 46


Совпадают с расчетами в Microsoft Excel
-6%
#ЧИСЛО!


Что не так?

Файл RATE.xlsx прилагается.
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093923
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Файл RATE.xlsx прилагается.
...
Рейтинг: 0 / 0
Как реализовать в oracle расчет процентной ставки кредита?
    #40093947
E_Schekaturova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL*Plus,

так с этими значениями и работала изначально :D

В общем, благодаря коду из библиотеки python, наконец-то, всё работает, как мне надо \m/
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE OR REPLACE FUNCTION fnc_g_div_gp(r in number, n in number, p in number, x in number, y in number, w in number)
    return number                    
    is

   /* Evaluate g(r_n)/g'(r_n), where g := fv + pv*(1+rate)**nper + pmt*(1+rate*when)/rate * ((1+rate)**nper - 1)*/
   
     t1  number;
     t2  number;
     g  number;
     gp  number;
     res  number;
 
   begin
     

    t1 := power((r+1),n);
    t2 := power((r+1),(n-1));
    g := y + t1 * x + p * (t1 - 1) * (r * w + 1) / r;
    gp := (n * t2 * x - p * (t1 - 1) * (r * w + 1) / (power(r,2)) + n * p * t2 * (r * w + 1) / r + p * (t1 - 1) * w/ r);
    res := g / gp;
 
   return res;
     
  end;

with function fnc_getRate(nper in number, pmt in number, pv in number, fv in number, type_ in number)
    return number                  
    is

   /* Evaluate g(r_n)/g'(r_n), where g := fv + pv*(1+rate)**nper + pmt*(1+rate*when)/rate * ((1+rate)**nper - 1)*/
 begin
    declare
        guess number(6,3) := .5;
        rate number;
        maxiter number(10) := 100;
        tol number := .000001;
        close_ number := 0;
        
        iterator  number;
        rn  number;
        rnp1  number;
        diff  number;
        g  number;
 
   begin
     
    rn := guess;
 	iterator := 0;
 	while (iterator < maxiter)
        loop
            rnp1 := rn - fnc_g_div_gp(rn, nper, pmt, pv, fv, type_);
            diff := abs(rnp1 - rn);
            iterator := iterator + 1;
            rn := rnp1;
        end loop;
 	return rn;
   end;
end;

select fnc_getRate(36,749,-2531,0,0) as rate from dual
;
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как реализовать в oracle расчет процентной ставки кредита?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]