[英]Calculating XIRR in SQL
我一直在嘗試找到一種在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毫不費力地吐出了值。
假設圖像在左上角的A1中。 無法解決您的SQL,但希望對您有所幫助:
首先,我的Excel也返回-0.6719218
。
其次,在XIRR函數中詳細介紹了Excel的計算,其中包括:
但是,這是針對一系列現金流量的,Excel使用其進行迭代,並且您的特定示例只是一對成對的條目,其可溶方程式可以表示為:
=10^(LOG(-A2/A1)*365/(B2-B1))
這部分: 365/(B2-B1)
是您的0.0849315
的倒數,因此可能值得更仔細地研究您的0.635634780
(我不清楚您是如何得出的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.