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