private void btnCombinePnl_Click(object sender, EventArgs e)
    {
      var all = spreadWeightGeneratorCollectionGrid1.ListOfGenerators;

      if (all.Count() == 0) return;

      ConstructGen<double> con = new ConstructGen<double>(all.Count());
      con.ColumnHeadings = new string[con.ArrayLength];

      for (int i = 0; i < con.ArrayLength; ++i)
      {
        var item = all.ElementAt(i);
        con.ColumnHeadings[i] = item.ToString();
        con.SetColumnValues(i, item.GetSimplePnl());
      }

      if (con.NeedsToSortKeys())
        con.SortKeys();

      var eval = new ReturnsEval.DataSeriesEvaluator("Combined", ReturnsEval.DataSeriesType.Returns);
      eval.AddInnerSeries(con.Dates.ToArray(), con.ToArray(), con.ColumnHeadings);

      eval.Display("Combined");
    }
Beispiel #2
0
      protected override void handleclick(EventArgs e_)
      {
        try
        {
          DatedDataCollectionGen<double> hist = null;
          hist = m_signal.GetSignalGridProvider().GetHistoryForCcyPair(m_ccy1, m_ccy2);

          if (hist == null) hist = m_signal.GetSignalGridProvider().GetHistoryForCcyPair(m_ccy2, m_ccy1, -1d);

          ConstructGen<double> con = new ConstructGen<double>(Singleton<FXIDs>.Instance.ColumnHeadings);

          for (int i = 0; i < hist.Dates.Length; ++i)
          {
            con.SetValue(hist.Dates[i], m_ccy1.ArrayIndex, hist.Data[i]);
            con.SetValue(hist.Dates[i], m_ccy2.ArrayIndex, -hist.Data[i]);
          }
          var rets = ReturnsFromFXWeights.DoIt_DailyWeights(dailyWts_: con);

          var eval = new ReturnsEval.DataSeriesEvaluator(m_signal.Name, ReturnsEval.DataSeriesType.Returns);
          eval.AddInnerSeries(rets.CombinedPnl.Dates.ToArray(), rets.CombinedPnl.ToArray(), rets.CombinedPnl.ColumnHeadings);
          eval.Evaluate();
          eval.Display(string.Format("{0}: {1}/{2} signal performance",m_signal.Name,m_ccy1,m_ccy2)).Icon = Util.BmpToIcon(Properties.Resources.money);
        }
        catch (Exception ex_)
        {
          Logger.Error(string.Format("Error generating and showing pnl for signal grid ccy pair ({0}/{1})", m_ccy1.Code, m_ccy2.Code), typeof(SignalPnlOverTime), ex_);
        }
      }
    internal static void Go()
    {

      DatedDataCollectionGen<double> stratReturns = null;

      {
        var pathToReturns = @"e:\stratReturnsSeries.csv";

        var dates = new List<DateTime>();
        var data = new List<double>();
        foreach (var v in CsvFile.Read<LineItem>(pathToReturns))
        {
          dates.Add(v.Date);
          data.Add(v.Return);
        }
        stratReturns = new DatedDataCollectionGen<double>(dates.ToArray(), data.ToArray());
      }

      var stratEval = new ReturnsEval.DataSeriesEvaluator(stratReturns.Dates, stratReturns.Data, "strat", ReturnsEval.DataSeriesType.Returns);


      var spx = BbgTalk.HistoryRequester.GetHistory(stratReturns.Dates[0], "SPX INDEX", "PX_CLOSE_1D", false);

      {
        for (int i = 1; i < spx.Length; ++i)
        {
          spx.Data[i - 1] = spx.Data[i];
        }
      }

      var spxR = spx.ToReturns();
      var spxEval = new ReturnsEval.DataSeriesEvaluator(spxR.Dates, spxR.Data, "SPX", ReturnsEval.DataSeriesType.Returns);
      spxEval.Evaluate();
      spxEval.Display("spx");

      double[] perfDuringDrawdown = new double[stratReturns.Length];

      var listOfRecords = new List<DrawdownItem>();

      foreach (var dd in spxEval.Daily.DrawDowns)
      {
        if (Math.Abs(dd.ValueDown) > 0.03)
        {
          double perf = 0d;
          for (int i = 0; i < stratReturns.Length; ++i)
          {
            if (stratReturns.Dates[i] >= dd.StartDate && stratReturns.Dates[i] <= dd.LowDate)
            {
              perfDuringDrawdown[i] = stratReturns.Data[i];
              perf += stratReturns.Data[i];
            }
          }

          if (perf != 0d)
          {
            stratEval.Evaluate(dd.StartDate, dd.LowDate);
            listOfRecords.Add(new DrawdownItem()
            {
              DateStart = dd.StartDate,
              DateBottomOut = dd.LowDate,
              ChangeInSPX = -dd.ValueDown,
              StrategyPerformance = perf,
              TopStratDrawdown = stratEval.Daily.DrawDowns.Count()==0 ? 0d : -stratEval.Daily.DrawDowns.OrderByDescending(x=>x.ValueDown).First().ValueDown
            });
          }
        }
      }


      {
        var origStratCumulative = stratReturns.ToCumulative();
        var perDuringDrawdownCumulative = new DatedDataCollectionGen<double>(stratReturns.Dates, perfDuringDrawdown).ToCumulative();
        var spxCumulative = spxEval.Daily.ToCumulative();

        var linechart = new SI.Controls.LineChartDataDisplay();

        linechart.AddSeries(origStratCumulative.Dates, origStratCumulative.Data, "Original strategy");
        linechart.AddSeries(perDuringDrawdownCumulative.Dates, perDuringDrawdownCumulative.Data, "Strat during SPX drawdown");

        linechart.AddSeries(spxCumulative.Dates, spxCumulative.Data, "SPX cumulative return", 80, "####0.0");

        {
          var legend =  linechart.AddCompositeLegendForAllLayers();
          legend.Bounds = new System.Drawing.Rectangle(30, 0, 20, 30);
          legend.BoundsMeasureType = Infragistics.UltraChart.Shared.Styles.MeasureType.Percentage;

          legend.PE.ElementType = PaintElementType.Gradient;
          legend.PE.FillGradientStyle = GradientStyle.ForwardDiagonal;
          legend.PE.Fill = Color.DarkGray;
          legend.PE.FillStopColor = Color.DarkGray;
          legend.Border.CornerRadius = 10;
          legend.Border.Color = Color.White;
          legend.Border.Thickness = 1;
        }

        linechart.DisplayInShowForm("Strat analysis during >3% SPX drawdowns");
      }

      var g = listOfRecords.DisplayInGrid("Records");
      g.SetHeaderClickSort();
    }