/// <summary> /// Generates the statistics and returns the results /// </summary> /// <param name="trades">The list of closed trades</param> /// <param name="profitLoss">Trade record of profits and losses</param> /// <param name="pointsEquity">The list of daily equity values</param> /// <param name="pointsPerformance">The list of algorithm performance values</param> /// <param name="pointsBenchmark">The list of benchmark values</param> /// <param name="startingCapital">The algorithm starting capital</param> /// <param name="totalFees">The total fees</param> /// <param name="totalTransactions">The total number of transactions</param> /// <param name="estimatedStrategyCapacity">The estimated capacity of this strategy</param> /// <returns>Returns a <see cref="StatisticsResults"/> object</returns> public static StatisticsResults Generate( List <Trade> trades, SortedDictionary <DateTime, decimal> profitLoss, List <ChartPoint> pointsEquity, List <ChartPoint> pointsPerformance, List <ChartPoint> pointsBenchmark, decimal startingCapital, decimal totalFees, int totalTransactions, CapacityEstimate estimatedStrategyCapacity) { var equity = ChartPointToDictionary(pointsEquity); var firstDate = equity.Keys.FirstOrDefault().Date; var lastDate = equity.Keys.LastOrDefault().Date; var totalPerformance = GetAlgorithmPerformance(firstDate, lastDate, trades, profitLoss, equity, pointsPerformance, pointsBenchmark, startingCapital); var rollingPerformances = GetRollingPerformances(firstDate, lastDate, trades, profitLoss, equity, pointsPerformance, pointsBenchmark, startingCapital); var summary = GetSummary(totalPerformance, estimatedStrategyCapacity, totalFees, totalTransactions); return(new StatisticsResults(totalPerformance, rollingPerformances, summary)); }
/// <summary> /// Returns a summary of the algorithm performance as a dictionary /// </summary> private static Dictionary <string, string> GetSummary(AlgorithmPerformance totalPerformance, CapacityEstimate estimatedStrategyCapacity, decimal totalFees, int totalTransactions) { var capacity = 0m; var lowestCapacitySymbol = Symbol.Empty; if (estimatedStrategyCapacity != null) { capacity = estimatedStrategyCapacity.Capacity; lowestCapacitySymbol = estimatedStrategyCapacity.LowestCapacityAsset ?? Symbol.Empty; } return(new Dictionary <string, string> { { "Total Trades", totalTransactions.ToStringInvariant() }, { "Average Win", Math.Round(totalPerformance.PortfolioStatistics.AverageWinRate.SafeMultiply100(), 2).ToStringInvariant() + "%" }, { "Average Loss", Math.Round(totalPerformance.PortfolioStatistics.AverageLossRate.SafeMultiply100(), 2).ToStringInvariant() + "%" }, { "Compounding Annual Return", Math.Round(totalPerformance.PortfolioStatistics.CompoundingAnnualReturn.SafeMultiply100(), 3).ToStringInvariant() + "%" }, { "Drawdown", Math.Round(totalPerformance.PortfolioStatistics.Drawdown.SafeMultiply100(), 3).ToStringInvariant() + "%" }, { "Expectancy", Math.Round(totalPerformance.PortfolioStatistics.Expectancy, 3).ToStringInvariant() }, { "Net Profit", Math.Round(totalPerformance.PortfolioStatistics.TotalNetProfit.SafeMultiply100(), 3).ToStringInvariant() + "%" }, { "Sharpe Ratio", Math.Round((double)totalPerformance.PortfolioStatistics.SharpeRatio, 3).ToStringInvariant() }, { "Probabilistic Sharpe Ratio", Math.Round(totalPerformance.PortfolioStatistics.ProbabilisticSharpeRatio.SafeMultiply100(), 3).ToStringInvariant() + "%" }, { "Loss Rate", Math.Round(totalPerformance.PortfolioStatistics.LossRate.SafeMultiply100()).ToStringInvariant() + "%" }, { "Win Rate", Math.Round(totalPerformance.PortfolioStatistics.WinRate.SafeMultiply100()).ToStringInvariant() + "%" }, { "Profit-Loss Ratio", Math.Round(totalPerformance.PortfolioStatistics.ProfitLossRatio, 2).ToStringInvariant() }, { "Alpha", Math.Round((double)totalPerformance.PortfolioStatistics.Alpha, 3).ToStringInvariant() }, { "Beta", Math.Round((double)totalPerformance.PortfolioStatistics.Beta, 3).ToStringInvariant() }, { "Annual Standard Deviation", Math.Round((double)totalPerformance.PortfolioStatistics.AnnualStandardDeviation, 3).ToStringInvariant() }, { "Annual Variance", Math.Round((double)totalPerformance.PortfolioStatistics.AnnualVariance, 3).ToStringInvariant() }, { "Information Ratio", Math.Round((double)totalPerformance.PortfolioStatistics.InformationRatio, 3).ToStringInvariant() }, { "Tracking Error", Math.Round((double)totalPerformance.PortfolioStatistics.TrackingError, 3).ToStringInvariant() }, { "Treynor Ratio", Math.Round((double)totalPerformance.PortfolioStatistics.TreynorRatio, 3).ToStringInvariant() }, { "Total Fees", "$" + totalFees.ToStringInvariant("0.00") }, { "Estimated Strategy Capacity", "$" + capacity.RoundToSignificantDigits(2).ToStringInvariant() }, { "Lowest Capacity Asset", lowestCapacitySymbol != Symbol.Empty ? lowestCapacitySymbol.ID.ToString() : "" }, }); }