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; }
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 }
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); }; }