using System; using System.Text; using System.Collections.Generic; using MarketData.Utils; namespace MarketData.MarketDataModel { public class Enhancements { public bool DebtLoad { get; set; } public double ROIC { get; set; } public double ROICGrowth { get; set; } public double EPSGrowth { get; set; } public double RevenueGrowth { get; set; } public double BVPS { get; set; } public double PBVPS { get; set; } public double EPS { get; set; } public double PE { get; set; } public double PEG { get; set; } public double MOS { get; set; } public double MOS80 { get; set; } public double IntrinsicValue { get; set; } // Benjamin Graham original intrinsic value public double IntrinsicValueRevised { get; set; } // Benjamin Graham revised instrinsic value (uses the yield on 20 year corporate bonds public double RGVIntrinsic { get; set; } public double RGVIntrinsicRevised { get; set; } public Enhancements() { DebtLoad = false; ROIC = double.NaN; ROICGrowth = double.NaN; EPSGrowth = double.NaN; RevenueGrowth = double.NaN; BVPS = double.NaN; PBVPS = double.NaN; EPS = double.NaN; PE = double.NaN; PEG = double.NaN; MOS = double.NaN; MOS80 = double.NaN; IntrinsicValue = double.NaN; RGVIntrinsic = double.NaN; IntrinsicValueRevised = double.NaN; RGVIntrinsicRevised = double.NaN; } } public class DCFValuation { public const double MARKET_RETURN=.11; private String symbol; private double wacc=double.NaN; private double costOfEquity=double.NaN; private double costOfDebt=double.NaN; private double marketValueOfEquity=double.NaN; private double marketValueOfDebt = double.NaN; private double totalCapitalInvested = double.NaN; private double corporateTaxRate = double.NaN; private double beta = double.NaN; private double riskFreeRate = double.NaN; private double interestExpense = double.NaN; private double interestRate = double.NaN; private double totalDebt = double.NaN; private double outstandingShares = double.NaN; private double freeCashflowGrowth = double.NaN; private double presentValue = double.NaN; private double stockPriceValuation = double.NaN; private double marketReturn=MARKET_RETURN; private Price currentPrice; private Cashflows cashflows = new Cashflows(); private ReturnItems returnItems = new ReturnItems(); private Enhancements enhancements = new Enhancements(); private String message; private bool useMarketReturn = false; public bool success = false; public bool UseMarketReturn { get { return useMarketReturn; } set { useMarketReturn = value; if (useMarketReturn)marketReturn = 0.00; else marketReturn = MARKET_RETURN; } } public String Symbol { get { return symbol; } set { symbol = value; } } public Price CurrentPrice { get { return currentPrice; } set { currentPrice = value; } } public double WACC { get { return wacc; } set { wacc = value; } } public double CostOfEquity { get { return costOfEquity; } set { costOfEquity = value; } } public double CostOfDebt { get { return costOfDebt; } set { costOfDebt = value; } } public double MarketValueOfEquity { get { return marketValueOfEquity; } set { marketValueOfEquity = value; } } public double MarketValueOfDebt { get { return marketValueOfDebt; } set { marketValueOfDebt = value; } } public double TotalCapitalInvested { get { return totalCapitalInvested; } set { totalCapitalInvested = value; } } public double CorporateTaxRate { get { return corporateTaxRate; } set { corporateTaxRate = value; } } public double Beta { get { return beta; } set { beta = value; } } public double RiskFreeRate { get { return riskFreeRate; } set { riskFreeRate = value; } } public double InterestExpense { get { return interestExpense; } set { interestExpense = value; } } public double InterestRate { get { return interestRate; } set { interestRate = value; } } public double TotalDebt { get { return totalDebt; } set { totalDebt = value; } } public double FreeCashflowGrowth { get { return freeCashflowGrowth; } set { freeCashflowGrowth = value; } } public double OutstandingShares { get { return outstandingShares; } set { outstandingShares = value; } } public ReturnItems ReturnItems { get { return returnItems; } } public Cashflows Cashflows { get { return cashflows; } } public double StockPriceValuation { get { return stockPriceValuation; } set { stockPriceValuation = value; } } public double PresentValue { get { return presentValue; } set { presentValue = value; } } public double MarketReturn { get { return marketReturn; } set { marketReturn = value; } } public String Message { get { return message; } set { message = value; } } public bool Success { get { return success; } set { success = value; } } public Enhancements Enhancements { get { return enhancements; } set { enhancements = value; } } public override String ToString() { StringBuilder sb = new StringBuilder(); sb.Append(Symbol).Append(","); sb.Append(Success).Append(","); if (!Success) { sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(","); sb.Append(Message); } else { sb.Append(WACC).Append(","); sb.Append(MarketReturn).Append(","); sb.Append(CostOfEquity).Append(","); sb.Append(CostOfDebt).Append(","); sb.Append(MarketValueOfEquity).Append(","); sb.Append(MarketValueOfDebt).Append(","); sb.Append(TotalCapitalInvested).Append(","); sb.Append(CorporateTaxRate).Append(","); sb.Append(Beta).Append(","); sb.Append(RiskFreeRate).Append(","); sb.Append(InterestExpense).Append(","); sb.Append(InterestRate).Append(","); sb.Append(TotalDebt).Append(","); sb.Append(OutstandingShares).Append(","); sb.Append(FreeCashflowGrowth).Append(","); sb.Append(PresentValue).Append(","); sb.Append(StockPriceValuation).Append(","); if (null == currentPrice) { sb.Append(","); sb.Append(","); } else { sb.Append(CurrentPrice.Close).Append(","); sb.Append(Utility.DateTimeToStringMMSDDSYYYY(CurrentPrice.Date)).Append(","); } sb.Append(Enhancements.DebtLoad?"PASS":"FAIL").Append(","); sb.Append(Enhancements.ROIC).Append(","); sb.Append(Enhancements.ROICGrowth).Append(","); sb.Append(Enhancements.EPSGrowth).Append(","); sb.Append(Enhancements.RevenueGrowth).Append(","); sb.Append(Enhancements.BVPS).Append(","); sb.Append(Enhancements.PBVPS).Append(","); sb.Append(Enhancements.EPS).Append(","); sb.Append(Enhancements.PEG).Append(","); sb.Append(Enhancements.MOS).Append(","); sb.Append(Enhancements.MOS80).Append(","); sb.Append(Enhancements.IntrinsicValue).Append(","); sb.Append(Enhancements.IntrinsicValueRevised).Append(","); sb.Append(Enhancements.RGVIntrinsic).Append(","); sb.Append(Enhancements.RGVIntrinsicRevised).Append(","); sb.Append(Message); } return sb.ToString(); } public static String Header { get { StringBuilder sb = new StringBuilder(); sb.Append("SYMBOL,STATUS,WACC,MARKET_RETURN,COST_OF_EQUITY,COST_OF_DEBT,MARKET_VALUE_OF_EQUITY,MARKET_VALUE_OF_DEBT,TOTAL_CAPITAL_INVESTED,CORPORATE_TAX_RATE,BETA,RISK_FREE_RATE,INTEREST_EXPENSE,INTEREST_RATE,TOTAL_DEBT,OUTSTANDING_SHARES,FREE_CASHFLOW_GROWTH,PRESENT_VALUE,STOCK_PRICE_VALUATION,CURRENT_STOCK_PRICE,PRICING_DATE,"); sb.Append("DEBT_LOAD,"); sb.Append("ROIC_GROWTH,"); sb.Append("EPS_GROWTH,"); sb.Append("REVENUE_GROWTH,"); sb.Append("BVPS,"); sb.Append("PBVPS,"); sb.Append("EPS,"); sb.Append("PEG,"); sb.Append("MOS,"); sb.Append("MOS80,"); sb.Append("INTRINSIC_VALUE,"); sb.Append("INSTRINSIC_VALUE_REVISED,"); sb.Append("RGV_INSTRINSIC_VALUE,"); sb.Append("RGV_INSTRINSIC_VALUE_REVISED,"); sb.Append("MESSAGE"); return sb.ToString(); } } } }