我一直在尝试找到一种在SQL(TSQL)中计算XIRR的解决方案。理想情况下,这些值应与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
但是,使用下面的数据,
我们遇到错误
An invalid floating point operation occurred.
这正在发生
SELECT @f = @f + value * POWER(1 + @X0, (-theDelta / 365.0E))
它本质上取决于特定的计算
POWER(-0.635634780,-0.0849315)
是否可以通过一些简单的语法调整来解决此错误,或者该函数本身不起作用? Excel似乎可以毫无问题地处理此计算。
这只是我尝试使用的许多示例之一。如果需要,我可以分解另一个示例。我可以编辑该帖子,使其在指导下适合Stack Overflow的标准。我发现非常罕见的是,没有关于如何在SQL中计算XIRR的明确讨论。每个解决方案似乎都有问题,但Excel毫不费力地吐出了值。
答案 0 :(得分:0)
假设图像位于左上方的A1中。无法解决您的SQL,但希望对您有所帮助:
首先,我的Excel也返回-0.6719218
。
第二,在XIRR function处详细介绍了Excel的计算,该部分是:
但是,这是针对现金流的系列,Excel使用迭代,并且您的特定示例只是一对成对的条目,其可溶方程可以表示为:< / p>
=10^(LOG(-A2/A1)*365/(B2-B1))
这部分:365/(B2-B1)
是您的0.0849315
的对等物,因此可能值得更仔细地调查您的0.635634780
(我不清楚您是如何得出的)。