public void TwoCashFlow() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2001, 01, 01), -1000.00m); cashFlows.Add(new Date(2002, 01, 01), 500.00m); var result = IrrCalculator.CalculateIrr(new Date(2000, 01, 01), 1000.00m, new Date(2005, 12, 31), 5000.00m, cashFlows); result.Should().BeApproximately(0.2244317d, 0.000001d); }
public void AddMatchingExistingDate() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2000, 01, 01), 100.00m); cashFlows.Add(new Date(2000, 01, 01), 200.00m); using (new AssertionScope()) { cashFlows.Count.Should().Be(1); cashFlows[new Date(2000, 01, 01)].Should().Be(300.00m); } }
public void AddNewDate() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2000, 01, 01), 100.00m); cashFlows.Add(new Date(2001, 06, 30), 200.00m); using (new AssertionScope()) { cashFlows.Count.Should().Be(2); cashFlows[new Date(2000, 01, 01)].Should().Be(100.00m); cashFlows[new Date(2001, 06, 30)].Should().Be(200.00m); } }
public void MoreThanOneYear() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2001, 01, 01), -1500.00m); cashFlows.Add(new Date(2002, 01, 01), 500.00m); cashFlows.Add(new Date(2003, 01, 01), 2000.00m); cashFlows.Add(new Date(2004, 01, 01), -5000.00m); cashFlows.Add(new Date(2005, 01, 01), 100.00m); var result = IrrCalculator.CalculateIrr(new Date(2000, 01, 01), 1000.00m, new Date(2005, 12, 31), 10000.00m, cashFlows); result.Should().BeApproximately(0.2220352d, 0.000001d); }
public static decimal CalculateIRR(this IReadOnlyPortfolio portfolio, DateRange dateRange) { // Get the initial portfolio value var initialHoldings = portfolio.Holdings.All(dateRange.FromDate); var initialHoldingsValue = initialHoldings.Sum(x => x.Value(dateRange.FromDate)); var initialCashBalance = portfolio.CashAccount.Balance(dateRange.FromDate); var initialValue = initialHoldingsValue + initialCashBalance; // Get the final portfolio value var finalHoldings = portfolio.Holdings.All(dateRange.ToDate); var finalHoldingsValue = finalHoldings.Sum(x => x.Value(dateRange.ToDate)); var finalCashBalance = portfolio.CashAccount.Balance(dateRange.ToDate); var finalValue = finalHoldingsValue + finalCashBalance; // Generate list of cashFlows var cashFlows = new CashFlows(); var transactionRange = new DateRange(dateRange.FromDate.AddDays(1), dateRange.ToDate); var transactions = portfolio.CashAccount.Transactions.InDateRange(transactionRange) .Where(x => (x.Type == BankAccountTransactionType.Deposit) || ((x.Type == BankAccountTransactionType.Withdrawl))); foreach (var transaction in transactions) { cashFlows.Add(transaction.Date, -transaction.Amount); } var irr = IrrCalculator.CalculateIrr(dateRange.FromDate, initialValue, dateRange.ToDate, finalValue, cashFlows); return((decimal)Math.Round(irr, 5)); }
private void SetCashFlows(int count) { if (count == 0) { CashFlows.Clear(); } else if (count < CashFlows.Count) { while (count < CashFlows.Count) { CashFlows.RemoveAt(CashFlows.Count - 1); } } else if (count > CashFlows.Count) { while (count > CashFlows.Count) { var index = CashFlows.Count; CashFlows.Add(new CashFlow { Index = index + 1 }); } } }
public override void LoadData() { CashFlows.Clear(); var cashFlowList = CachedService.GetAllCashFlows().Where(x => x.Id != CashFlowToDelete.Id); cashFlowList.ForEach(x => CashFlows.Add(x)); SelectedCashFlow = CashFlows.FirstOrDefault(); }
public void GetCashFlowsPartialList() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2000, 01, 01), 100.00m); cashFlows.Add(new Date(2000, 03, 01), 200.00m); cashFlows.Add(new Date(2000, 02, 01), 300.00m); cashFlows.Add(new Date(2000, 03, 01), 400.00m); cashFlows.Add(new Date(2000, 04, 01), 500.00m); cashFlows.GetCashFlows(new Date(2000, 01, 15), 10.00m, new Date(2000, 03, 15), 600.00m, out var values, out var periods); using (new AssertionScope()) { values.Should().Equal(new double[] { -10d, 300.00d, 600.00d, 600.00d }); periods.Should().Equal(new double[] { 0, 17 / 365d, (17 + 29) / 365d, (17 + 29 + 14) / 365d }); } }
public void GetCashFlowsEntryMatchingEndDate() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2000, 02, 01), 100.00m); cashFlows.Add(new Date(2000, 04, 01), 200.00m); cashFlows.Add(new Date(2000, 03, 01), 300.00m); cashFlows.Add(new Date(2000, 04, 01), 400.00m); cashFlows.Add(new Date(2000, 05, 01), 500.00m); cashFlows.GetCashFlows(new Date(2000, 01, 01), 10.00m, new Date(2000, 05, 01), 600.00m, out var values, out var periods); using (new AssertionScope()) { values.Should().Equal(new double[] { -10d, 100.00d, 300.00d, 600.00d, 1100d }); periods.Should().Equal(new double[] { 0, 31 / 365d, (31 + 29) / 365d, (31 + 29 + 31) / 365d, (31 + 29 + 31 + 30) / 365d }); } }
public void GetCashFlowsOnlyZeroValues() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2000, 02, 01), 0.00m); cashFlows.Add(new Date(2000, 04, 01), 0.00m); cashFlows.Add(new Date(2000, 03, 01), 0.00m); cashFlows.Add(new Date(2000, 04, 01), 0.00m); cashFlows.Add(new Date(2000, 05, 01), 0.00m); cashFlows.GetCashFlows(new Date(2000, 01, 01), 10.00m, new Date(2001, 01, 01), 20.00m, out var values, out var periods); using (new AssertionScope()) { values.Should().Equal(new double[] { -10d, 20d }); periods.Should().Equal(new double[] { 0, 366 / 365d }); } }
public void SingleCashFlow() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2001, 01, 01), -1000.00m); var result = IrrCalculator.CalculateIrr(new Date(2000, 01, 01), 1000.00m, new Date(2005, 12, 31), 2500.00m, cashFlows); result.Should().BeApproximately(0.0413562d, 0.000001d); }
private void LoadCashFlows() { Diagnostics.Start(); ExpensesGridCashFlows.IsNotifying = false; ExpensesGridCashFlows.Clear(); CashFlows.Clear(); var cashFlowList = CachedService.GetAllCashFlows(); cashFlowList.ForEach(x => ExpensesGridCashFlows.Add(x)); cashFlowList.ForEach(x => CashFlows.Add(x)); ExpensesGridCashFlows.IsNotifying = true; SelectedExpenseCashFlow = CashFlows.FirstOrDefault(); NotifyOfPropertyChange(() => ExpensesGridCashFlows); Diagnostics.Stop(); }
public void LessThanOneYear() { var cashFlows = new CashFlows(); cashFlows.Add(new Date(2000, 02, 01), -1000.00m); cashFlows.Add(new Date(2000, 03, 01), 500.00m); cashFlows.Add(new Date(2000, 04, 01), -1500.00m); cashFlows.Add(new Date(2000, 05, 01), -1500.00m); cashFlows.Add(new Date(2000, 06, 01), 500.00m); cashFlows.Add(new Date(2000, 07, 01), -2000.00m); var result = IrrCalculator.CalculateIrr(new Date(2000, 01, 01), 1000.00m, new Date(2000, 08, 30), 10000.00m, cashFlows); result.Should().BeApproximately(2.5071595d, 0.000001d); }