Exemplo n.º 1
0
    public void Bind(ReturnsEval.DataSeriesEvaluator eval_, ReturnsEval.Period period_)
    {
      m_eval = eval_;
      m_period = period_;

      ClearSeries();
      DatedDataCollectionGen<double> daily = eval_.Daily;
      AddSeries(eval_.Daily.Dates, eval_.Daily.CumulativeReturnSeries, "Cumulative Pnl", 40, "##0.0#%");

      {
        DatedDataCollectionGen<double>[] years = new DatedDataCollectionGen<double>[]
        {
          daily.ToYearsCumulativeYTD(),
          daily.ToYearsCumulativeYTD()
        };

        int index = 1;
        for (int i = 0; i < years[0].Length; ++i)
        {
          if (i>0 && years[0].Dates[i].Year != years[0].Dates[i - 1].Year)
            index = (index == 1) ? 0 : 1;

          years[index].Data[i] = 0d;
        }

        if (ShowYearly)
        {
          AddSeries(years[0].Dates, years[0].Data, "YTD Cumulative(A)", 40, "##0.0#%");
          AddSeries(years[1].Dates, years[1].Data, "YTD Cumulative(B)", 40, "##0.0#%");
        }
      }

      //AddSeries(daily.Dates, daily.ToYearsCumulativeYTD().Data, "YTD Cumulative", 40, "##0.0#%");
      //AddSeries(daily.Dates, daily.ToMonthsCumulativeMTD().Data, "MTD Cumulative", 40, "##0.0#%");
    }
		public ConditionalCorrelationAnalyzer(ReturnsEval.DataSeriesEvaluator eval1_, ReturnsEval.DataSeriesEvaluator eval2_)
		{
			m_eval = eval1_;
			m_eval2 = eval2_;

			// find common dates

			List<DateTime> commonDates = new List<DateTime>();
			List<DateTime> stratDates = new List<DateTime>(m_eval.Daily.Dates);
			foreach (DateTime date in m_eval2.Daily.Dates)
				if (stratDates.Contains(date))
					commonDates.Add(date);

			QuickSort.Sort<DateTime>(commonDates);

			List<double> first = new List<double>();
			List<double> second = new List<double>();

			// get the values for each of the common dates

			foreach (DateTime date in commonDates)
			{
				first.Add(m_eval.Daily.DataValueOnDate(date));
				second.Add(m_eval2.Daily.DataValueOnDate(date));
			}

			m_eval = new DataSeriesEvaluator(commonDates.ToArray(), first.ToArray(), eval1_.Name, DataSeriesType.Returns);
			m_eval2 = new DataSeriesEvaluator(commonDates.ToArray(), second.ToArray(), eval2_.Name, DataSeriesType.Returns);

			recalc();
		}
    public async Task SetDependent(DataSeriesEvaluator dependent_, RegressionField field_, bool runRegression_=true)
    {
      m_dependent = dependent_;
      m_regField = field_;

      if (runRegression_)
        await DoRegression();
    }
Exemplo n.º 4
0
    public static void Go()
    {
      var spreadDefs = new[]
      {
        new SpreadDefinition(new MonthYearOffset(Singleton<ComIDs>.Instance["C "],0,MonthCode.U),new MonthYearOffset(Singleton<ComIDs>.Instance["C "],0,MonthCode.Z),false),
        new SpreadDefinition(new MonthYearOffset(Singleton<ComIDs>.Instance["W "],0,MonthCode.U),new MonthYearOffset(Singleton<ComIDs>.Instance["W "],0,MonthCode.Z),false),
        //new SpreadDefinition(new MonthYearOffset(Singleton<ComIDs>.Instance["S "],0,MonthCode.Q),new MonthYearOffset(Singleton<ComIDs>.Instance["S "],1,MonthCode.F),false),
        new SpreadDefinition(new MonthYearOffset(Singleton<ComIDs>.Instance["SB"],0,MonthCode.V),new MonthYearOffset(Singleton<ComIDs>.Instance["SB"],1,MonthCode.K),false),
        new SpreadDefinition(new MonthYearOffset(Singleton<ComIDs>.Instance["NG"],0,MonthCode.X),new MonthYearOffset(Singleton<ComIDs>.Instance["NG"],0,MonthCode.H),false),
        new SpreadDefinition(new MonthYearOffset(Singleton<ComIDs>.Instance["XB"],0,MonthCode.J),new MonthYearOffset(Singleton<ComIDs>.Instance["XB"],0,MonthCode.U),false),
      };

      foreach (var spreadDef in spreadDefs)
      {
        //StratParamSurface.StratParamData resultSet = new StratParamSurface.StratParamData("minWindowSize_, zScoreThreshold"
        var listOfpoints = new List<StratParamSurface.StratParamDataPoint>();
        
        for(int days=30; days<120; days+=10)
        {
          for(double threshold=0.5;threshold<2.0;threshold+=0.1)
          {
            var args = new WeightGeneratorArgs()
            {
              Lookback=5,
              MinWindowLength=days,
              WeightGenerationType=WeightGeneratorType.LongestZScoreOverThreshold,
              ZScoreThreshold=threshold
            };

            var gen = new SpreadWeightGenerator(args, spreadDef);

            var pnl = gen.GetSimplePnl();

            if (pnl.Length == 0) continue; // weren't met

            var eval = new ReturnsEval.DataSeriesEvaluator(pnl.Dates, pnl.Data, "blah", ReturnsEval.DataSeriesType.Returns);

            listOfpoints.Add(new StratParamSurface.StratParamDataPoint()
            {
              X = Convert.ToDouble(days),
              Y = threshold,
              Eval = eval
            });
          }
        }

        var data = new StratParamSurface.StratParamData(
          XLabel_: "minWindowSize_",
          YLabel_: "zScoreThreshold",
          data_: listOfpoints,
          pointFunc_: (p) => p.Eval.Daily.AnnualSharpeRatio
          );

        var control = new StratParamSurface();
        control.Create(data);
        control.DisplayInShowForm(spreadDef.ToString());
      }
    }
Exemplo n.º 5
0
    public void Create(ReturnsEval.DataSeriesEvaluator eval_, ReturnsEval.Period startingPeriod_)
    {
      m_args = new ARgsClass();
      m_args.Period = startingPeriod_;

      boundComboBox1.Items.Add(ReturnsEval.Period.Daily);
      boundComboBox1.Items.Add(ReturnsEval.Period.Monthly);
      boundComboBox1.Bind(m_args, "Period", new Validators.EnumDescValidator(ReturnsEval.Period.Daily));

      m_eval = eval_;

      m_args.PropertyChanged += handleArgsChanged;
      rebind();
    }
Exemplo n.º 6
0
    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");
    }
Exemplo n.º 7
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;
    }
Exemplo n.º 8
0
 /// <summary>
 /// Make sure dimensions are the same!  It's up to you to get it right.
 /// </summary>
 /// <param name="eval_"></param>
 public void AddInnerEvaluator(DataSeriesEvaluator eval_)
 {
   m_innerEvaluators.Add(eval_);
 }
Exemplo n.º 9
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_);
        }
      }
    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

    }
    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 EvaluatorComparisonItem(DataSeriesEvaluator eval_, string key_, object o_)
   :this(eval_)
 {
   AddObject(key_, o_);
 }
 public EvaluatorComparisonItem(DataSeriesEvaluator eval_)
 {
   m_eval = eval_;
   m_eval.Evaluated += handleEvaluated;
 }
Exemplo n.º 14
0
    public static List<ReturnsEval.DataSeriesEvaluator> GetEvalListFromArgs(string[] argsList_)
    {
      List<ReturnsEval.DataSeriesEvaluator> list = new List<ReturnsEval.DataSeriesEvaluator>();

      foreach (string s in argsList_)
      {
        if (System.IO.Directory.Exists(s))
        {
          foreach (string path in System.IO.Directory.GetFiles(s))
          {
            ReturnsEval.DataSeriesEvaluator ev = ReturnsEval.DataSeriesEvaluator.ReadFromDisk(path);
            if (ev != null) list.Add(ev);
            KeyValuePair<ConstructGen<double>, ReturnsEval.DataSeriesEvaluator> kvp = ExtensionMethods.ReadFromDisk<KeyValuePair<ConstructGen<double>, ReturnsEval.DataSeriesEvaluator>>(path);
            if (kvp.Value != null) list.Add(kvp.Value);
          }
        }
        else if (System.IO.File.Exists(s))
        {
          if (s.EndsWith(".xml"))
          {
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(string.Format(@"file://{0}", s.Replace(@"\", "/")));
            reader.MoveToContent();
            doc.Load(reader);
            reader.Close();
            foreach (System.Xml.XmlNode node in doc.DocumentElement.SelectNodes("BloombergTicker"))
            {
              DatedDataCollectionGen<double> hist = BbgTalk.HistoryRequester.GetHistory(new DateTime(2000, 1, 1), node.InnerText, "PX_LAST", true);
              DatedDataCollectionGen<double> genHist = new DatedDataCollectionGen<double>(hist.Dates, hist.Data).ToReturns();
              BbgTalk.RDResult nameData = BbgTalk.HistoryRequester.GetReferenceData(node.InnerText, "SHORT_NAME", null);
              ReturnsEval.DataSeriesEvaluator eval = new ReturnsEval.DataSeriesEvaluator(genHist.Dates, genHist.Data, nameData["SHORT_NAME"].GetValue<string>(), ReturnsEval.DataSeriesType.Returns);
              list.Add(eval);
            }
          }
          else
          {
            ReturnsEval.DataSeriesEvaluator ev = ReturnsEval.DataSeriesEvaluator.ReadFromDisk(s);
            if (ev != null) list.Add(ev);
            KeyValuePair<ConstructGen<double>, ReturnsEval.DataSeriesEvaluator> kvp = SI.ExtensionMethods.ReadFromDisk<KeyValuePair<ConstructGen<double>, ReturnsEval.DataSeriesEvaluator>>(s);
            if (kvp.Value != null) list.Add(kvp.Value);
          }
        }
      }

      return list;
    }
Exemplo n.º 15
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);
      };
    }