2

VB.NET で NPV() 関数を使用して、一連のキャッシュ フローの NPV を取得しています。

ただし、NPV() の結果は、手動で計算を実行した結果と一致しません (手動の結果と一致する Investopedia NPV 計算も同様です)。

私の正しい手動の結果と NPV() の結果は 5% 以内で近いですが、同じではありません...

NPV 式を使用して手動で: NPV = C0 + C1/(1+r)^1 + C2/(1+r)^2 + C3/(1+r)^3 + .... + Cn/(1 +r)^n

手動結果は、レート r = 0.04 および期間 n = 10 で RunningTotal に格納されます。

これが私の関連コードです:

編集:どこかに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

編集: 次の値を使用: 割引率 = 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

http://www.investopedia.com/calculator/NetPresentValue.aspxで計算機を使用し 、手動の「教科書」式に従って、同じ結果に到達します。

正味現在価値: $225,761.70

この結果を再現するために NPV() を取得できないようです... $217,078.59 を吐き出します

同じ値の例を使用して手動で反復します...したがって、彼らは私とは異なる関数を使用している必要があります...

MSDN ページの例では、初期費用をキャッシュ フロー リストに含める必要があることが明確に示されています。

4

3 に答える 3

1

通常、最初のキャッシュ フローを Visual BasicNPV()関数に含めることはありません (少なくとも、リースの世界では含めません)。最初のキャッシュ フロー以外のすべてを割り引いてから、その最初のキャッシュ フローの金額を正味現在価値に追加します。これまでに計算エンジンで行ったことの例を次に示します (例を簡略化するためのエラー チェックは省略しています)。

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

それはあなたの 5% を占めるかもしれません -- 私は以前にこのような問題に遭遇したことを知っています. 私には、あなたが投稿した手動の NPV 式では、C0 は割引されるストリームにある必要がないため、関数に含めませんNPV()

于 2010-06-18T00:02:37.983 に答える
1

MSDN ページでは、キャッシュ アウトフローが最初の期間 (終了ではなく) の開始時に開始する場合、最初の値を NPV 値に追加する必要があり、キャッシュ フロー配列には含めないことに注意してください。

手計算では、キャッシュ アウトフロー (C0) が時間ゼロ (現在価値) で発生することが示されています。これは、MSDN ページの提案に従う必要があることを示しています。

于 2010-06-18T00:33:09.447 に答える
0

Cory Larsonは、部分的には正しいです...しかし、MSDNのドキュメントは私には誤りのようです。

問題は、NPV()関数が、配列の最初の(n = 0)要素を割引すべきではないときに割引していることです。n=1から始まります

MSDNのドキュメントでは、配列の最初の要素は初期費用である必要があると明記されていますが、これはそれらの関数には当てはまりません。

NPV()関数では、配列の最初の要素(Cory Larsonが示唆するように)が最初の実際のキャッシュフローである必要があります。次に、関数が結果を返した後、結果の初期費用を差し引く必要があります。

これは、NPV()関数がNPV式を使用してn=1で始まるためです。NPV=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のため)

私の意見では、 http: //msdn.microsoft.com/en-us/library/microsoft.visualbasic.financial.npv.aspxのMSDNの例を次のように修正する必要があります。

配列から初期の-70000値を除外し、すべての要素をインデックス内で1つ下にシフトし、配列サイズを1つ減らします。次に、初期費用(-70000)を変数NetPValに追加して、実際の結果を取得します。

誰かがMSに彼らのOBOBについて知ってもらいたいと思うでしょう:D(しかしそれは実際には機能ですよね?)

編集:そして、「配列には、少なくとも1つの負の値(支払い)と1つの正の値(領収書)が含まれている必要があります」というセクションがあります。正確ではありません。Cory Larsonが指摘したように、配列に負の値は必要ありません(実際、除外する必要があります!)

于 2010-06-18T18:07:58.163 に答える