C#来模仿Excel SLOPE函数

我试图计算两个数据列表的斜率。 您可以使用SLOPEfunction轻松地在EXCEL中计算此值。 =SLOPE(A1:A100, B1:B100) 。 我试图在C#WinForm中模仿这个函数。 这里是我的代码,它可以计算出一些东西,但不是从Excel函数中得到的正确数字。 请帮我看看这里的错误。 非常感谢!

 private double Getslope(List<double> ProductGrossExcessReturnOverRFR, List<double> primaryIndexExcessReturnOverRFR, int months, int go_back = 0) { double slope = 0; double sumx = 0, sumy = 0, sumxy = 0, sumx2 = 0; for (int i = ProductGrossExcessReturnOverRFR.Count - 1 - go_back; i > ProductGrossExcessReturnOverRFR.Count - (1 + months + go_back); i--) { sumxy += ProductGrossExcessReturnOverRFR[i] * primaryIndexExcessReturnOverRFR[i]; sumx += ProductGrossExcessReturnOverRFR[i]; sumy += primaryIndexExcessReturnOverRFR[i]; sumx2 += ProductGrossExcessReturnOverRFR[i] * ProductGrossExcessReturnOverRFR[i]; } return slope = 1 / (((sumxy - sumx * sumy / months) / (sumx2 - sumx * sumx / months))); } 

testing数据:
{1.085231224, 2.335034309, 0.346667278}
{3.185231224,3.705034309 , -0.883332722}如果在Excel中使用=SLOPE函数计算,则斜率应该为0.3373。 但是我的代码以某种方式产生0.47 …

我认为你的公式是错误的

根据Excel文档,SLOPE的公式是

还要注意函数的第一个参数是y值。

目前还不清楚gobackmonths如何适用,但看起来像这样可能工作:

 private double Getslope(List<double> ProductGrossExcessReturnOverRFR, List<double> primaryIndexExcessReturnOverRFR, int months, int go_back = 0) { // calc # of items to skip int skip = ProductGrossExcessReturnOverRFR.Count - go_back - months; // get list of x's and y's var ys = ProductGrossExcessReturnOverRFR.Skip(skip).Take(months); var xs = primaryIndexExcessReturnOverRFR.Skip(skip).Take(months); // "zip" xs and ys to make the sum of products easier var xys = Enumerable.Zip(xs,ys, (x, y) => new {x = x, y = y}); double xbar = xs.Average(); double ybar = ys.Average(); double slope = xys.Sum(xy => (xy.x - xbar) * (xy.y - ybar)) / xs.Sum(x => (x - xbar)*(x - xbar)); return slope; }