# XNPV - 脚本函数

XNPV() 函数用于返回聚合净现值，以揭示 pmt 和 date 表达式的成对数值表示的现金流时间表（不必为周期性的）。 所有付款按 365 天一年年折扣。

语法：

XNPV(discount\_rate, pmt, date)

返回数据类型： 数字

信息注释默认情况下，结果将被格式化为货币。

计算 XNPV 的公式如下所示：

XNPV 聚合公式

XNPV 聚合公式

XNPV 聚合公式 ![XNPV 脚本函数的公式图像。](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Resources/Images/scripting-functions-xnpv-formula.png)

其中：

* `P``i`= 单期净现金流入流出 `i`

* `d``1`= 第一次付款日期

* `d``i` = 第 `i` 次付款日期

* `rate` = 贴现率

净现值 (NPV) 用于在给定折扣率的情况下计算未来现金流的当前总价值。要计算 XNPV，我们需要估计具有相应日期的未来现金流。在此之后，对于每次付款，我们将根据付款日期采用复合折扣率。

对一系列付款执行 XNPV 聚合类似于对这些付款执行求和聚合。不同之处在于，每个金额都会根据所选的折扣率（类似于利率）和未来付款的时间进行修改（或“打折扣”）。在 discount\_rate 参数设置为零的情况下执行 XNPV 将使 XNPV 等效于求和操作（在求和之前不会修改付款）。一般而言，discount\_rate 设置得越接近零，XNPV 结果就越类似于求和聚合的结果。

参数

| 参数 | 说明 |
| --- | --- |
| discount\_rate | discount\_rate 是付款折扣时依据的年费率。<br><br>值 0.1 表示 10% 的贴现率。 |
| pmt | 付款。表达式或字段包含与在 date 中指定的付款时间表对应的现金流。 正值被假定为流入，负值被假定为流出。<br><br>信息注释XNPV() 不会对初始现金流进行折扣，因为它总是在开始日期发生。后续付款按 365 天的年折扣。这与第一笔付款也打折的 NPV() 不同。 |
| date | 表达式或字段包含与在 pmt 中指定的现金流支付对应的日期时间表。 第一个值用作计算未来现金流抵销的开始日期。 |

使用此功能时，以下限制适用：

* 数据对任意部分或两部分中的文本值，NULL 值和缺失值在整个数据对中忽略不计。

## 适用场景

* `XNPV()` 用于计算投资机会的净现值 (NPV)。

* 由于其较高的精度，XNPV 比 NPV 更适合所有类型的金融模型。

## 区域设置

除非另有规定，本主题中的示例使用以下日期格式：MM/DD/YYYY。日期格式已经在数据加载脚本中的 `SET DateFormat` 语句中指定。由于区域设置和其他因素，系统中的默认日期格式可能有所不同。您可以更改以下示例中的格式以满足您的要求。或者，您可以更改加载脚本中的格式以匹配这些示例。

应用程序中的默认区域设置基于安装 Qlik Sense 的计算机或服务器的区域系统设置。如果您访问的 Qlik Sense 服务器设置为瑞典，则数据加载编辑器将使用瑞典地区设置的日期、时间和货币。这些区域格式设置与 Qlik Sense 用户界面中显示的语言无关。Qlik Sense 将以与您使用的浏览器相同的语言显示。

## 示例 1 – 一次性付款（脚本）

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/FinancialAggregationFunctions/XNPV.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 一个项目及其一年现金流的数据集，位于名为 `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;
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `PrjId`

* `XNPV`

结果表

| PrjId | XNPV |
| --- | --- |
| 1 | $909.09 |

根据公式，第一条记录的 XNPV 值为 0，第二条记录的 XNPV 值是 909.09 美元。因此，总 XNPV 是 909.09 美元。

## 示例 2 – 多次付款（脚本）

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/FinancialAggregationFunctions/XNPV.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 一个项目及其一年现金流的数据集，位于名为 `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;
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `PrjId`

* `XNPV`

结果表

| PrjId | XNPV |
| --- | --- |
| 1 | $1322.21 |

在本例中，第一年年底收到 1000 美元的付款，第二年年底收到 500 美元的付款。如果每期贴现率为 10%，有效 XNPV 等于 1322.21 美元。

请注意，只有第一行数据应引用计算基准日期。对于其余的行，顺序并不重要，因为日期参数用于计算经过的期间。

## 示例 3 – 多次付款和不规则现金流（脚本）

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/FinancialAggregationFunctions/XNPV.htm)

#### 加载脚本和结果

概述

打开数据加载编辑器，并将下面的加载脚本添加到新选项卡。

加载脚本包含：

* 名为 `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;
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `PrjId`

* `XNPV`

结果表

| PrjId | XNPV |
| --- | --- |
| 1 | $1735.54 |
| 2 | $278.36 |

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 美元。

## 了解详情

* [Drop table](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/drop-table.htm)
* [group by](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Load.htm#group_by)
* [Join](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Join.htm)
* [Max - 脚本函数](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/AggregationFunctions/max.htm)
* [NoConcatenate](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/NoConcatenate.htm)
* [NPV - 图表函数](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/ChartFunctions/FinancialAggregationFunctionsInCharts/npv.htm)
* [Only - 脚本函数](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/AggregationFunctions/only.htm)
* [Resident LOAD](https://help.qlik.com/zh-CN/sense/November2024/Subsystems/Hub/Content/Sense_Hub/Scripting/load-data-from-previously-loaded-table.htm#Resident)