Финансовые расчеты являются неотъемлемой частью многих бизнесов и оценок инвестиций. Одним из широко используемых финансовых расчетов является XIRR, который помогает измерять ставку доходности по денежным потокам. В этой статье мы рассмотрим реализацию XIRR в SQL Server с использованием SQL CLR.
XIRR тесно связан с функцией XNPV, функцией чистой текущей стоимости. Ставка доходности, рассчитанная с помощью XIRR, является процентной ставкой, соответствующей XNPV = 0. Давайте рассмотрим пример из документации Microsoft Office и попробуем его в SQL Server:
SELECT
wct.XIRR([values],[dates],NULL) AS XIRR
FROM
(VALUES
(-10000,'2008-01-01'),
(2750,'2008-03-01'),
(4250,'2008-10-30'),
(3250,'2009-02-15'),
(2750,'2009-04-01')
) n([values],[dates])
Этот запрос даст нам тот же ответ, что и в документации Microsoft Office:
XIRR
----------------------
0.373362533509583
Разработчики Westclintech реализовали функцию XIRR с использованием SQL CLR и включили ее в свою библиотеку функций XLeratorDB. Эта библиотека содержит более 750 функций, включая XIRR. Интересно, что в некоторых случаях функция XLeratorDB дает результат, который Excel не может получить. Это подчеркивает точность и надежность реализации XLeratorDB.
Давайте рассмотрим еще один пример:
SELECT
wct.XIRR([values],[dates],NULL) AS XIRR
FROM
(VALUES
(0,'2002-06-17'),
(-42814703.5,'2008-08-19'),
(44768952.93,'2002-11-16'),
(0,'2003-10-31'),
(-192485819.41,'2012-10-21'),
(-128316512.7,'2003-01-19'),
(-57458663.82,'2006-08-12'),
(0,'2006-01-01'),
(121072521.7,'2001-07-28'),
(59000533.69,'2008-01-17'),
(48964026.98,'2003-05-31')
) n([values],[dates])
В этом случае результат XLeratorDB:
XIRR
----------------------
0.101489308050466
Однако, когда те же денежные потоки помещаются в Excel 2013, результат равен 2.9802322388E-09, что по сути является нулем. Это расхождение можно объяснить тем, что Excel ожидает, что денежные потоки будут упорядочены по дате, в то время как функция XIRR в SQL Server позволяет датам находиться в любом порядке.
Чтобы проверить расчеты, мы можем использовать функцию XNPV, включенную в библиотеку XLeratorDB. Давайте проверим расчет XNPV, используя как значение XLeratorDB, так и значение Excel:
WITH mycte AS (
SELECT *
FROM (VALUES
(0,'2002-06-17'),
(-42814703.5,'2008-08-19'),
(44768952.93,'2002-11-16'),
(0,'2003-10-31'),
(-192485819.41,'2012-10-21'),
(-128316512.7,'2003-01-19'),
(-57458663.82,'2006-08-12'),
(0,'2006-01-01'),
(121072521.7,'2001-07-28'),
(59000533.69,'2008-01-17'),
(48964026.98,'2003-05-31')
) n([values],[dates])
)
SELECT
wct.XNPV(r,[values],[dates]) AS [NPV using XLDB value],
wct.XNPV(2.9802322388E-09,[values],[dates]) AS [NPV using Excel value]
FROM (
SELECT
wct.XIRR([values],[dates],NULL) AS r
FROM
mycte
) n, mycte
Значение XLeratorDB возвращает значение XNPV, близкое к нулю, в то время как значение Excel этого не делает. Это дополнительно подтверждает точность реализации XLeratorDB.
Стоит отметить, что пакет XLeratorDB предлагает не только точные расчеты, но и отличную производительность. В тесте производительности на машине с 8 ядрами расчет XIRR смог обработать и сохранить результаты для 2,7 миллиона строк денежных потоков примерно за 17 секунд, с средней производительностью более 158 000 строк в секунду.
Пакет XLeratorDB предлагает убедительные аргументы для переноса финансовых расчетов из Excel в SQL Server. Благодаря своей точности, масштабируемости и скорости, он предлагает превосходную альтернативу для финансовых расчетов. Кроме того, поскольку расчеты выполняются на базе данных, их легко интегрировать в любую платформу или язык программирования, который может подключаться к базе данных.
Скачайте 15-дневную бесплатную пробную версию XLeratorDB сегодня и исследуйте мощь точных и эффективных финансовых расчетов в SQL Server.