使用C#计算复合年增长率(CAGR)

时间:2020-09-15 14:23:24

标签: c# .net dictionary

我到处搜索以找到一种计算C#的复合年增长率(CAGR)的方法,但似乎工作的人并不多。所以在这里发布它,以便有一天能对某人有所帮助。

2 个答案:

答案 0 :(得分:2)

我用字典制作的,结果完全像这个链接。 在Excel中计算复合年增长率(CAGR)的公式是什么?[^]

public static void CalculateCAGR() {
    Dictionary<DateTime, int> lst = new Dictionary<DateTime, int>();
    lst.Add(new DateTime(2011, 11, 05), 100);
    lst.Add(new DateTime(2012, 11, 05), 115);
    lst.Add(new DateTime(2013, 11, 05), 118);
    lst.Add(new DateTime(2014, 11, 05), 121);
    lst.Add(new DateTime(2015, 11, 05), 130);
    lst.Add(new DateTime(2016, 11, 05), 144);
    lst.Add(new DateTime(2017, 11, 05), 135);
    lst.Add(new DateTime(2018, 11, 05), 132);
    lst.Add(new DateTime(2019, 11, 05), 138);
    lst.Add(new DateTime(2020, 03, 16), 161);

    var keys = new List<DateTime>(lst.Keys);

    DateTime zeroTime = new DateTime(1, 1, 1);
    double remainderInDays = 0;
    double remainder = 0;
    double yearsResult = 0;
    int numberOfCompletedYears = 0;
    TimeSpan yearSpan;
    double endingBeginning = 0;
    double? result = 0;
    double? CAGR = 0;

    var firstElement = lst.FirstOrDefault();
    int beginningValue = firstElement.Value;
    int lastValue = lst.Values.Last();

    for (int i = 0; i < keys.Count - 1; i++)
    {
        remainderInDays = (keys[i + 1] - keys[i]).TotalDays;
    }

    for (int i = 0; i < keys.Count - 1; i++)
    {
        yearSpan = (keys[i + 1] - keys[i]);
        numberOfCompletedYears += (zeroTime + yearSpan).Year - 1;
    }

    remainder = remainderInDays / 365;  //Converted to Years
    endingBeginning = 1.0*lastValue / beginningValue;
    yearsResult = 1/(numberOfCompletedYears + remainder);
    result = (Math.Pow(endingBeginning, yearsResult)) - 1;
    CAGR = result * 100;
}

答案 1 :(得分:0)

CAGR公式为: CAGR =(EV / SV)1 / n-1

其中:

EV =投资的最终价值

SV =投资的初始值

n =投资年数

您可以像这样(控制台应用示例)在C#中应用公式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tst
{
   class Program
   {
       static void Main(string[] args)
       {
          //Your code goes here
          int years = 5; //number of years
          double BeginningValue =  200000;//Begging value of investment in dollars
          double EndingValue = 450000;//Ending value of investment in dollars
        
          double total = (Math.Pow((EndingValue / BeginningValue), (double)1 / 
          (double)years) -1)*100;
          Console.WriteLine(total.ToString());
          Console.ReadLine();
       }
   }
}