Esempio n. 1
0
		public void Evaluate(bool addIntercept_)
		{
			NMathCore.DoubleMatrix matrix = new CenterSpace.NMath.Core.DoubleMatrix(m_regressionMatrix);
			NMathCore.DoubleVector obs = new CenterSpace.NMath.Core.DoubleVector(m_observations);

			m_lin = new NMathStats.LinearRegression(matrix, obs, addIntercept_);
			m_anova = new CenterSpace.NMath.Stats.LinearRegressionAnova(m_lin);
			m_params = null;

			NotifyAll();
		}
Esempio n. 2
0
    public double[] ScaleSeries(double[] rawWeights_, double targetVol_, bool diagOnly_=false, bool useNMath_=true)
    {
      // catch empty weights coming in

      if (Math.Abs(rawWeights_.Select(x => Math.Abs(x)).Sum()) < 0.00000001)
        return rawWeights_;

      var matrixRawWeights = new double[1, rawWeights_.Length];
      for (int i = 0; i < rawWeights_.Length; ++i)
        matrixRawWeights[0, i] = rawWeights_[i];

      var scalingFactor = 0d;

      if (useNMath_)
      {
        // put weights and covariance into NMath constructs
        var weights = new NMathCore.DoubleMatrix(matrixRawWeights);
        var cov = new NMathCore.DoubleMatrix((diagOnly_) ? DiagonalData : Data);

        // multiply out to get variance
        var a = NMathCore.NMathFunctions.Product(weights, cov);
        var b = NMathCore.NMathFunctions.Product(a, weights.Transpose());

        // extract vol
        var vol = Math.Sqrt(b[0, 0]);
        if (vol == 0d) return rawWeights_; // must be empty weights coming in
        scalingFactor = vol/targetVol_;
      }
      else
      {
        var weights = Matrix<double>.Build.Dense(1, rawWeights_.Length, rawWeights_);
        var cov = Matrix<double>.Build.Dense(Data.GetLength(0), Data.GetLength(1),
          delegate(int i, int j) { return diagOnly_ ? DiagonalData[i, j] : Data[i, j]; });

        var wCov = weights * cov;
        var b = wCov * weights.Transpose();

        var vol = Math.Sqrt(b[0, 0]);
        if (vol == 0d) return rawWeights_;
        scalingFactor = vol/targetVol_;
      }

      double[] ret = new double[rawWeights_.Length];

      // scale the weights
      for (int j = 0; j < ret.Length; ++j)
        if (scalingFactor == 0)
          ret[j] = 0;
        else
          ret[j] = rawWeights_[j] / scalingFactor;

      return ret;
    }
Esempio n. 3
0
    public static NMathStats.LinearRegression DoRegression(SwapsSummaryRow summaryRow_, Instrument regressAgainstThis_, int numDays_ = 252, bool withIntercept_=true)
    {
      var ys = summaryRow_.GetRawStatSeries(StatCols.Values);

      if (ys.Length < numDays_)
        return null;

      ys = ys.GetEndValues(numDays_);

      var xs = regressAgainstThis_.A_Prices.Data.Slice(regressAgainstThis_.A_Prices.Length - numDays_, numDays_);

      NMathCore.DoubleVector yV = new NMathCore.DoubleVector(ys.Data);
      NMathCore.DoubleMatrix matrix = new NMathCore.DoubleMatrix(xs.ToColumn());

      var lin = new NMathStats.LinearRegression(obs: yV, A: matrix, addIntercept: withIntercept_);

      return lin;
    }
    internal static RegressionResult DoRegression(this ILevels levels_, RegressionArguments args_)
    {
      try
      {
        var myLevels = levels_.Levels;
        var independentLevels = args_.Independent.Levels;

        if (args_.RegressOn == RegressOn.Differences)
        {
          myLevels = myLevels.ToDifferences();
          independentLevels = independentLevels.ToDifferences();
        }

        var m_regressionData =
          myLevels.GetEndValues(args_.RegressionWindowLength).IntersectDates(independentLevels);

        NMathCore.DoubleVector yV = new NMathCore.DoubleVector(m_regressionData.Data.Select(x => x[0]).ToArray());
        NMathCore.DoubleMatrix matrix = new NMathCore.DoubleMatrix(m_regressionData.Data.Select(x => x[1]).ToArray().ToColumn());

        var lin = new NMathStats.LinearRegression(obs: yV, A: matrix, addIntercept: true);
        var anova = new NMathStats.LinearRegressionAnova(lin);

        return new RegressionResult(args_.Independent, m_regressionData, lin, anova);
      }
      catch (Exception ex_)
      {
        Logger.Error(string.Format("Error recalculating regression for {0}", levels_.Name), typeof(RegressionExtensionMethods), ex_);

        return null;
      }
    }
    internal static DatedDataCollectionGen<double> GetRollingRegressionField(this ILevels levels_,  RegressionArguments args_, RegressionField field_)
    {
      DatedDataCollectionGen<double> ret = null;
      try
      {
        var myLevels = levels_.Levels;
        var independentLevels = args_.Independent.Levels;

        if (args_.RegressOn == RegressOn.Differences)
        {
          myLevels = myLevels.ToDifferences();
          independentLevels = independentLevels.ToDifferences();
        }

        var m_regressionData =
          myLevels.IntersectDates(independentLevels);

        if (m_regressionData.Length < args_.RegressionWindowLength)
          return null;

        var myBucket = new List<double>();
        var indepBucket = new List<double>();
        var betas = new List<double>();
        var dates = new List<DateTime>();

        for (int i = 0; i < m_regressionData.Length; ++i)
        {
          myBucket.Add(m_regressionData.Data[i][0]);
          indepBucket.Add(m_regressionData.Data[i][1]);

          if (myBucket.Count < args_.RegressionWindowLength)
            continue;

          while (myBucket.Count > args_.RegressionWindowLength)
          {
            myBucket.RemoveAt(0);
            indepBucket.RemoveAt(0);
          }

          var yV = new NMathCore.DoubleVector(myBucket.ToArray());
          var matrix = new NMathCore.DoubleMatrix(indepBucket.ToArray().ToColumn());

          try
          {
            var lin = new NMathStats.LinearRegression(obs: yV, A: matrix, addIntercept: true);
            var anova = new NMathStats.LinearRegressionAnova(lin);

            var result = new RegressionResult(args_.Independent, m_regressionData, lin, anova);

            betas.Add(result[field_]);
            dates.Add(m_regressionData.Dates[i]);
          }
          catch { }
        }

        ret = new DatedDataCollectionGen<double>(dates.ToArray(), betas.ToArray());
      }
      catch (Exception ex_)
      {
        Logger.Error("Error generated doing rolling beta", typeof(RegressionExtensionMethods), ex_);
        return null;
      }
      return ret;
    }