Vb.net .NET NPV()使用什么函数?不';与手工计算不符

Vb.net .NET NPV()使用什么函数?不';与手工计算不符,vb.net,math,finance,Vb.net,Math,Finance,我正在使用VB.NET中的NPV()函数获取一组现金流的NPV 但是,NPV()的结果与我手动执行计算的结果不一致(也不符合我手动结果的Investopedia NPV计算结果) 我的正确手动结果与NPV()结果接近,在5%以内。。但不一样 手动,使用净现值公式: 净现值=C0+C1/(1+r)^1+C2/(1+r)^2+C3/(1+r)^3+Cn/(1+r)^n 手动结果存储在RunningTotal中 速率r=0.04 周期n=10 这是我的相关代码: 编辑:我在什么地方有OBOB吗

我正在使用VB.NET中的NPV()函数获取一组现金流的NPV

但是,NPV()的结果与我手动执行计算的结果不一致(也不符合我手动结果的Investopedia NPV计算结果)

我的正确手动结果与NPV()结果接近,在5%以内。。但不一样

手动,使用净现值公式: 净现值=C0+C1/(1+r)^1+C2/(1+r)^2+C3/(1+r)^3+Cn/(1+r)^n

手动结果存储在RunningTotal中 速率r=0.04 周期n=10

这是我的相关代码:

编辑:我在什么地方有OBOB吗

    YearCashOutFlow = CDbl(TxtAnnualCashOut.Text)
    YearCashInFlow = CDbl(TxtTotalCostSave.Text)

    YearCount = 1

    PAmount = -1 * (CDbl(TxtPartsCost.Text) + CDbl(TxtInstallCost.Text))
    RunningTotal = PAmount
    YearNPValue = PAmount
    AnnualRateIncrease = CDbl(TxtUtilRateInc.Text)

    While AnnualRateIncrease > 1
        AnnualRateIncrease = AnnualRateIncrease / 100
    End While
    AnnualRateIncrease = 1 + AnnualRateIncrease

    ' ZERO YEAR ENTRIES
    ListBoxNPV.Items.Add(Format(PAmount, "currency"))
    ListBoxCostSave.Items.Add("$0.00")
    ListBoxIRR.Items.Add("-100")
    ListBoxNPVCum.Items.Add(Format(PAmount, "currency"))
    CashFlows(0) = PAmount
    ''''

    Do While YearCount <= CInt(TxtLifeOfProject.Text)
        ReDim Preserve CashFlows(YearCount)

        CashFlows(YearCount) = Math.Round(YearCashInFlow - YearCashOutFlow, 2)
        If CashFlows(YearCount) > 0 Then OnePos = True


        YearNPValue = CashFlows(YearCount) / (1 + DiscountRate) ^ YearCount
        RunningTotal = RunningTotal + YearNPValue

        ListBoxNPVCum.Items.Add(Format(Math.Round(RunningTotal, 2), "currency"))
        ListBoxCostSave.Items.Add(Format(YearCashInFlow, "currency"))

        If OnePos Then
            ListBoxIRR.Items.Add((IRR(CashFlows, 0.1)).ToString)
            ListBoxNPV.Items.Add(Format(NPV(DiscountRate, CashFlows), "currency"))
        Else
            ListBoxIRR.Items.Add("-100")
            ListBoxNPV.Items.Add(Format(RunningTotal, "currency"))
        End If

        YearCount = YearCount + 1
        YearCashInFlow = AnnualRateIncrease * YearCashInFlow
    Loop
yearCashOutput=CDbl(txtanualcashout.Text)
YearCashInFlow=CDbl(TxtTotalCostSave.Text)
年份计数=1
PAmount=-1*(CDbl(TxtPartsCost.Text)+CDbl(TxtInstallCost.Text))
RunningTotal=PAmount
期望值=PAmount
年费率增加=CDbl(TxtUtilRateInc.Text)
而年增长率>1
年费率增加=年费率增加/100
结束时
年增长率=1+年增长率
“零年项目”
ListBoxNPV.Items.Add(格式(PAmount,“货币”))
ListBoxCostSave.Items.Add($0.00)
ListBoxIRR.Items.Add(“-100”)
ListBoxNPVCum.Items.Add(格式(PAmount,“货币”))
现金流(0)=PAmount
''''
如果YearCount为0,则执行OnePos=True
向往价值=现金流(年数)/(1+贴现)^YearCount
RunningTotal=RunningTotal+ForwardpValue
ListBoxNPVCum.Items.Add(格式(Math.Round(RunningTotal,2),“currency”))
ListBoxCostSave.Items.Add(格式(年现金流入,“货币”))
如果是这样的话
ListBoxIRR.Items.Add((IRR(现金流,0.1)).ToString)
ListBoxNPV.Items.Add(格式(NPV(贴现率、现金流),“货币”))
其他的
ListBoxIRR.Items.Add(“-100”)
ListBoxNPV.Items.Add(格式(RunningTotal,“currency”))
如果结束
YearCount=YearCount+1
年现金流入=年利率增加*年现金流入
环
编辑:使用以下值: 贴现率=4% 项目寿命=10年 现金流量0=-78110.00 现金流量1=28963.23 现金流量2=30701.06 现金流量3=32543.12 现金流量4=34495.71 现金流量5=36565.45 现金流量6=38759.38 现金流量7=41084.94 现金流量8=43550.03 现金流量9=46163.04 现金流量10=48932.82

使用计算机在 按照手动“教科书”公式,我得出了相同的结果:

净现值:225761.70美元

我似乎无法让NPV()复制此结果。。。它吐出217078.59美元

我使用相同的值手动迭代它。。。所以他们使用的函数肯定和我的不同


MSDN页面示例明确指出,初始费用应包含在现金流列表中。

通常情况下,您不会将第一个现金流包含在Visual Basic
NPV()
函数中(或者至少在租赁世界中不会)。除了第一笔现金流,你会对所有现金流进行贴现,然后将第一笔现金流金额加到你的净现值上。下面是我以前在计算引擎中所做的一个示例(减去错误检查以简化示例):


这可以解释你的5%——我知道我以前遇到过这样的问题。对我来说,在你发布的手动NPV公式中,C0不需要在贴现流中,因此我没有将其包括在
NPV()函数中。

MSDN页面注意到,如果你的现金流出开始于第一个周期的开始(而不是结束)第一个值必须添加到净现值中,且不包括在现金流数组中


您的手动计算表明您的现金流出(C0)发生在时间零点(现值),这表明您应该遵循MSDN页面的建议。

科里·拉森是正确的,部分是。。。但是MSDN文档在我看来是错误的

问题是NPV()函数在不应该折扣数组的第一个(n=0)元素时,却折扣了它;它从n=1开始

尽管MSDN文档规定阵列的第一个元素应为初始费用,但其功能并非如此

在NPV()函数中,数组的第一个元素(正如Cory Larson所暗示的)应该是第一个实际现金流。然后,在函数返回结果后,结果应减去初始费用

这是因为NPV()函数以n=1开头 使用净现值公式:净现值=C0+C1/(1+r)^1+C2/(1+r)^2+C3/(1+r)^3+…+Cn/(1+r)^n

在手动公式Cn/(1+r)^n中,如果n=0,则使用初始费用。。。那么分母是1(因为n=0)

我认为,MSDN示例应修改为以下内容:

从数组中排除初始值-70000,将索引中的所有元素下移一,并将数组大小减小1。 然后将初始费用(-70000)添加到变量NetPVal中以获得实际结果

有人应该想让MS知道他们的OBOB:D (但它实际上是一个功能,对吗?)

编辑:以及“数组必须至少包含一个负值(付款)和一个正值(收据)”的部分 事实上并不准确。
正如Cory Larson指出的那样:数组中不需要负值(事实上,应该忽略不计!)

NVP?此函数在哪个程序集中定义。我看不到您在提供的代码示例中引用了它。Microsoft.Visualbasic请参见我对下面答案的评论--我得到了适用于您的示例的VB
NPV()
函数。但函数文档规定,至少有一个必须为负值。在我的手动示例中,我使用初始现金流出作为C0,如果我将其从现金流中去掉(),那么我将不会拥有数组中所需的负成员…这不是一个要求,但我
Dim leaseRentalsDiscounted As Double = 0.0

Dim rebatedCashFlows As IEnumerable(Of LeasePayment) = GetLeaseRentalsPaymentStream()

Dim firstFlow As LeasePayment = rebatedCashFlows(0)

Dim doubleStream As Double() = PaymentToDoubleArray(rebatedCashFlows.Skip(1))

If doubleStream.Length > 0 Then
    Dim rate As Decimal = New Decimal(Me.Lease.DiscountRate / 100.0 / 12.0)
    leaseRentalsDiscounted = NPV(rate, doubleStream)
End If

leaseRentalsDiscounted += firstFlow.Amount

Return leaseRentalsDiscounted