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));
        }
Esempio n. 6
0
        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);
        }
Esempio n. 12
0
        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);
        }