From affe9fdded6bd648ace50835d431ab5ee42e72a8 Mon Sep 17 00:00:00 2001 From: Chika Date: Mon, 19 Oct 2020 21:57:58 +0300 Subject: [PATCH] XIRR Goal Seek | Happy Birthday to me --- .../.idea/workspace.xml | 168 +++++++++--------- .../Columns/BaseColumnWithXIRR.cs | 2 +- .../Columns/SumColumn.cs | 19 +- .../Calculation/Columns/SumColumnTest.cs | 130 ++++++++++++++ 4 files changed, 228 insertions(+), 91 deletions(-) diff --git a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml index f47f427..a2538c9 100644 --- a/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml +++ b/.idea/.idea.EvoCalculator.Core/.idea/workspace.xml @@ -14,35 +14,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + + + - @@ -121,11 +112,11 @@ @@ -194,7 +185,7 @@ - + 1602593830686 @@ -242,90 +233,90 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + @@ -334,10 +325,10 @@ - + - + @@ -358,10 +349,10 @@ - + - + @@ -371,25 +362,34 @@ - file://$PROJECT_DIR$/EvoCalculator.Core.Calculation/Columns/SumColumn.cs - 41 - + file://$PROJECT_DIR$/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs + 308 + - - - + + + + + + + + + \ No newline at end of file diff --git a/EvoCalculator.Core.Calculation/Columns/BaseColumnWithXIRR.cs b/EvoCalculator.Core.Calculation/Columns/BaseColumnWithXIRR.cs index f6c3153..0002e64 100644 --- a/EvoCalculator.Core.Calculation/Columns/BaseColumnWithXIRR.cs +++ b/EvoCalculator.Core.Calculation/Columns/BaseColumnWithXIRR.cs @@ -7,7 +7,7 @@ namespace EvoCalculator.Core.Calculation.Columns public class BaseColumnWithXIRR : BaseColumn { public double IRR { get; set; } - private DateTime[] Dates { get; set; } + protected DateTime[] Dates { get; set; } public BaseColumnWithXIRR(int count, DateTempColumn dateTempColumn) : base(count) diff --git a/EvoCalculator.Core.Calculation/Columns/SumColumn.cs b/EvoCalculator.Core.Calculation/Columns/SumColumn.cs index 015481a..e572815 100644 --- a/EvoCalculator.Core.Calculation/Columns/SumColumn.cs +++ b/EvoCalculator.Core.Calculation/Columns/SumColumn.cs @@ -19,14 +19,14 @@ namespace EvoCalculator.Core.Calculation.Columns this._percentPaymentColumn = percentPaymentColumn; } - public void ComputeValues() + public void ComputeValues(double x) { Values[0] = -this._preparedValues.BaseCost; Values[1] = this._preparedValues.FirstPaymentSum; - for (var i = 3; i < Values.Length - 1; i++) + for (var i = 2; i < Values.Length - 1; i++) { - Values[i] = Values[2] * _percentPaymentColumn.Values[i] / 100; + Values[i] = x * _percentPaymentColumn.Values[i] / 100; } Values[^1] = _preparedValues.LastPaymentSum; @@ -34,8 +34,8 @@ namespace EvoCalculator.Core.Calculation.Columns public decimal Calculate(decimal inputVariable) { - Values[2] = Convert.ToDouble(inputVariable); - this.ComputeValues(); + var x = Convert.ToDouble(inputVariable); + this.ComputeValues(x); var XIRR = new XIRR(Flows); IRR = XIRR.GetResult(); @@ -46,7 +46,14 @@ namespace EvoCalculator.Core.Calculation.Columns { var goalSeek = new GoalSeek(this); goalSeek.SeekResult(requiredIRR, - new GoalSeekOptions(initialTineSpacing: 10000)); + new GoalSeekOptions( + startingStabPoint: Convert.ToDecimal(this._preparedValues.BaseCost / this._preparedValues.Nmper) + , tineExplorePercentage: 10 + // , maximumAttempts: 10000 + // , initialTineSpacing: 1 + // , focusPercentage: 100 + // , trimFinalInputValue: true + )); } } } \ No newline at end of file diff --git a/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs b/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs index 901e074..a13c135 100644 --- a/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs +++ b/EvoCalculator.Core.Tests/Calculation/Columns/SumColumnTest.cs @@ -178,5 +178,135 @@ namespace EvoCalculator.Core.Tests.Calculation.Columns var values = sumColumn.Values; Assert.Equal(expected, values); } + + [Fact] + public void SumColumnTest2() + { + var preparedValues = + new PreparedValues() + { + BaseCost = 2500000, + FirstPaymentSum = 625000, + Nmper = 12, + LastPaymentSum = 25000, + IrrExpected = 0.304 + }; + + + var percentPaymentColumn = new PercentPaymentColumn(preparedValues.Nmper + 1) + { + Values = new[] + { + 0.00, + 0.00, + 100.00, + 100.00, + 100.00, + 100.00, + 100.00, + 100.00, + 100.00, + 100.00, + 100.00, + 100.00, + 0.00, + } + }; + + var dateTempColumn = new DateTempColumn(67) + { + Values = new[] + { + new DateTime(2020, 10, 19), + new DateTime(2020, 10, 19), + new DateTime(2020, 11, 19), + new DateTime(2020, 12, 19), + new DateTime(2021, 1, 19), + new DateTime(2021, 2, 19), + new DateTime(2021, 3, 19), + new DateTime(2021, 4, 19), + new DateTime(2021, 5, 19), + new DateTime(2021, 6, 19), + new DateTime(2021, 7, 19), + new DateTime(2021, 8, 19), + new DateTime(2021, 9, 19), + new DateTime(2021, 10, 19), + new DateTime(2021, 11, 19), + new DateTime(2021, 12, 19), + new DateTime(2022, 1, 19), + new DateTime(2022, 2, 19), + new DateTime(2022, 3, 19), + new DateTime(2022, 4, 19), + new DateTime(2022, 5, 19), + new DateTime(2022, 6, 19), + new DateTime(2022, 7, 19), + new DateTime(2022, 8, 19), + new DateTime(2022, 9, 19), + new DateTime(2022, 10, 19), + new DateTime(2022, 11, 19), + new DateTime(2022, 12, 19), + new DateTime(2023, 1, 19), + new DateTime(2023, 2, 19), + new DateTime(2023, 3, 19), + new DateTime(2023, 4, 19), + new DateTime(2023, 5, 19), + new DateTime(2023, 6, 19), + new DateTime(2023, 7, 19), + new DateTime(2023, 8, 19), + new DateTime(2023, 9, 19), + new DateTime(2023, 10, 19), + new DateTime(2023, 11, 19), + new DateTime(2023, 12, 19), + new DateTime(2024, 1, 19), + new DateTime(2024, 2, 19), + new DateTime(2024, 3, 19), + new DateTime(2024, 4, 19), + new DateTime(2024, 5, 19), + new DateTime(2024, 6, 19), + new DateTime(2024, 7, 19), + new DateTime(2024, 8, 19), + new DateTime(2024, 9, 19), + new DateTime(2024, 10, 19), + new DateTime(2024, 11, 19), + new DateTime(2024, 12, 19), + new DateTime(2025, 1, 19), + new DateTime(2025, 2, 19), + new DateTime(2025, 3, 19), + new DateTime(2025, 4, 19), + new DateTime(2025, 5, 19), + new DateTime(2025, 6, 19), + new DateTime(2025, 7, 19), + new DateTime(2025, 8, 19), + new DateTime(2025, 9, 19), + } + }; + + + var expected = new[] + { + -2500000, + 625000, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 209113.783333333, + 25000 + }; + + var sumColumn = new SumColumn( + preparedValues.Nmper + 1 + , dateTempColumn + , preparedValues + , percentPaymentColumn); + sumColumn.ComputeValues(Convert.ToDecimal(preparedValues.IrrExpected)); + var values = sumColumn.Values; + Assert.Equal(expected, values); + } } } \ No newline at end of file