public void Removed() { List <BetaResult> results = Indicator.GetBeta(quotes, otherQuotes, 20) .RemoveWarmupPeriods() .ToList(); // assertions Assert.AreEqual(502 - 19, results.Count); BetaResult last = results.LastOrDefault(); Assert.AreEqual(1.6759, Math.Round((double)last.Beta, 4)); }
public void All() { List <BetaResult> results = Indicator .GetBeta(quotes, otherQuotes, 20, BetaType.All) .ToList(); // assertions // proper quantities // should always be the same number of results as there is quotes Assert.AreEqual(502, results.Count); Assert.AreEqual(482, results.Where(x => x.Beta != null).Count()); Assert.AreEqual(482, results.Where(x => x.BetaUp != null).Count()); Assert.AreEqual(482, results.Where(x => x.BetaDown != null).Count()); // sample values BetaResult r19 = results[19]; Assert.IsNull(r19.Beta); Assert.IsNull(r19.BetaUp); Assert.IsNull(r19.BetaDown); Assert.IsNull(r19.Ratio); Assert.IsNull(r19.Convexity); BetaResult r20 = results[20]; Assert.AreEqual(1.5139, Math.Round((double)r20.Beta, 4)); Assert.AreEqual(1.8007, Math.Round((double)r20.BetaUp, 4)); Assert.AreEqual(0.3292, Math.Round((double)r20.BetaDown, 4)); Assert.AreEqual(5.4693, Math.Round((double)r20.Ratio, 4)); Assert.AreEqual(2.1652, Math.Round((double)r20.Convexity, 4)); Assert.AreEqual(-0.010678, Math.Round((double)r20.ReturnsEval, 6)); Assert.AreEqual(0.000419, Math.Round((double)r20.ReturnsMrkt, 6)); BetaResult r249 = results[249]; Assert.AreEqual(1.9200, Math.Round((double)r249.Beta, 4)); Assert.AreEqual(-1.2289, Math.Round((double)r249.BetaUp, 4)); Assert.AreEqual(-0.3956, Math.Round((double)r249.BetaDown, 4)); Assert.AreEqual(3.1066, Math.Round((double)r249.Ratio, 4)); Assert.AreEqual(0.6944, Math.Round((double)r249.Convexity, 4)); BetaResult r501 = results[501]; Assert.AreEqual(1.5123, Math.Round((double)r501.Beta, 4)); Assert.AreEqual(2.0721, Math.Round((double)r501.BetaUp, 4)); Assert.AreEqual(1.5908, Math.Round((double)r501.BetaDown, 4)); Assert.AreEqual(1.3026, Math.Round((double)r501.Ratio, 4)); Assert.AreEqual(0.2316, Math.Round((double)r501.Convexity, 4)); }
public void All() { List <BetaResult> results = Indicator .GetBeta(quotes, otherQuotes, 20, BetaType.All) .ToList(); // assertions // proper quantities // should always be the same number of results as there is quotes Assert.AreEqual(502, results.Count); Assert.AreEqual(483, results.Where(x => x.Beta != null).Count()); Assert.AreEqual(482, results.Where(x => x.BetaUp != null).Count()); Assert.AreEqual(482, results.Where(x => x.BetaDown != null).Count()); // sample values BetaResult r19 = results[19]; Assert.AreEqual(7.5476, Math.Round((double)r19.Beta, 4)); Assert.IsNull(r19.BetaUp); Assert.IsNull(r19.BetaDown); Assert.IsNull(r19.Ratio); Assert.IsNull(r19.Convexity); BetaResult r20 = results[20]; Assert.AreEqual(6.7488, Math.Round((double)r20.Beta, 4)); Assert.AreEqual(8.2407, Math.Round((double)r20.BetaUp, 4)); Assert.AreEqual(5.9296, Math.Round((double)r20.BetaDown, 4)); Assert.AreEqual(1.3898, Math.Round((double)r20.Ratio, 4)); Assert.AreEqual(5.3415, Math.Round((double)r20.Convexity, 4)); BetaResult r249 = results[249]; Assert.AreEqual(3.5528, Math.Round((double)r249.Beta, 4)); Assert.AreEqual(3.1061, Math.Round((double)r249.BetaUp, 4)); Assert.AreEqual(4.0684, Math.Round((double)r249.BetaDown, 4)); Assert.AreEqual(0.7635, Math.Round((double)r249.Ratio, 4)); Assert.AreEqual(0.9260, Math.Round((double)r249.Convexity, 4)); BetaResult r501 = results[501]; Assert.AreEqual(1.6759, Math.Round((double)r501.Beta, 4)); Assert.AreEqual(1.2838, Math.Round((double)r501.BetaUp, 4)); Assert.AreEqual(2.1034, Math.Round((double)r501.BetaDown, 4)); Assert.AreEqual(0.6104, Math.Round((double)r501.Ratio, 4)); Assert.AreEqual(0.6717, Math.Round((double)r501.Convexity, 4)); }
public void Standard() { List <BetaResult> results = Indicator.GetBeta(history, historyOther, 20) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(502, results.Count); Assert.AreEqual(483, results.Where(x => x.Beta != null).Count()); // sample value BetaResult r = results[501]; Assert.AreEqual(1.6759m, Math.Round((decimal)r.Beta, 4)); }
public void GetBetaTest() { int lookbackPeriod = 20; IEnumerable <BetaResult> results = Indicator.GetBeta(history, historyOther, lookbackPeriod); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(502, results.Count()); Assert.AreEqual(502 - lookbackPeriod + 1, results.Where(x => x.Beta != null).Count()); // sample value BetaResult r = results.Where(x => x.Index == 502).FirstOrDefault(); Assert.AreEqual(1.6759m, Math.Round((decimal)r.Beta, 4)); }
public void GetBetaTest() { int lookbackPeriod = 20; IEnumerable <BetaResult> results = Indicator.GetBeta(history, historyOther, lookbackPeriod); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(502, results.Count()); Assert.AreEqual(502 - lookbackPeriod + 1, results.Where(x => x.Beta != null).Count()); // sample value BetaResult r = results.Where(x => x.Date == DateTime.ParseExact("12/31/2018", "MM/dd/yyyy", null)).FirstOrDefault(); Assert.AreEqual((decimal)1.6759, Math.Round((decimal)r.Beta, 4)); }
public void SameSame() { // Beta should be 1 if evaluating against self List <BetaResult> results = Indicator.GetBeta(history, history, 20) .ToList(); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(502, results.Count); Assert.AreEqual(483, results.Where(x => x.Beta != null).Count()); // sample value BetaResult r = results[501]; Assert.AreEqual(1, Math.Round((decimal)r.Beta, 4)); }
public void Down() { List <BetaResult> results = Indicator .GetBeta(quotes, otherQuotes, 20, BetaType.Down) .ToList(); // assertions // proper quantities // should always be the same number of results as there is quotes Assert.AreEqual(502, results.Count); Assert.AreEqual(482, results.Where(x => x.BetaDown != null).Count()); // sample value BetaResult r = results[501]; Assert.AreEqual(2.1034, Math.Round((double)r.BetaDown, 4)); }
public void GetBetaSameTest() { // Beta should be 1 if evaluating against self int lookbackPeriod = 20; IEnumerable <BetaResult> results = Indicator.GetBeta(history, history, lookbackPeriod); // assertions // proper quantities // should always be the same number of results as there is history Assert.AreEqual(502, results.Count()); Assert.AreEqual(502 - lookbackPeriod + 1, results.Where(x => x.Beta != null).Count()); // sample value BetaResult r = results.Where(x => x.Date == DateTime.Parse("12/31/2018")).FirstOrDefault(); Assert.AreEqual(1, Math.Round((decimal)r.Beta, 4)); }
// calculate beta private static void CalcBeta( this BetaResult r, int index, int lookbackPeriods, List <BasicD> bdListMrkt, List <BasicD> bdListEval, BetaType type) { // note: BetaType.All is ineligible for this method // initialize CorrResult c = new(); List <double> dataA = new(lookbackPeriods); List <double> dataB = new(lookbackPeriods); for (int p = index - lookbackPeriods + 1; p <= index; p++) { double a = bdListMrkt[p].Value; double b = bdListEval[p].Value; if (type is BetaType.Standard) { dataA.Add(a); dataB.Add(b); } else if (type is BetaType.Down && a < bdListMrkt[p - 1].Value) { dataA.Add(a); dataB.Add(b); } else if (type is BetaType.Up && a > bdListMrkt[p - 1].Value) { dataA.Add(a); dataB.Add(b); } } if (dataA.Count > 0) { // calculate correlation, covariance, and variance c.CalcCorrelation(dataA.ToArray(), dataB.ToArray()); // calculate beta if (c.Covariance != null && c.VarianceA != null && c.VarianceA != 0) { double?beta = c.Covariance / c.VarianceA; if (type == BetaType.Standard) { r.Beta = beta; } else if (type == BetaType.Down) { r.BetaDown = beta; } else if (type == BetaType.Up) { r.BetaUp = beta; } } } }
// calculate beta private static void CalcBeta( this BetaResult r, int i, int lookbackPeriods, double[] mrktReturns, double[] evalReturns, BetaType type) { // note: BetaType.All is ineligible for this method // initialize CorrResult c = new(); List <double> dataA = new(lookbackPeriods); List <double> dataB = new(lookbackPeriods); for (int p = i - lookbackPeriods + 1; p <= i; p++) { double a = mrktReturns[p]; double b = evalReturns[p]; if (type is BetaType.Standard) { dataA.Add(a); dataB.Add(b); } else if (type is BetaType.Down && a < 0) { dataA.Add(a); dataB.Add(b); } else if (type is BetaType.Up && a > 0) { dataA.Add(a); dataB.Add(b); } } if (dataA.Count > 0) { // calculate correlation, covariance, and variance c.CalcCorrelation(dataA.ToArray(), dataB.ToArray()); // calculate beta if (c.Covariance != null && c.VarianceA != null && c.VarianceA != 0) { double?beta = c.Covariance / c.VarianceA; if (type == BetaType.Standard) { r.Beta = beta; } else if (type == BetaType.Down) { r.BetaDown = beta; } else if (type == BetaType.Up) { r.BetaUp = beta; } } } }