Функция вычисления IRR - SQL Server (неравные платежи)

У нас есть скалярная функция для вычисления irr (INTERNAL RATE OF RETURN), которую мы используем в sql server. Он успешно работает для 4 платежей, если платежи равны или если 1-й платеж больше среднего значения платежей. Однако нам нужна функция, которая работает, если платежи имеют неравные суммы. Также мы хотим, чтобы она работала, если либо 1, Вводится 2, 3 или 4 платежа. У кого-нибудь есть функция, которая бы работала.

Скалярная функция, которую мы используем в настоящее время, показана ниже:

    USE [TESTDB]
GO
/****** Object:  UserDefinedFunction [dbo].[Calculate_IRR]    Script Date: 05/28/2018 08:01:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION [dbo].[Calculate_IRR](@nper float, @pmt float , @pv float) 
RETURNS decimal(9,2)
AS
BEGIN
DECLARE @fv FLOAT = 0
DECLARE @type INT = 0
DECLARE @guess DECIMAL(6,3) = .1

DECLARE @rate FLOAT
DECLARE @FINANCIAL_MAX_ITERATIONS INT = 128
DECLARE @FINANCIAL_PRECISION FLOAT = .0000001

DECLARE @y FLOAT
DECLARE @y0 FLOAT
DECLARE @y1 FLOAT
DECLARE @f FLOAT
DECLARE @i INT
DECLARE @x0 FLOAT = 0
DECLARE @x1 FLOAT

SET @rate = @guess

IF(ABS(@rate) < @FINANCIAL_PRECISION)
BEGIN
    SET @y = @pv * (1 + @nper * @rate) + @pmt * (1 + @rate * @type) * @nper + @fv
END
ELSE
BEGIN
    SET @f = EXP(@nper * LOG(1 + @rate))
    SET @y = @pv * @f + @pmt * (1 / @rate + @type) * (@f - 1) + @fv
END

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

SET @i  = @x0 
SET @x1 = @rate

WHILE ((ABS(@y0 - @y1) > @FINANCIAL_PRECISION) AND (@i < @FINANCIAL_MAX_ITERATIONS)) 
BEGIN
    SET @rate = (@y1 * @x0 - @y0 * @x1) / (@y1 - @y0)
    SET @x0 = @x1
    SET @x1 = @rate

    IF (ABS(@rate) < @FINANCIAL_PRECISION) 
    BEGIN
        SET @y = @pv * (1 + @nper * @rate) + @pmt * (1 + @rate * @type) * @nper + @fv
    END
    ELSE 
    BEGIN
        SET @f = EXP(@nper * LOG(1 + @rate))
        SET @y = @pv * @f + @pmt * (1 / @rate + @type) * (@f - 1) + @fv
    END

    SET @y0 = @y1
    SET @y1 = @y
    SET @i = @i + 1
END
   RETURN  @rate * 12.00 *100.00
END

0 ответов

Другие вопросы по тегам