Расчет XIRR в SQL - PullRequest
       29

Расчет XIRR в SQL

0 голосов
/ 14 сентября 2018

Я пытался найти решение для расчета XIRR в SQL (TSQL).В идеале значения должны соответствовать значениям, которые Excel вычисляет с использованием одних и тех же входных данных.Я нашел несколько предлагаемых решений в Интернете, но все они, похоже, имеют недостатки.Ниже приведен пример, который мы использовали, который работает в почти во всех случаях.

CREATE FUNCTION [dbo].[CalcXIRR]
(
    @Sample XIRRTable READONLY,
    @Rate DECIMAL(19, 9) = 0.1
)
RETURNS DECIMAL(38, 9)
AS
BEGIN
    DECLARE @X DECIMAL(19, 9) = 0.0,
    @X0 DECIMAL(19, 9) = 0.1,
    @f DECIMAL(19, 9) = 0.0,
    @fbar DECIMAL(19, 9) = 0.0,
    @i TINYINT = 0,
    @found TINYINT = 0

IF @Rate IS NULL
    SET @Rate = 0.1

SET @X0 = @Rate

WHILE @i < 100
    BEGIN
        SELECT  @f = 0.0,
            @fbar = 0.0

        SELECT      @f = @f + value * POWER(1 + @X0, (-theDelta / 365.0E)),
        @fbar = @fbar - theDelta / 365.0E * value * POWER(1 + @X0, (-theDelta / 365.0E - 1))
        FROM    (
                SELECT  Value,
                    DATEDIFF(DAY, MIN(date) OVER (), date) AS theDelta
                FROM    @Sample
            ) AS d

        SET @X = @X0 - @f / @fbar

        If ABS(@X - @X0) < 0.00000001
        BEGIN
           SET @found = 1
           BREAK;
        END

        SET @X0 = @X
        SET @i += 1
   END

 If @found = 1
    RETURN  @X

RETURN NULL
END

GO

Однако, с данными ниже,

enter image description here

мы получаем ошибку

An invalid floating point operation occurred.

Это происходит на линии

SELECT @f = @f + value * POWER(1 + @X0, (-theDelta / 365.0E))

По сути, это сводится к конкретному вычислению

POWER(-0.635634780,-0.0849315)

Может быть, есть какая-то простая настройка синтаксиса, которая может исправить эту ошибку, или сама функция не будет работать?Похоже, что в Excel эти вычисления обрабатываются без проблем.

Это только один из многих примеров, которые я пытался использовать.Я могу разбить другой пример, если это необходимо.Я могу отредактировать пост, чтобы он соответствовал стандарту Stack Overflow с указаниями.Я нахожу очень необычным то, что нет ясного обсуждения того, как вычислять XIRR в SQL.Кажется, что у каждого решения есть проблемы, но Excel так легко выкладывает значения.

1 Ответ

0 голосов
/ 29 сентября 2018

Предполагается, что ваше изображение в A1 вверху слева. Не решает ваш SQL, но я надеюсь, что может помочь:

Во-первых, мой Excel также возвращает -0.6719218.

Во-вторых, расчет Excel детализирован в XIRR функция из какой части:

XIRR formula

Тем не менее, это для серии денежных потоков, для которых Excel использует итерацию, и ваш конкретный пример - просто пара парных записей, для которых разрешимое уравнение может быть выражено как:

=10^(LOG(-A2/A1)*365/(B2-B1))

Эта часть: 365/(B2-B1) является обратной величиной вашего 0.0849315, поэтому, возможно, стоит более внимательно изучить ваш 0.635634780 (мне не ясно, как вы к этому пришли).

...