Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как реализовать в oracle расчет процентной ставки кредита? / 15 сообщений из 15, страница 1 из 1
26.08.2021, 19:52
    #40093340
E_Schekaturova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
Коллеги, привет

Сломала голову. Необходимо сделать аналог функции 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
26.08.2021, 20:11
    #40093343
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
E_Schekaturova,

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

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


часом nper не 3?

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

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

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


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

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

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


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

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

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

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

И тэгом SRC её код обрамить.
...
Рейтинг: 0 / 0
27.08.2021, 14:58
    #40093486
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
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
27.08.2021, 15:03
    #40093491
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
SQL*Plus

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


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

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

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

P.s. Код да, этот пробовала (пока с подставленными аргументами функцию прислать не могу, не у компьютера 🤦🏻♀)
...
Рейтинг: 0 / 0
30.08.2021, 09:37
    #40093735
E_Schekaturova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
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
30.08.2021, 10:28
    #40093752
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
E_Schekaturova
Vadim Lejnin,

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


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

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

.....
stax
...
Рейтинг: 0 / 0
30.08.2021, 20:28
    #40093922
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
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
30.08.2021, 20:34
    #40093923
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
Файл RATE.xlsx прилагается.
...
Рейтинг: 0 / 0
31.08.2021, 00:17
    #40093947
E_Schekaturova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как реализовать в oracle расчет процентной ставки кредита?
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как реализовать в oracle расчет процентной ставки кредита? / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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