示例#1
0
        public void AddOpDoubleTimeSeries_AddsDoubles()
        {
            var doubleTimeSeries1 = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new[] { 1.0, 2.0, 3.0 });
            var doubleTimeSeries2 = new DoubleTimeSeries <Month>(Month.CreateFebruary(2020), new[] { 1.8, 2.1 });

            DoubleTimeSeries <Month> doubleTimeSeriesAdded = doubleTimeSeries1 + doubleTimeSeries2;

            Assert.AreEqual(3, doubleTimeSeriesAdded.Count);
            Assert.AreEqual(1.0, doubleTimeSeriesAdded[Month.CreateJanuary(2020)]);
            Assert.AreEqual(3.8, doubleTimeSeriesAdded[Month.CreateFebruary(2020)]);
            Assert.AreEqual(5.1, doubleTimeSeriesAdded[Month.CreateMarch(2020)]);
        }
示例#2
0
        public void SubtractOpDoubleTimeSeries_ParameterIndicesStartLater_ThrowsArgumentException()
        {
            var doubleTimeSeries1 = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new[] { 1.0, 2.0, 3.0 });
            var doubleTimeSeries2 = new DoubleTimeSeries <Month>(Month.CreateMarch(2019), new[] { 1.8, 2.1 });

            Assert.Throws(Is.TypeOf <ArgumentException>().And.Message.EqualTo("DoubleTimeSeries parameter instance has indices which are non-overlapping with the indices of the current instance."),
                          () =>
            {
                // ReSharper disable once UnusedVariable
                var doubleTimeSeriesSubtracted = doubleTimeSeries1 - doubleTimeSeries2;
            });
        }
示例#3
0
        public void SubtractOpDoubleTimeSeries_SubtractsDoubles()
        {
            var doubleTimeSeries1 = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new[] { 1.0, 2.0, 3.0 });
            var doubleTimeSeries2 = new DoubleTimeSeries <Month>(Month.CreateFebruary(2020), new[] { 1.8, 2.1 });

            DoubleTimeSeries <Month> doubleTimeSeriesSubtracted = doubleTimeSeries1 - doubleTimeSeries2;

            Assert.AreEqual(3, doubleTimeSeriesSubtracted.Count);
            Assert.AreEqual(1.0, doubleTimeSeriesSubtracted[Month.CreateJanuary(2020)]);
            Assert.AreEqual(2.0 - 1.8, doubleTimeSeriesSubtracted[Month.CreateFebruary(2020)]);
            Assert.AreEqual(3.0 - 2.1, doubleTimeSeriesSubtracted[Month.CreateMarch(2020)]);
        }
示例#4
0
        public void SubtractOpDoubleTimeSeries_LeftOperandIsEmpty_ThrowsInvalidOperationException()
        {
            var doubleTimeSeries1 = new DoubleTimeSeries <Month>();
            var doubleTimeSeries2 = new DoubleTimeSeries <Month>(Month.CreateFebruary(2020), new[] { 1.8, 2.1 });

            Assert.Throws(Is.TypeOf <InvalidOperationException>().And.Message.EqualTo("TimeSeries is empty."),
                          () =>
            {
                // ReSharper disable once UnusedVariable
                var doubleTimeSeriesSubtracted = doubleTimeSeries1 - doubleTimeSeries2;
            });
        }
示例#5
0
        public void MultiplyOpDoubleTimeSeries_MultipliesDoubles()
        {
            var doubleTimeSeries1 = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new[] { 1.0, 2.0, 3.0 });
            var doubleTimeSeries2 = new DoubleTimeSeries <Month>(Month.CreateFebruary(2020), new[] { 1.8, 2.1 });

            DoubleTimeSeries <Month> doubleTimeSeriesMultiplied = doubleTimeSeries1 * doubleTimeSeries2;

            Assert.AreEqual(3, doubleTimeSeriesMultiplied.Count);
            Assert.AreEqual(1.0, doubleTimeSeriesMultiplied[Month.CreateJanuary(2020)]);
            Assert.AreEqual(2.0 * 1.8, doubleTimeSeriesMultiplied[Month.CreateFebruary(2020)]);
            Assert.AreEqual(3.0 * 2.1, doubleTimeSeriesMultiplied[Month.CreateMarch(2020)]);
        }
示例#6
0
        public void AddOpDoubleOnRight_AddsNumberToData()
        {
            var    doubleTimeSeries = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new [] { 1.0, 2.0, 3.0 });
            double doubleToAdd      = 5.5;

            DoubleTimeSeries <Month> doubleTimeSeriesAfterAdd = doubleTimeSeries + doubleToAdd;

            foreach ((Month month, double value) in doubleTimeSeriesAfterAdd)
            {
                Assert.AreEqual(doubleTimeSeries[month] + doubleToAdd, value);
            }
            Assert.AreEqual(doubleTimeSeries.Count, doubleTimeSeriesAfterAdd.Count);
        }
示例#7
0
        public void BuilderWithData_ConstructedWithCapacityParameter_AddsPointsToBuiltSeries()
        {
            var timeSeries = new DoubleTimeSeries <Month> .Builder(1)
                             .WithData(Month.CreateJanuary(2019), 1.0)
                             .WithData(Month.CreateFebruary(2019), 2.0)
                             .WithData(Month.CreateMarch(2019), 3.0)
                             .Build();

            Assert.AreEqual(3, timeSeries.Count);
            Assert.AreEqual(1.0, timeSeries[Month.CreateJanuary(2019)]);
            Assert.AreEqual(2.0, timeSeries[Month.CreateFebruary(2019)]);
            Assert.AreEqual(3.0, timeSeries[Month.CreateMarch(2019)]);
        }
示例#8
0
        public void DivideOp_DividesNumberFromData()
        {
            var    doubleTimeSeries = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new[] { 1.0, 2.0, 3.0 });
            double doubleToDivides  = 5.5;

            DoubleTimeSeries <Month> doubleTimeSeriesAfterAdd = doubleTimeSeries / doubleToDivides;

            foreach ((Month month, double value) in doubleTimeSeriesAfterAdd)
            {
                Assert.AreEqual(doubleTimeSeries[month] / doubleToDivides, value);
            }
            Assert.AreEqual(doubleTimeSeries.Count, doubleTimeSeriesAfterAdd.Count);
        }
示例#9
0
        public void SubtractOp_SubtractsNumberFromData()
        {
            var    doubleTimeSeries = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new[] { 1.0, 2.0, 3.0 });
            double doubleToSubtract = 5.5;

            DoubleTimeSeries <Month> doubleTimeSeriesAfterAdd = doubleTimeSeries - doubleToSubtract;

            foreach ((Month month, double value) in doubleTimeSeriesAfterAdd)
            {
                Assert.AreEqual(doubleTimeSeries[month] - doubleToSubtract, value);
            }
            Assert.AreEqual(doubleTimeSeries.Count, doubleTimeSeriesAfterAdd.Count);
        }
示例#10
0
        public void MultiplyOpDoubleOnLeft_MultipliesDataByNumber()
        {
            var    doubleTimeSeries = new DoubleTimeSeries <Month>(Month.CreateJanuary(2020), new[] { 1.0, 2.0, 3.0 });
            double doubleToMultiply = 5.5;

            DoubleTimeSeries <Month> doubleTimeSeriesAfterAdd = doubleToMultiply * doubleTimeSeries;

            foreach ((Month month, double value) in doubleTimeSeriesAfterAdd)
            {
                Assert.AreEqual(doubleTimeSeries[month] * doubleToMultiply, value);
            }
            Assert.AreEqual(doubleTimeSeries.Count, doubleTimeSeriesAfterAdd.Count);
        }
示例#11
0
        public void BuilderBuild_AsExpected()
        {
            var timeSeries = new DoubleTimeSeries <Month> .Builder
            {
                { Month.CreateJanuary(2019), 1.0 },
                { Month.CreateFebruary(2019), 2.0 },
                { Month.CreateMarch(2019), 3.0 }
            }.Build();

            Assert.AreEqual(3, timeSeries.Count);
            Assert.AreEqual(1.0, timeSeries[Month.CreateJanuary(2019)]);
            Assert.AreEqual(2.0, timeSeries[Month.CreateFebruary(2019)]);
            Assert.AreEqual(3.0, timeSeries[Month.CreateMarch(2019)]);
        }
示例#12
0
        private static TreeStorageValuationResults <T> TrinomialStorageValuationIntrinsic <T>(
            DateTime valuationDateTime,
            DateTime storageStartDateTime,
            DateTime storageEndDateTime,
            object injectWithdrawConstraints,
            string injectWithdrawInterpolation,
            double injectionCostRate,
            double cmdtyConsumedOnInjection,
            double withdrawalCostRate,
            double cmdtyConsumedOnWithdrawal,
            double currentInventory,
            object forwardCurveIn,
            object interestRateCurve,
            object numGlobalGridPointsIn,
            object numericalToleranceIn)
            where T : ITimePeriod <T>
        {
            double numericalTolerance = StorageExcelHelper.DefaultIfExcelEmptyOrMissing(numericalToleranceIn, 1E-10,
                                                                                        "Numerical_tolerance");

            var storage = StorageExcelHelper.CreateCmdtyStorageFromExcelInputs <T>(storageStartDateTime,
                                                                                   storageEndDateTime, injectWithdrawConstraints, injectWithdrawInterpolation, injectionCostRate, cmdtyConsumedOnInjection,
                                                                                   withdrawalCostRate, cmdtyConsumedOnWithdrawal, numericalTolerance);

            T currentPeriod = TimePeriodFactory.FromDateTime <T>(valuationDateTime);

            DoubleTimeSeries <T> forwardCurve = StorageExcelHelper.CreateDoubleTimeSeries <T>(forwardCurveIn, "Forward_curve");

            // TODO input settlement dates
            int numGridPoints =
                StorageExcelHelper.DefaultIfExcelEmptyOrMissing <int>(numGlobalGridPointsIn, 100, "Num_global_grid_points");

            Func <Day, double> interpolatedInterestRates =
                StorageExcelHelper.CreateLinearInterpolatedInterestRateFunc(interestRateCurve, ExcelArg.InterestRateCurve.Name);

            TreeStorageValuationResults <T> valuationResults = TreeStorageValuation <T>
                                                               .ForStorage(storage)
                                                               .WithStartingInventory(currentInventory)
                                                               .ForCurrentPeriod(currentPeriod)
                                                               .WithForwardCurve(forwardCurve)
                                                               .WithIntrinsicTree()
                                                               .WithCmdtySettlementRule(period => period.First <Day>()) // TODO get rid if this
                                                               .WithAct365ContinuouslyCompoundedInterestRate(interpolatedInterestRates)
                                                               .WithFixedNumberOfPointsOnGlobalInventoryRange(numGridPoints)
                                                               .WithLinearInventorySpaceInterpolation()
                                                               .WithNumericalTolerance(numericalTolerance)
                                                               .Calculate();

            return(valuationResults);
        }
示例#13
0
        public void PlotTimeSeries(DoubleTimeSeries ts, string titletext, Color color, RenderAs linetype)
        {
            if (!keepSeries.IsChecked.Value)
            {
                clearSeries_Click(null, null);
            }

            if (keepSeries.IsChecked.Value)
            {
                timeseriesChart.Titles[0].Text = "";
            }
            else
            {
                timeseriesChart.Titles[0].Text = titletext;
            }

            _DoubleTimeSeries = ts;
            var dataSeries = new DataSeries();

            // Set DataSeries properties
            dataSeries.RenderAs      = RenderAs.QuickLine;
            dataSeries.XValueType    = ChartValueTypes.DateTime;
            dataSeries.LegendText    = titletext;
            dataSeries.LineThickness = 2;

            double max   = ts.Values.Max();
            double min   = ts.Values.Min();
            double range = max - min;
            var    axisy = timeseriesChart.AxesY[0];

            if (range > 0)
            {
                var maxy = max + range * 0.1;
                var miny = min - range * 0.1;
                miny = miny < 0 ? 0 : miny;
                axisy.AxisMaximum = maxy;
                axisy.AxisMinimum = miny;
            }

            for (int i = 0; i < ts.DateTimes.Count; i++)
            {
                DataPoint dataPoint = new DataPoint();
                dataPoint.XValue = ts.DateTimes[i];
                dataPoint.YValue = ts.Values[i];
                dataSeries.DataPoints.Add(dataPoint);
            }
            dataSeries.Color = new SolidColorBrush(color);
            timeseriesChart.Series.Add(dataSeries);
        }
示例#14
0
        public void ForConstantData_AsExpected()
        {
            var                    start      = new Day(2020, 9, 30);
            var                    end        = new Day(2020, 12, 15);
            const double           data       = 1.25;
            DoubleTimeSeries <Day> timeSeries = DoubleTimeSeries.ForConstantData(start, end, data);

            Assert.AreEqual(start, timeSeries.Start);
            Assert.AreEqual(end, timeSeries.End);

            foreach (double x in timeSeries.Data)
            {
                Assert.AreEqual(data, x);
            }
        }
示例#15
0
        private void btnOpenCSVData_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();

            dlg.Multiselect = false;
            dlg.Filter      = "csv Files (*.csv)|*.csv|All Files (*.*)|*.*";
            if (!(dlg.ShowDialog() ?? false))
            {
                return;
            }
            var          fs      = dlg.File.OpenRead();
            StreamReader sr      = new StreamReader(fs);
            var          line    = sr.ReadLine();
            var          splitor = new char[] { ',' };
            var          strs    = line.Split(splitor);
            var          nts     = strs.Count() - 1;
            var          legends = new string[nts];

            DoubleTimeSeries[] ts  = new DoubleTimeSeries[nts];
            double[]           vec = new double[nts];
            for (int i = 0; i < nts; i++)
            {
                ts[i]           = new DoubleTimeSeries();
                ts[i].DateTimes = new System.Collections.ObjectModel.ObservableCollection <DateTime>();
                ts[i].Values    = new System.Collections.ObjectModel.ObservableCollection <double>();
            }
            while (!sr.EndOfStream)
            {
                line = sr.ReadLine();
                if (line != "" && line != null)
                {
                    strs = line.Split(splitor);
                    DateTime date = DateTime.Parse(strs[0]);
                    for (int i = 0; i < nts; i++)
                    {
                        ts[i].DateTimes.Add(date);
                        ts[i].Values.Add(double.Parse(strs[i + 1]));
                    }
                }
            }

            sr.Close();
            for (int i = 0; i < nts; i++)
            {
                PlotTimeSeries(ts[i], legends[i]);
            }
        }
示例#16
0
        private static void DoubleTimeSeries()
        {
            #region doubletimeseries
            DoubleTimeSeries <Month> doubleTimeSeries = new DoubleTimeSeries <Month> .Builder()
            {
                { new Month(2020, 1), 45.67 },
                { new Month(2020, 2), 47.01 },
                { new Month(2020, 3), 50.34 },
            }

            .Build();

            Console.WriteLine("DoubleTimeSeries");
            Console.WriteLine(doubleTimeSeries.FormatData("F2"));
            Console.WriteLine();

            DoubleTimeSeries <Month> doubleTimeSeriesAfterMultiply = doubleTimeSeries * 1.3;
            Console.WriteLine("DoubleTimeSeries transformed with multiply operator and double");
            Console.WriteLine(doubleTimeSeriesAfterMultiply.FormatData("F2"));
            Console.WriteLine();

            DoubleTimeSeries <Month> doubleTimeSeriesAfterAdd = doubleTimeSeries + 5.5;
            Console.WriteLine("DoubleTimeSeries transformed with add operator and double");
            Console.WriteLine(doubleTimeSeriesAfterAdd.FormatData("F2"));
            Console.WriteLine();

            DoubleTimeSeries <Month> otherDoubleTimeSeries = new DoubleTimeSeries <Month> .Builder()
            {
                { new Month(2020, 1), 1.3 },
                { new Month(2020, 2), 1.4 },
                { new Month(2020, 3), 1.35 },
            }

            .Build();

            DoubleTimeSeries <Month> timeSeriesSubtracted = doubleTimeSeries - otherDoubleTimeSeries;
            Console.WriteLine("DoubleTimeSeries transformed with minus operator and other DoubleTimeSeries");
            Console.WriteLine(timeSeriesSubtracted.FormatData("F2"));
            Console.WriteLine();

            DoubleTimeSeries <Month> timeSeriesDivided = doubleTimeSeries / otherDoubleTimeSeries;
            Console.WriteLine("DoubleTimeSeries transformed with divide operator and other DoubleTimeSeries");
            Console.WriteLine(timeSeriesDivided.FormatData("F2"));
            Console.WriteLine();

            #endregion
        }
示例#17
0
        public void FromMap_AsExpected()
        {
            var start = new Day(2020, 9, 30);
            var end   = new Day(2020, 12, 15);

            double Map(Day day) => day.OffsetFrom(start);

            DoubleTimeSeries <Day> timeSeries = DoubleTimeSeries.FromMap(start, end, Map);

            Assert.AreEqual(start, timeSeries.Start);
            Assert.AreEqual(end, timeSeries.End);

            foreach ((Day index, double data) in timeSeries)
            {
                double expectedData = Map(index);
                Assert.AreEqual(expectedData, data);
            }
        }
示例#18
0
        private void client_GetDoubleTimeSeriesCompleted(object sender, GetDoubleTimeSeriesCompletedEventArgs e)
        {
            if (e.Error != null || e.Result == null)
            {
                _IsDownloadingTimeSeries = false;
                CurrentAction            = UserAction.None;
                GeneralInfo.Content      = "Failed to download time series";
                return;
            }
            _DoubleTimeSeries = e.Result;
            string title = string.Format("{0} at {1}", _QueryCriteria.VariableName, _SelectedStation.Name);

            ChartWindow.Visibility = System.Windows.Visibility.Visible;
            chart.PlotTimeSeries(_DoubleTimeSeries, title);
            _IsDownloadingTimeSeries = false;
            CurrentAction            = UserAction.Idle;
            GeneralInfo.Content      = _DoubleTimeSeries.DateTimes.Count + " values downloaded";
        }
示例#19
0
        // TODO add spot simulation Markov factors

        public LsmcStorageValuationResults(double npv, DoubleTimeSeries <T> deltas, TimeSeries <T, StorageProfile> expectedStorageProfile,
                                           Panel <T, double> regressionSpotPriceSim, Panel <T, double> valuationSpotPriceSim,
                                           Panel <T, double> inventoryBySim, Panel <T, double> injectWithdrawVolumeBySim, Panel <T, double> cmdtyConsumedBySim,
                                           Panel <T, double> inventoryLossBySim, Panel <T, double> netVolumeBySim, TimeSeries <T, TriggerPrices> triggerPrices,
                                           TimeSeries <T, TriggerPriceVolumeProfiles> triggerPriceVolumeProfiles, Panel <T, double> pvByPeriodAndSim, IEnumerable <double> pvBySim)
        {
            Npv    = npv;
            Deltas = deltas;
            ExpectedStorageProfile     = expectedStorageProfile;
            RegressionSpotPriceSim     = regressionSpotPriceSim;
            ValuationSpotPriceSim      = valuationSpotPriceSim;
            InventoryBySim             = inventoryBySim;
            InjectWithdrawVolumeBySim  = injectWithdrawVolumeBySim;
            CmdtyConsumedBySim         = cmdtyConsumedBySim;
            InventoryLossBySim         = inventoryLossBySim;
            NetVolumeBySim             = netVolumeBySim;
            TriggerPrices              = triggerPrices;
            TriggerPriceVolumeProfiles = triggerPriceVolumeProfiles;
            PvByPeriodAndSim           = pvByPeriodAndSim;
            PvBySim = pvBySim.ToArray();
        }
示例#20
0
        public static DoubleTimeSeries <T> CreateDoubleTimeSeries <T>(object excelValues, string excelArgumentName)
            where T : ITimePeriod <T>
        {
            if (excelValues is ExcelMissing || excelValues is ExcelEmpty)
            {
                throw new ArgumentException(excelArgumentName + " hasn't been specified.");
            }

            if (!(excelValues is object[,] excelValuesArray))
            {
                throw new ArgumentException(excelArgumentName + " has been incorrectly entered. Argument value should be of a range with 2 columns, the first containing dates, the second containing numbers.");
            }

            if (excelValuesArray.GetLength(1) != 2)
            {
                throw new ArgumentException(excelArgumentName + " has been incorrectly entered. Argument value should be a range with 2 columns.");
            }

            var builder = new DoubleTimeSeries <T> .Builder();

            for (int i = 0; i < excelValuesArray.GetLength(0); i++)
            {
                if (excelValuesArray[i, 0] is ExcelEmpty || excelValuesArray[i, 0] is ExcelError)
                {
                    break;
                }

                if (!(excelValuesArray[i, 1] is double doubleValue))
                {
                    throw new ArgumentException($"Value in the second column of row {i} for argument {excelArgumentName} is not a number.");
                }

                DateTime curvePointDateTime = ObjectToDateTime(excelValuesArray[i, 0], $"Cannot create DateTime from value in first row of argument {excelArgumentName}.");
                T        curvePointPeriod   = TimePeriodFactory.FromDateTime <T>(curvePointDateTime);

                builder.Add(curvePointPeriod, doubleValue);
            }

            return(builder.Build());
        }
示例#21
0
        internal static CallOptionLikeTestData CreateThreeCallsLikeStorageTestData(DoubleTimeSeries <Day> forwardCurve)
        {
            var callOption1Date = new Day(2019, 12, 15);
            var callOption2Date = new Day(2020, 1, 20);
            var callOption3Date = new Day(2020, 3, 31);

            var storageStart = new Day(2019, 12, 1);
            var storageEnd   = new Day(2020, 4, 1);

            const double callOption1Notional = 1200.0;
            const double callOption2Notional = 800.0;
            const double callOption3Notional = 900.0;

            const double storageStartingInventory = callOption1Notional + callOption2Notional + callOption3Notional;

            TimeSeries <Month, Day> settlementDates = new TimeSeries <Month, Day> .Builder()
            {
                { new Month(2019, 12), new Day(2020, 1, 20) },
                { new Month(2020, 1), new Day(2020, 2, 18) },
                { new Month(2020, 2), new Day(2020, 3, 21) },
                { new Month(2020, 3), new Day(2020, 4, 22) }
            }

            .Build();

            // Make all call options at or out of the money so we are only looking at extrinsic value
            double callOption1Strike = forwardCurve[callOption1Date];
            double callOption2Strike = forwardCurve[callOption2Date] + 2.0;
            double callOption3Strike = forwardCurve[callOption3Date] + 2.8;

            var injectWithdrawConstraints = new List <InjectWithdrawRangeByInventoryAndPeriod <Day> >
            {
                (period : storageStart, injectWithdrawRanges : new List <InjectWithdrawRangeByInventory>
                {
                    (inventory : 0.0, (minInjectWithdrawRate : 0.0, maxInjectWithdrawRate : 0.0)),
                    (inventory : storageStartingInventory, (minInjectWithdrawRate : 0.0, maxInjectWithdrawRate : 0.0)),
                }),
示例#22
0
 public void Deconstruct(out double storageNpv, out DoubleTimeSeries <T> decisionProfile, out DoubleTimeSeries <T> cmdtyVolumeConsumed)
 {
     storageNpv          = StorageNpv;
     decisionProfile     = DecisionProfile;
     cmdtyVolumeConsumed = CmdtyVolumeConsumed;
 }