实现Excel和VB的IRRfunction

我需要将在Excel和VB中find的IRR函数移植到ActionScript中。

  • Excel IRR公式

任何想法如何find这样的function“源”? 有没有人有这样的一些其他类似C语言实现?

使用迭代求解器(例如二分法或牛顿法)可以很容易地进行编码。 如果您的现金stream量C_t_j在时间C_t_j发生,那么内部收益率r满足总和j = 1n

 C_t_j / (1 + r)^t_j 

等于零。 调用这个f(r) 。 那么f'(r)是和j = 1n

 -t_j * C_t_j / (1 + r)^(t_j+1). 

现在你可以应用牛顿的方法来解决r

下面是我多年前写的一个IRR Excelmacros。 我不能解释它是如何工作,但我认为这是正确的事情:

它的调用方式如下:= IrrCont(A8:A15,F8:F15)其中第一个范围是date范围,第二个范围是值的范围。 有些值必须是正值,有些值必须是负值。

 Option Explicit ' ' Internal Rate of return -- Calculation ' Returns a result (Double) or an error message (String) Private Function IrrCalc(DateRange As Object, ValueRange As Object) Dim i As Integer Dim it As Integer Dim Count As Integer Dim u As Double Dim time As Double Dim d_positive As Double Dim positive As Double Dim d_negative As Double Dim negative As Double Dim sum As Double Const epsilon As Double = 0.000001 Const iterations As Integer = 20 Dim StartTime As Double Dim pos As Boolean Dim neg As Boolean Dim value As Double Dim temp As Double Dim delta As Double If DateRange.Count <> ValueRange.Count Then IrrCalc = "*** Date Range (argument 1) and Value Range " & _ "(argument 2) must contain the same number of cells. ***" Exit Function End If Count = DateRange.Count For i = 1 To Count If ValueRange.Cells(i).value > 0 Then pos = True If ValueRange.Cells(i).value < 0 Then neg = True If pos And neg Then Exit For Next i If Not pos Or Not neg Then IrrCalc = "*** Cannot calculate IRR: Need both income and expenditure. ***" Exit Function End If StartTime = Application.Min(DateRange) u = 0 ' Initial interest rate guess For it = 1 To iterations positive = 0 d_positive = 0 negative = 0 d_negative = 0 For i = 1 To Count value = ValueRange.Cells(i).value time = (DateRange.Cells(i).value - StartTime) / 365.2425 If value > 0 Then temp = value * Exp(u * time) positive = positive + temp d_positive = d_positive + temp * time ElseIf value < 0 Then temp = -value * Exp(u * time) negative = negative + temp d_negative = d_negative + temp * time End If Next i delta = Log(negative / positive) / (d_negative / negative - d_positive / positive) If Abs(delta) < epsilon Then Exit For u = u - delta Next it If it > iterations Then IrrCalc = "*** irr does not converge in " & Str(iterations) & " iterations ***" Else IrrCalc = u End If End Function ' ==================================================================================================== ' ' Internal Rate of Return: Discrete interest calculation Function IrrDiscrete(DateRange As Object, ValueRange As Object) Dim result As Variant result = IrrCalc(DateRange, ValueRange) If VarType(result) = vbDouble Then IrrDiscrete = Exp(-result) - 1# Else IrrDiscrete = result End If End Function ' ==================================================================================================== ' ' Internal Rate of Return: Continuous (compounding) interest calculation Function IrrCont(DateRange As Object, ValueRange As Object) Dim result As Variant result = IrrCalc(DateRange, ValueRange) If VarType(result) = vbDouble Then IrrCont = -result Else IrrCont = result End If End Function 

以下是我在ActionScript中的迭代实现:

package xattam.net.math { public class Financial { public static const MAX_IRR_ITERATIONS:int = 1000; public static function IRR(cashFlow:Array,guess:Number=0.1):Number { var npv:Number; var cnt:Number = 0; do { npv = Financial.NPV(guess,cashFlow); guess+= 0.001; if(cnt > Financial.MAX_IRR_ITERATIONS) return NaN; else cnt++; } while(npv > 0) return guess; } public static function NPV(discountRate:Number,cashFlow:Array):Number { var npv:Number = 0; for(var t:int = 0; t < cashFlow.length;t++) { npv += cashFlow[t] / Math.pow((1+ discountRate),t); } return npv; } } }
package xattam.net.math { public class Financial { public static const MAX_IRR_ITERATIONS:int = 1000; public static function IRR(cashFlow:Array,guess:Number=0.1):Number { var npv:Number; var cnt:Number = 0; do { npv = Financial.NPV(guess,cashFlow); guess+= 0.001; if(cnt > Financial.MAX_IRR_ITERATIONS) return NaN; else cnt++; } while(npv > 0) return guess; } public static function NPV(discountRate:Number,cashFlow:Array):Number { var npv:Number = 0; for(var t:int = 0; t < cashFlow.length;t++) { npv += cashFlow[t] / Math.pow((1+ discountRate),t); } return npv; } } }