XNPV - 脚本函数在该页面上
XNPV() 脚本函数采用除贴现率之外的每个贴现现金流对应的特定日期。它与 NPV() 函数不同,因为 NPV() 假设所有时间段都相等。因此,XNPV() 比 NPV() 更精确。
语法:
XNPV( discount_rate, pmt,
date)
返回数据类型: 数字。 默认情况下,结果将被格式化为货币。
计算 XNPV 的公式为:
其中:
P i = 单期净现金流入流出 i
d 1 = 第一次付款日期
d i = 第 i 次付款日期
rate = 贴现率
净现值 (NPV) 用于计算未来现金流的当前总价值。为了计算净现值,我们需要估计每个期间的未来现金流,并确定正确的贴现率。
XNPV() 接受贴现率和按期间排序的多个值。流入(收入)为正值,流出(未来付款)为负值。这些发生在每个周期结束时。
参数
discount_rate
discount_rate 是应用的折扣百分比。
值 0.1 表示 10% 的贴现率。
value
此字段保存现金流值。第一个值假定为开始时的现金流,相应日期用作计算所有未来现金流现值的参考。
信息注释 XNPV() 不对初始现金流贴现。后续付款按 365 天的年折扣。这与每笔付款都打折的 NPV() 不同。
date
此字段保存现金流(value ,第二个参数)发生的日期。第一个值用作计算未来现金流抵销的开始日期。
限制:
如果数据对的任何一段或两段中存在文本值、NULL 值和缺失值,则将忽略该数据对。
适用场景
区域设置
除非另有规定,本主题中的示例使用以下日期格式:MM/DD/YYYY。日期格式已经在数据加载脚本中的 SET DateFormat 语句中指定。由于区域设置和其他因素,系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者,您可以更改加载脚本中的格式以匹配这些示例。
应用程序中的默认区域设置基于安装 Qlik Sense 的计算机或服务器的区域系统设置。如果您访问的 Qlik Sense 服务器设置为瑞典,则数据加载编辑器将使用瑞典地区设置的日期、时间和货币。这些区域格式设置与 Qlik Sense 用户界面中显示的语言无关。Qlik Sense 将以与您使用的浏览器相同的语言显示。
示例 1 – 一次性付款(脚本)
加载脚本和结果
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
一个项目及其一年现金流的数据集,位于名为 CashFlow 的表中。计算的初始日期为 2022 年 7 月 1 日,净现金流为 0。一年后,现金流为 1000 美元。
CashFlow 表中的常驻荷载,用于计算名为 XNPV 的表中项目的 XNPV 字段。
硬编码贴现率为 10% (0.1),用于 XNPV 计算。
用于对项目的所有付款进行分组的 Group By 报表。
加载脚本
CashFlow:
Load
*
Inline
[
PrjId,Dates,Values
1,'07/01/2022',0
1,'07/01/2023',1000
];
XNPV:
Load
PrjId,
XNPV(0.1,Values,Dates) as XNPV //Discount Rate of 10%
Resident CashFlow
Group By PrjId;
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
根据公式,第一条记录的 XNPV 值为 0,第二条记录的 XNPV 值是 909.09 美元。因此,总 XNPV 是 909.09 美元。
示例 2 – 多次付款(脚本)
加载脚本和结果
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
一个项目及其一年现金流的数据集,位于名为 CashFlow 的表中。
CashFlow 表中的常驻荷载,用于计算名为 XNPV 的表中项目的 XNPV 字段。
硬编码贴现率为 10% (0.1),用于 XNPV 计算。
用于对项目的所有付款进行分组的 Group By 报表。
加载脚本
CashFlow:
Load
*
Inline
[
PrjId,Dates,Values
1,'07/01/2022',0
1,'07/01/2024',500
1,'07/01/2023',1000
];
XNPV:
Load
PrjId,
XNPV(0.1,Values,Dates) as XNPV //Discount Rate of 10%
Resident CashFlow
Group By PrjId;
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
在本例中,第一年年底收到 1000 美元的付款,第二年年底收到 500 美元的付款。如果每期贴现率为 10%,有效 XNPV 等于 1322.21 美元。
请注意,只有第一行数据应引用计算基准日期。对于其余的行,顺序并不重要,因为日期参数用于计算经过的期间。
示例 3 – 多次付款和不规则现金流(脚本)
加载脚本和结果
概述
打开数据加载编辑器,并将下面的加载脚本添加到新选项卡。
加载脚本包含:
名为 Project 的表中两个项目的折扣率。
按项目 ID 和日期列出每个项目的多个期间的现金流。Dates 字段用于计算贴现率应用于现金流的持续时间。除了第一条记录(初始现金流和日期)外,记录的顺序并不重要,更改它不应影响计算。
使用 NoConcatenate 、Resident LOAD 和 Left Join 函数的组合,将创建一个临时表 tmpNPV ,将 Project 和 CashFlow 表的记录组合在一个平面表中。此表将重复每个现金流的贴现率。
tmpNPV 表中的常驻荷载,用于计算名为 XNPV 的表中每个项目的 XNPV 字段。
使用 only() 函数获取与每个项目相关的单值贴现率,并用于每个项目的 XNPV 计算。
按项目 ID 分组的 Group By 语句用于对每个项目的所有付款和相应日期进行分组。
为了避免将任何合成或冗余数据加载到数据模型中,将在脚本末尾删除 tmpXNPV 表。
加载脚本
Project:
Load * inline [
PrjId,Discount_Rate
1,0.1
2,0.15
];
CashFlow:
Load
*
Inline
[
PrjId,Dates,Values
1,'07/01/2021',0
1,'07/01/2022',1000
1,'07/01/2023',1000
2,'07/01/2020',0
2,'07/01/2023',500
2,'07/01/2024',1000
2,'07/01/2022',500
];
tmpXNPV:
NoConcatenate Load *
Resident Project;
Left Join
Load *
Resident CashFlow;
XNPV:
Load
PrjId,
XNPV(Only(Discount_Rate),Values,Dates) as XNPV //Discount Rate will be 10% for Project 1 and 15% for Project 2
Resident tmpXNPV
Group By PrjId;
Drop table tmpXNPV;
结果
加载数据并打开工作表。创建新表并将这些字段添加为维度:
2021 年 7 月 1 日,项目 ID 1 的初始现金流为 0 美元。在随后的两年结束时,将收到两笔 1000美 元的付款,每个期间的贴现率为 10%。因此,有效 XNPV 等于 1735.54 美元。
项目 ID 2 在 2020 年 7 月 1 日的初始流出量为 1000 美元(因此为负号)。两年后,预计将支付 500 美元。3 年后,预计将再支付 500 美元。最后,2024 年 7 月 1 日,预计将支付 1000 美元。贴现率为 15% 时,有效 XNPV 等于 278.36 美元。
另请参见: