コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }