예제 #1
0
    public static Task<ReturnsEval.DataSeriesEvaluator> GetHistoricalPnlEvaluatorTask(this Signal sig_)
    {
      var t = new Task<ReturnsEval.DataSeriesEvaluator>(() =>
      {
        ReturnsEval.DataSeriesEvaluator eval = null;

        try
        {
          var result = sig_.PnlResult;
          eval = new ReturnsEval.DataSeriesEvaluator(sig_.DisplayName, ReturnsEval.DataSeriesType.Returns);
          eval.AddInnerSeries(result.CombinedPnl.Dates.ToArray(), result.CombinedPnl.ToArray(), result.CombinedPnl.ColumnHeadings);

          //if(result.CombinedPnl.Dates.Count>260)
          //  eval.Evaluate(result.CombinedPnl.Dates[result.CombinedPnl.Dates.Count-253],result.CombinedPnl.LastDate);
          //else
            eval.Evaluate();
        }
        catch (Exception ex_)
        {
          Logger.Error("Error generating pnl for signal", typeof(ExtensionMethods), ex_);
        }

        return eval;
      });

      return t;
    }
예제 #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();
    }
    public async Task DoRegression()
    {
      if (m_dependent == null) return;

      lineChartDataDisplay1.ClearSeries();

      var bench = getBenchmark();

      if (bench == null) return;

      var spSeries = bench.GetReturns();

      if (spSeries == null)
      {
        lbl_IR.Text = string.Empty;
        angledLabel1.Text = "Benchmark not set";
        return;
      }

      angledLabel1.Text = string.Format("Rolling {0}", bench.Name);
      lbl_IR.BringToFront();


      var leftField = m_regField;
      //var rightField = RegressionField.IR;

      var eval = new DataSeriesEvaluator(spSeries.Dates, spSeries.Data, "blah", DataSeriesType.Returns);
      await Task.Run(() =>
        {
          eval.Evaluate();
          eval.Daily.RollingSharpeSeries.ToString(); // kick off creation of rolling shared
        });


      #region Daily

      if (m_dependent.FinestGranularity == Period.Daily)
      {
        var dailySpan = m_dependent.Daily.RollingSharpeSeries.Span;
        var dailyIntersect = m_dependent.Daily.InterectDatesKeepSeparate(eval.Daily);

        var rollingDaily =
          await
            Task.Run<DatedDataCollectionGen<LinearRegression>>(
              () => HelperMethods.GetRollingStat(dailyIntersect.Item1, dailyIntersect.Item2, dailySpan, getRegression));

        //var rollingDaily = HelperMethods.GetRollingStat(dailyIntersect.Item1, dailyIntersect.Item2, dailySpan , getRegression);

        lbl_IR.Text =
          getRegression(dailyIntersect.Item1.Data, dailyIntersect.Item2.Data)
            .GetStat(RegressionField.IR, Period.Daily)
            .ToString("##0.0");

        if (rollingDaily != null && rollingDaily.Length > 0)
        {
          var cht = lineChartDataDisplay1.AddSeries(
            dates_: rollingDaily.Dates,
            values_: rollingDaily.Data.Select(x => x.GetStat(leftField, Period.Daily)).ToArray(),
            desc_: string.Format("{0}: Daily({1}), Left", EnumDescriptionAttribute.GetDescription(leftField), dailySpan),
            yLabelFormat_: leftField.getDisplayFormat(),
            yAxisExtent_: 40,
            color_: Color.White);
          cht.AxisY.TickmarkStyle = Infragistics.UltraChart.Shared.Styles.AxisTickStyle.Smart;
          cht.AxisX.TickmarkStyle = Infragistics.UltraChart.Shared.Styles.AxisTickStyle.Smart;
        }
      }

      #endregion

      #region Weekly

      if (m_dependent.FinestGranularity == Period.Daily || m_dependent.FinestGranularity == Period.Weekly)
      {
        var weeklySpan = (m_dependent.FinestGranularity == Period.Daily)
          ? Convert.ToInt32(Math.Round(m_dependent.Daily.RollingSharpeSeries.Span/5d, 0))
          : m_dependent.Weekly.RollingSharpeSeries.Span;

        var weeklyIntersect = m_dependent.Weekly.InterectDatesKeepSeparate(eval.Weekly);

        var rollingWeekly =
          await
            Task.Run<DatedDataCollectionGen<LinearRegression>>(
              () =>
                HelperMethods.GetRollingStat(weeklyIntersect.Item1, weeklyIntersect.Item2, weeklySpan, getRegression));

        if (m_dependent.FinestGranularity == Period.Weekly)
        {
          lbl_IR.Text =
            getRegression(weeklyIntersect.Item1.Data, weeklyIntersect.Item2.Data)
              .GetStat(RegressionField.IR, Period.Weekly)
              .ToString("##0.0");
        }

        if (rollingWeekly != null && rollingWeekly.Length > 0)
        {
          var cht = lineChartDataDisplay1.AddSeries(
            dates_: rollingWeekly.Dates,
            values_: rollingWeekly.Data.Select(x => x.GetStat(leftField, Period.Weekly)).ToArray(),
            desc_: string.Format("{0}: Weekly({1}), Left", leftField, weeklySpan),
            yLabelFormat_: leftField.getDisplayFormat(),
            yAxisExtent_: 40,
            color_: Color.Orange);
          cht.AxisY.TickmarkStyle = Infragistics.UltraChart.Shared.Styles.AxisTickStyle.Smart;
          cht.AxisX.TickmarkStyle = Infragistics.UltraChart.Shared.Styles.AxisTickStyle.Smart;
        }
      }

      #endregion

      #region Monthly

      if (m_dependent.FinestGranularity == Period.Weekly || m_dependent.FinestGranularity == Period.Monthly)
      {
        var monthlySpan = m_dependent.FinestGranularity == Period.Weekly
          ? Convert.ToInt32(Math.Round(m_dependent.Weekly.RollingSharpeSeries.Span/4.1d, 0))
          : m_dependent.Monthly.RollingSharpeSeries.Span;

        var monthlyIntersect = m_dependent.Monthly.InterectDatesKeepSeparate(eval.Monthly);

        var rollingMonthly =
          await
            Task.Run<DatedDataCollectionGen<LinearRegression>>(
              () =>
                HelperMethods.GetRollingStat(monthlyIntersect.Item1, monthlyIntersect.Item2, monthlySpan, getRegression));

        if (m_dependent.FinestGranularity == Period.Monthly)
        {
          lbl_IR.Text =
            getRegression(monthlyIntersect.Item1.Data, monthlyIntersect.Item2.Data)
              .GetStat(RegressionField.IR, Period.Monthly)
              .ToString("##0.0");
        }


        if (rollingMonthly != null && rollingMonthly.Length > 0)
        {
          var cht = lineChartDataDisplay1.AddSeries(
            dates_: rollingMonthly.Dates,
            values_: rollingMonthly.Data.Select(x => x.GetStat(leftField, Period.Monthly)).ToArray(),
            desc_: string.Format("{0}: Monthly({1}), Left", leftField, monthlySpan),
            yLabelFormat_: leftField.getDisplayFormat(),
            yAxisExtent_: 40,
            color_: Color.LightPink);
          cht.AxisY.TickmarkStyle = Infragistics.UltraChart.Shared.Styles.AxisTickStyle.Smart;
          cht.AxisX.TickmarkStyle = Infragistics.UltraChart.Shared.Styles.AxisTickStyle.Smart;
        }
      }

      #endregion

    }
예제 #5
0
    public virtual void Create(IList<ReturnsEval.DataSeriesEvaluator> evals_,SI.ReturnsEval.EvalComparer.TDType initialFocus_=ReturnsEval.EvalComparer.TDType.Inception)
    {
      hideInnerAttributionPanel(do_: true);
      m_focus = initialFocus_;

      m_comp = new ReturnsEval.EvalComparer();
      m_comp.Create(evals_);

      m_workingEval = new ReturnsEval.DataSeriesEvaluator("working", ReturnsEval.DataSeriesType.Returns);
      for (int i = 0; i < evals_.Count; ++i)
        m_workingEval.AddInnerSeries(m_comp.PnlConstruct.Dates.ToArray(), m_comp.PnlConstruct.GetColumnValues(i), evals_[i].Name);
      m_workingEval.Evaluate();

      dateTimePickerAsOfDate.Value = m_comp.AsOfDate;
      dateTimePickerAsOfDate.ValueChanged += dateTimePickerAsOfDate_ValueChanged;
      dateTimePickerCustomStartDate.Value = m_comp.CustomStartDate;
      dateTimePickerCustomStartDate.ValueChanged += dateTimePickerCustomStartDate_ValueChanged;

      //dateTimePickerAsOfDate.DataBindings.Add("Value", m_comp, "AsOfDate", false, DataSourceUpdateMode.OnPropertyChanged);

      m_comp.PropertyChanged += handleCompChanged;

      reloadPerf();
      //reloadCorrels();

      gridPerf.ColourNegativesRed();
      gridPerf.Bind(m_perfRows, typeof(PerfRow));
      gridPerf.AutoSizeGridColumns();

      reloadCumulatives();

      setHeaderClickAction(doSort_: false);
      gridPerf.AddClickHandler("Perf1Day", new SI.Controls.RowClickedEventHandler(handle1DClicked));
      gridPerf.AddClickHandler("PerfWTD", new SI.Controls.RowClickedEventHandler(handleWTDClicked));
      gridPerf.AddClickHandler("PerfMTD", new SI.Controls.RowClickedEventHandler(handleMTDClicked));
      gridPerf.AddClickHandler("PerfYTD", new SI.Controls.RowClickedEventHandler(handleYTDClicked));
      gridPerf.AddClickHandler("PerfQTD", new SI.Controls.RowClickedEventHandler(handleQTDClicked));
      gridPerf.AddClickHandler("PerfInception", new SI.Controls.RowClickedEventHandler(handleInceptionClicked));
      gridPerf.AddClickHandler("PerfCTD", new SI.Controls.RowClickedEventHandler(handleCTDClicked));
      gridPerf.AddClickHandler("RVS_21", new SI.Controls.RowClickedEventHandler(handleRVSSharpeClicked));
      gridPerf.AddClickHandler("StrategyName", new SI.Controls.RowClickedEventHandler(handleStratNameClicked));
      gridPerf.AddClickHandler("PerfOneYear", new SI.Controls.RowClickedEventHandler(handle1YClicked));
      gridPerf.AddClickHandler("PerfTwoYear", new SI.Controls.RowClickedEventHandler(handle2YClicked));
      gridPerf.AddClickHandler("Selected", new SI.Controls.RowClickedEventHandler(handleSelectedClicked));
      gridPerf.AddClickHandler("DD", new SI.Controls.RowClickedEventHandler(handleDDClicked));
      innerTotalReturnAttributionDisplayChart1.Chart.EmptyChartText = "Click Strategy period to show attribution";

      tbWinLength.Bind(m_extraArgs, "RetVolSharpeWindowLength", new Validators.IntValidator());
      tbRollVolWin.Bind(m_extraArgs, "RollingWindowLength", new Validators.IntValidator());
      tbCorrWin.Bind(m_comp, "CorrelWindow", new Validators.IntValidator());
      cmbRollType.AddItems(typeof(ReturnsEval.RollingSeriesType));
      cmbRollType.Bind(m_extraArgs, "RollingSeriesType", new Validators.EnumDescValidator(ReturnsEval.RollingSeriesType.Vol));
      m_extraArgs.PropertyChanged += handleExtraArgsChanged;

      gridCorrs.ColourNegativesRed();
      gridPerf.Grid.DisplayLayout.Override.RowSelectors = Infragistics.Win.DefaultableBoolean.False;

      innerTotalReturnAttributionDisplayChart1.DataClicked += handleDataClicked;

      periodReturnsColumnChart1.ColumnClicked += handlePeriodReturnsChartClicked;
      periodReturnsColumnChart2.ColumnClicked += handlePeriodReturnsChartClicked;

      gridPerf.RowRightClicked += (a, b) =>
      {
        var pr = b.ListObject as PerfRow;
        if (pr == null) return;
        getContextMenu().Items.Clear();
        getContextMenu().Items.Add(new StrategyPnlDetailMenuItem(pr.StrategyName.Name, m_comp.FindEval(pr.StrategyName.Name),m_comp.GetDate(m_focus)));
        getContextMenu().Show(Cursor.Position);
      };
    }