c# - XIRR Calculation -
how calculate excel's xirr
function using c#?
according xirr function openoffice documentation (formula same in excel) need solve xirr variable in following f(xirr) equation:
you can calculate xirr value by:
- calculating derivative of above function -> f '(xirr)
- after having
f(xirr)
,f'(xirr)
can solve xirr value using iterative newton's method - famous formula->
edit
i've got bit of time so, here - complete c# code xirr calculation:
class xirr { public const double tol = 0.001; public delegate double fx(double x); public static fx composefunctions(fx f1, fx f2) { return (double x) => f1(x) + f2(x); } public static fx f_xirr(double p, double dt, double dt0) { return (double x) => p*math.pow((1.0+x),((dt0-dt)/365.0)); } public static fx df_xirr(double p, double dt, double dt0) { return (double x) => (1.0/365.0)*(dt0-dt)*p*math.pow((x+1.0),(((dt0-dt)/365.0)-1.0)); } public static fx total_f_xirr(double[] payments, double[] days) { fx resf = (double x) => 0.0; (int = 0; < payments.length; i++) { resf = composefunctions(resf,f_xirr(payments[i],days[i],days[0])); } return resf; } public static fx total_df_xirr(double[] payments, double[] days) { fx resf = (double x) => 0.0; (int = 0; < payments.length; i++) { resf = composefunctions(resf,df_xirr(payments[i],days[i],days[0])); } return resf; } public static double newtons_method(double guess, fx f, fx df) { double x0 = guess; double x1 = 0.0; double err = 1e+100; while (err > tol) { x1 = x0 - f(x0)/df(x0); err = math.abs(x1-x0); x0 = x1; } return x0; } public static void main (string[] args) { double[] payments = {-6800,1000,2000,4000}; // payments double[] days = {01,08,16,25}; // days of payment (as day of year) double xirr = newtons_method(0.1, total_f_xirr(payments,days), total_df_xirr(payments,days)); console.writeline("xirr value {0}", xirr); } }
btw, keep in mind not payments result in valid xirr because of restrictions of formula and/or newton method!
cheers!
Comments
Post a Comment