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