using MarketData.DataAccess; using MarketData.MarketDataModel; using MarketData.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MarketData.Generator { // ******************************************************************************************************************************************************************* // ************************************************************ A C Q U I R E R S M U L T I P L E U N I T T E S T ************************************************ // ******************************************************************************************************************************************************************* public class AcquirersMultipleCollection : List { public AcquirersMultipleCollection() { } public AcquirersMultipleCollection(AcquirersMultipleCollection collection) { foreach(AcquirersMultipleItem acquirersMultipleItem in collection)Add(acquirersMultipleItem); } } public class AcquirersMultipleItem { public AcquirersMultipleItem() { } public String Symbol{get;set;} public double AcquirersMultiple{get;set;} public double MarketCapitalization{get;set;} public double EnterpriseValue{get;set;} public double OperatingEarnings{get;set;} public double DepreciationAndAmortization{get;set;} public double TotalRevenue{get;set;} public double CostOfRevenue{get;set;} public double SGA{get;set;} public double Rank{get;set;} public static String Heading { get{return "Symbol,MarketCapitalization,AcquirersMultiple,EnterpriseValue,OperatingEarnings,DepreciationAndAmortization,TotalRevenue,CostOfRevenue,SGA,Rank";} } public override string ToString() { StringBuilder sb=new StringBuilder(); sb.Append(Symbol).Append(",").Append(Utility.FormatNumber(MarketCapitalization,2,false)).Append(",").Append(Utility.FormatNumber(AcquirersMultiple,2,false)).Append(",").Append(Utility.FormatNumber(EnterpriseValue,2,false)).Append(","); sb.Append(Utility.FormatNumber(OperatingEarnings,2,false)).Append(",").Append(Utility.FormatNumber(DepreciationAndAmortization,2,false)).Append(","); sb.Append(Utility.FormatNumber(TotalRevenue,2,false)).Append(",").Append(Utility.FormatNumber(CostOfRevenue,2,false)).Append(","); sb.Append(Utility.FormatNumber(SGA,2,false)).Append(",").Append(Utility.FormatNumber(Rank,2,false)).Append(","); return sb.ToString(); } } public class AcquirersMultipleItemSorter : IComparer { public int Compare(AcquirersMultipleItem v1,AcquirersMultipleItem v2) // here we want to sort by lowest positive non NaN item { if(double.IsNaN(v1.AcquirersMultiple)&&double.IsNaN(v2.AcquirersMultiple))return 0; else if(double.IsNaN(v1.AcquirersMultiple))return -1; else if(double.IsNaN(v2.AcquirersMultiple))return 1; else if(v1.AcquirersMultiple.Equals(v2.AcquirersMultiple))return 0; else if(v1.AcquirersMultiple symbols=PricingDA.GetSymbols(); return ApplyRanks(symbols); } public static AcquirersMultipleCollection ApplyRanks(String symbol) { List symbols=new List(); symbols.Add(symbol); return ApplyRanks(symbols); } public static AcquirersMultipleCollection ApplyRanks(List symbols) { // List symbols=PricingDA.GetSymbols(); AcquirersMultipleCollection acquirersMultipleCollection=new AcquirersMultipleCollection(); IncomeStatement incomeStatement=null; CashflowStatement cashflowStatement=null; BalanceSheet balanceSheet=null; // pull in the data for all symbols foreach(String symbol in symbols) { MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Working on {0}",symbol)); incomeStatement=IncomeStatementDA.GetIncomeStatement(symbol,IncomeStatement.PeriodType.Annual); cashflowStatement=CashflowStatementDA.GetCashflowStatement(symbol,CashflowStatement.PeriodType.Annual); balanceSheet = BalanceSheetDA.GetBalanceSheet(symbol,BalanceSheet.PeriodType.Annual); Fundamental fundamental = FundamentalDA.GetFundamental(symbol); AcquirersMultipleItem acquirersMultipleItem=new AcquirersMultipleItem(); acquirersMultipleItem.Symbol=symbol; if(null!=fundamental&&!double.IsNaN(fundamental.EnterpriseValue)&&null!=cashflowStatement&&!double.IsNaN(cashflowStatement.DepreciationAndAmortization)&&null!=incomeStatement&&!double.IsNaN(incomeStatement.TotalRevenue)&&!double.IsNaN(incomeStatement.CostOfRevenue)&&!double.IsNaN(incomeStatement.SGA)) { acquirersMultipleItem.MarketCapitalization=fundamental.MarketCap; acquirersMultipleItem.OperatingEarnings=incomeStatement.TotalRevenue-(cashflowStatement.DepreciationAndAmortization+incomeStatement.CostOfRevenue+incomeStatement.SGA); acquirersMultipleItem.AcquirersMultiple=fundamental.EnterpriseValue/acquirersMultipleItem.OperatingEarnings; acquirersMultipleItem.EnterpriseValue=fundamental.EnterpriseValue; acquirersMultipleItem.DepreciationAndAmortization=cashflowStatement.DepreciationAndAmortization; acquirersMultipleItem.TotalRevenue=incomeStatement.TotalRevenue; acquirersMultipleItem.CostOfRevenue=incomeStatement.CostOfRevenue; acquirersMultipleItem.SGA=incomeStatement.SGA; } else { if(null==fundamental)MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing fundamental.",symbol)); // if(null==balanceSheet)MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing balance sheet.",symbol)); if(null==cashflowStatement)MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing cashflow statement.",symbol)); if(null==incomeStatement)MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing income statement.",symbol)); if(null!=fundamental&&double.IsNaN(fundamental.EnterpriseValue))MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing fundamental data point (EnterpriseValue).",symbol)); if(null!=cashflowStatement&&double.IsNaN(cashflowStatement.DepreciationAndAmortization))MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing cashflow statement data point (DepreciationAndAmortization).",symbol)); if(null!=incomeStatement&&double.IsNaN(incomeStatement.CostOfRevenue))MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing income statement data point (Cost of Revenue).",symbol)); if(null!=incomeStatement&&double.IsNaN(incomeStatement.SGA))MDTrace.WriteLine(LogLevel.DEBUG,String.Format("{0} missing income statement data point (SGA).",symbol)); acquirersMultipleItem.MarketCapitalization=double.NaN; acquirersMultipleItem.OperatingEarnings=double.NaN; acquirersMultipleItem.AcquirersMultiple=double.NaN; acquirersMultipleItem.EnterpriseValue=double.NaN; acquirersMultipleItem.DepreciationAndAmortization=double.NaN; acquirersMultipleItem.TotalRevenue=double.NaN; acquirersMultipleItem.CostOfRevenue=double.NaN; acquirersMultipleItem.SGA=double.NaN; } acquirersMultipleCollection.Add(acquirersMultipleItem); } // Build the rankings Dictionary acquirersMultipleCollectionBySymbol=new Dictionary(); Dictionary acquirersMultipleRankedByAcquirersMultiple=new Dictionary(); foreach(AcquirersMultipleItem acquirersMultipleItem in acquirersMultipleCollection) { if(!acquirersMultipleCollectionBySymbol.ContainsKey(acquirersMultipleItem.Symbol))acquirersMultipleCollectionBySymbol.Add(acquirersMultipleItem.Symbol,acquirersMultipleItem); } acquirersMultipleCollection.Sort(new AcquirersMultipleItemSorter()); for(int index=0;index valuationsBySymbol=new Dictionary(); Dictionary valuationsRankedByAcquirersMultiple=new Dictionary(); foreach(Valuation valuation in valuations) { if(!valuationsBySymbol.ContainsKey(valuation.Symbol))valuationsBySymbol.Add(valuation.Symbol,valuation); } Valuations valuationsCopyByAcquirersMultiple=new Valuations(valuations); valuationsCopyByAcquirersMultiple.Sort(new ValuationsByAcquirersMultiple()); for(int index=0;index