Ejemplo n.º 1
0
        public MultipleLinearRegressor[] Regress(IAssetFxModel model)
        {
            if (_regressors != null)
            {
                return(_regressors);
            }

            var nPaths         = _pathwiseValues.First().Length;
            var finalSchedules = _portfolio.Select(x => x.ExpectedFlowsByPath(model)).ToArray();
            var finalValues    = new double[_dateIndexes.Length][];

            ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d =>
            {
                var exposureDate = _regressionDates[d];
                finalValues[d]   = new double[nPaths];
                foreach (var schedule in finalSchedules)
                {
                    for (var p = 0; p < finalValues[d].Length; p++)
                    {
                        foreach (var flow in schedule[p].Flows)
                        {
                            if (flow.SettleDate > exposureDate)
                            {
                                finalValues[d][p] += flow.Pv;
                            }
                        }
                    }
                }
            }).Wait();

            var o = new MultipleLinearRegressor[_dateIndexes.Length];

            ParallelUtils.Instance.For(0, _dateIndexes.Length, 1, d =>
            {
                if (_regressionDates[d] <= model.BuildDate)
                {
                    var detVec = new double[_pathwiseValues[d][0].Length + 1];
                    detVec[0]  = finalValues[d].Average();
                    o[d]       = new MultipleLinearRegressor(detVec);
                }
                else
                {
                    var mlr = MultipleLinearRegression.Regress(_pathwiseValues[d], finalValues[d]);
                    o[d]    = new MultipleLinearRegressor(mlr);
                }
            }).Wait();
            _regressors = o;
            return(o);
        }
Ejemplo n.º 2
0
        public void Dim2Facts()
        {
            double intercept = 76;
            double w1        = 5;
            double w2        = -2;

            var testFunc = new Func <double[], double>(xs =>
            {
                return(intercept + xs[0] * w1 + xs[1] * w2);
            });

            var nExamples   = 7;
            var predictors  = new double[nExamples][];
            var predictions = new double[nExamples];

            var R = new System.Random();

            for (var e = 0; e < nExamples; e++)
            {
                predictors[e] = new double[2] {
                    R.NextDouble(), R.NextDouble()
                };
                predictions[e] = testFunc(predictors[e]);
            }

            var weights = MultipleLinearRegression.Regress(predictors, predictions);

            Assert.Equal(intercept, weights[0], 8);
            Assert.Equal(w1, weights[1], 8);
            Assert.Equal(w2, weights[2], 8);

            var weights2 = MultipleLinearRegression.RegressHistorical(predictors, predictions);

            for (var i = 0; i < weights.Length; i++)
            {
                Assert.Equal(weights[i], weights2[i], 10);
            }

            var badPredictions = new double[nExamples - 1];

            Assert.Throws <InvalidOperationException>(() => MultipleLinearRegression.RegressHistorical(predictors, badPredictions));
            Assert.Throws <InvalidOperationException>(() => MultipleLinearRegression.Regress(predictors, badPredictions));

            var z = new MultipleLinearRegressor(weights);
            var q = z.Regress(new[] { 0.0, 0.0 });
        }