sql - 在 SQL 中计算 XIRR
问题描述
我一直在尝试找到一种在 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
.
其次,Excel的计算在XIRR函数中有详细说明,从哪一部分是:
但是,这是针对 Excel 使用迭代的一系列现金流,而您的具体示例只是一对配对条目,其可解方程可以表示为:
=10^(LOG(-A2/A1)*365/(B2-B1))
这部分:365/(B2-B1)
是您的倒数0.0849315
,因此可能值得0.635634780
更仔细地调查您的(我不清楚您是如何得出这个结论的)。
推荐阅读
- python - django url 可以在开头包含固定路径吗?
- android - 如何使用绑定适配器从 ImageView 中的 drawable 加载动画 gif?
- java - 无法为元素 Appenders 调用类 org.apache.logging.log4j.core.config.AppendersPlugin 中的工厂方法:java.lang.NullPointerException
- swift - 计算两个坐标之间的距离并将其显示在 UITableViewCell 的标签内
- java - 何时使用接口变量与实现变量
- elasticsearch - 在 Kibana 仪表板中使用 SQL
- python - 为什么我要为 Python 中数据框的每个索引获取列标题?
- c++ - 冒泡排序降序
- javascript - laravel 在提交表单时没有获取文件
- laravel - 重定向到 Laravel 路由 VueJS