public void BuildYahooNormalized_ShouldBuildCorrectYahooNormalized() { var date = new DateTime(2015, 01, 01); var record = new YahooRecord { Date = date, Open = 1.1230004, High = 2.1230004, Low = 0.1230004, Close = 2.0230004, Volume = 123456789012 }; var yahooNormalized = YahooHelper.BuildYahooNormalized(record, 0.11, 0.13, 0.1234567890123); Assert.AreEqual(date, yahooNormalized.Date); Assert.AreEqual(1.1230004, yahooNormalized.Open); Assert.AreEqual(2.1230004, yahooNormalized.High); Assert.AreEqual(0.1230004, yahooNormalized.Low); Assert.AreEqual(2.0230004, yahooNormalized.Close); Assert.AreEqual(123456789012, yahooNormalized.Volume); Assert.AreEqual(0.11, yahooNormalized.Change); Assert.AreEqual(0.13, yahooNormalized.MovingAverage); Assert.AreEqual(0.1234567890123, yahooNormalized.Volatility); }
public IEnumerable <YahooNormalized> PrepareData(int updatePeriod = 100) { var yahooRecords = Enumerable.Reverse(_yahooDataRepository.CsvLinesNormalized).ToList(); var data = new List <YahooNormalized>(); var period = 0; double mean = 0.0; double variance = 0.0; var index = 0; foreach (var record in yahooRecords) { var change = index > 0 ? MathHelpers.PreservePrecision(record.Close / yahooRecords[index - 1].Close - 1.0) : 0.0; if (period == 0) { mean = record.Close; variance = 0.0; data.Add(YahooHelper.BuildYahooNormalized(record, change, mean, 0.0)); } else { var prevSize = period; var sizeNow = period + 1; mean = (prevSize * mean + record.Close) / sizeNow; var difference = record.Close - mean; variance = (double)prevSize / sizeNow * variance + 1.0 / prevSize * difference * difference; var volatility = MathHelpers.PreservePrecision(Math.Sqrt(variance)); data.Add(YahooHelper.BuildYahooNormalized(record, change, MathHelpers.PreservePrecision(mean), volatility)); } index++; period++; period %= updatePeriod; } return(data); }