Natural Gas Prices Are Again on an Unsustainable Upward Trajectory …

I identified a real-time market condition in the natural gas market (symbol = UNG) on LinkedIn and followed up on a prior r-bloggers post here.  The market ultimately declined 42% following the earlier breach of its identified unsustainable Stealth Support Curve


Chart from earlier r-blogger post



In short order, this same market is once again on another such path.  Once this market meaningfully breaks its current Stealth Support Curve, the magnitude of its ultimate decline is naturally indeterminate and is in no way guaranteed to again be ‘large.’   Nonetheless, it is highly improbable for market price evolution to continue along its current trajectory.  If market low prices continue to adhere to the current Stealth Support Curve (below), prices will increase at least +1,800% within a month.  Thus, the forecast of impending Stealth Support Curve breach is not a difficult one.  The relevant questions are 1) when will it occur and 2 ) what is the magnitude of decline following the breach?

Past and Current Stealth Support Curves

 
Stealth Support Curve Formulas



t1 = 9/28/2011

R Code
library(tidyverse)
library(readxl)

# Original data source - https://www.nasdaq.com/market-activity/funds-and-etfs/ung/historical

# Download reformatted data (columns/headings) from my github site and save to a local drive

# https://github.com/123blee/Stealth_Curves.io/blob/main/UNG_prices_4_11_2022.xlsx

# Load your local data file
ung <- read_excel("... Insert your local file path here .../UNG_prices_4_11_2022.xlsx")
ung


# Convert 'Date and Time' to 'Date' column
ung[["Date"]] <- as.Date(ung[["Date"]])
ung

bars <- nrow(ung)

# Add bar indicator as first tibble column
ung %
  add_column(t = 1:nrow(ung), .before = "Date")
ung

# Add 40 future days to the tibble for projection of the Stealth Curve once added
future <- 40
ung %
  add_row(t = (bars+1):(bars+future))

# Market Pivot Lows using 'Low' Prices
# Chart 'Low' UNG prices
xmin <- 2250
xmax <- bars + future
ymin <- 0
ymax <- 25
plot.new()
background <- c("azure1")
chart_title_low <- c("Natural Gas (UNG) \nDaily Low Prices ($)")
u <- par("usr") 
rect(u[1], u[3], u[2], u[4], col = background) 
par(ann=TRUE)
par(new=TRUE)
t <- ung[["t"]]
Price <- ung[["Low"]]
plot(x=t, y=Price, main = chart_title_low, type="l", col = "blue", 
     
     ylim = c(ymin, ymax) ,
     
     xlim = c(xmin, xmax ) ) 

# Add 1st Stealth Support Curve to tibble
# Stealth Support Curve parameters
a <-   -444.56  
b <-      6.26  
c <-  -2555.01  

ung %
  mutate(Stealth_Curve_Low_1 = a/(t + c) + b)
ung

# Omit certain Stealth Support Curve values from charting
ung[["Stealth_Curve_Low_1"]][1:2275] <- NA
ung[["Stealth_Curve_Low_1"]][2550:xmax] <- NA
ung

# Add 1st Stealth Curve to chart
lines(t, ung[["Stealth_Curve_Low_1"]])

# Add 2nd Stealth Support Curve to tibble
# Stealth Support Curve parameters
a <-   -277.30  
b <-      8.70  
c <-  -2672.65 

ung %
  mutate(Stealth_Curve_Low_2 = a/(t + c) + b)
ung

# Omit certain Stealth Support Curve values from charting
ung[["Stealth_Curve_Low_2"]][1:2550] <- NA
ung[["Stealth_Curve_Low_2"]][2660:xmax] <- NA
ung

# Add 2nd Stealth Curve to chart
lines(t, ung[["Stealth_Curve_Low_2"]])


The current low price is $22.68 on 4-11-2022 (Market close = $23.30).

The contents of this article are in no way meant to imply trading, investing, and/or hedging advice.  Consult your personal financial expert(s) for all such matters.   Details of Stealth Curve parameterization are found in my Amazon text,  ‘Stealth Curves: The Elegance of Random Markets’ .

Brian K. Lee, MBA, PRM, CMA, CFA

Connect with me on LinkedIn.        

Walmart’s (WMT) 7-Year Nonlinear Market Trend at ‘Critical Juncture’

This is a brief market update from my earlier post on October 28, 2021, Walmart’s 7-Year Nonlinear Market Trend using ‘Stealth Curves.’

The prior post indicated the then current nonlinear market structure for Walmart (WMT) stock.

October 28, 2021 Market View



Fast forward to today …

This market is now resting on its multi-year lower Stealth Support Curve. As the below updated graphic indicates, this represents a critical juncture for this market.

Current Market View (1-27-2022)



This current chart can be produced using the code in my October 2021 post along with updated market data.  The data is freely available from Nasdaq.com here. Just be certain the updated data match the column headings in my ‘reformatted’ GitHub data file.  
 
For those interested in numerous Stealth Curve examples applied to various other markets, simply view this LinkedIn post.  Full details of Stealth Curve equation parameterization are described in my latest Amazon publication, Stealth Curves: The Elegance of ‘Random’ Markets.

Feel free to contact me directly on my LinkedIn site.
 

Brian K. Lee, MBA, PRM, CMA, CFA


Natural Gas Prices Fall 42% in 3 Months Following Breach of ‘Nonlinear Stealth Support’


The below earlier LinkedIn post of well-defined nonlinear Stealth Support indicated price evolution for natural gas (UNG) was highly
likely on an unsustainable trajectory.



Within a month of the post, the market breached its well-defined Stealth Support Curve.  In the 3 months that followed, this market lost 42% of its value. 



The following R code reproduces the below Stealth Curve




UNG Stealth Curve – R Code
library(tidyverse)
library(readxl)

# Original data source - https://www.nasdaq.com/market-activity/funds-and-etfs/ung/historical

# Download reformatted data (columns/headings) from my github site and save to a local drive
# https://github.com/123blee/Stealth_Curves.io/blob/main/UNG_prices.xlsx

ung <- read_excel("... Insert your local file path here .../UNG_prices.xlsx")
ung

# Convert 'Date and Time' to 'Date' column
ung[["Date"]] <- as.Date(ung[["Date"]])
ung

bars <- nrow(ung)

# Add bar indicator as first tibble column

ung <- ung %>%
  add_column(t = 1:nrow(ung), .before = "Date")
ung

# Add 40 future days to the tibble for projection of the Stealth Curve once added

future <- 40

ung <- ung %>%
  add_row(t = (bars+1):(bars+future))

# Market Pivot Lows using 'Low' Prices

# Chart 'Low' UNG prices

xmin <- 2250
xmax <- bars + future
ymin <- 0
ymax <- 25

plot.new()

background <- c("azure1")

chart_title_low <- c("Natural Gas (UNG) \nDaily Low Prices ($)")

u <- par("usr") 

rect(u[1], u[3], u[2], u[4], col = background) 

par(ann=TRUE)

par(new=TRUE)

t <- ung[["t"]]
Price <- ung[["Low"]]

plot(x=t, y=Price, main = chart_title_low, type="l", col = "blue", 
     
     ylim = c(ymin, ymax) ,
     
     xlim = c(xmin, xmax ) ) 

# Add Stealth Curve to tibble

# Stealth Support Curve parameters
a <-   -444.56  
b <-      6.26  
c <-  -2555.01  


ung <- ung %>%
  mutate(Stealth_Curve_Low = a/(t + c) + b)
ung

# Omit certain Stealth Support Curve values from charting

ung[["Stealth_Curve_Low"]][2550:xmax] <- NA
ung

# Add Stealth Curve to chart

lines(t, ung[["Stealth_Curve_Low"]])
Details of Stealth Curve parameterization are detailed in my ‘Stealth Curves: The Elegance of Random Markets’ text on Amazon.

Brian K. Lee, MBA, PRM, CMA, CFA

Feel free to contact me on LinkedIn.      

Nonlinear Market Forecasting using ‘Stealth Curves’

In 2001, I was fortunate to discover a ‘market characteristic’ that transcends virtually every liquid market. Markets often trend in a nonlinear fashion according to hidden support/resistance curves (Stealth Curves).  Whereas ‘market anomalies’ are transient and are overwhelmingly market specific, Stealth Curves are highly robust across virtually every market and stand the test of time. Using R, I chart several Stealth Curve examples relative to the wheat market (symbol = WEAT). Download data from my personal GitHub site and read into a ‘weat’ tibble.

library(tidyverse)
library(readxl)

# Original data source - https://www.nasdaq.com/market-activity/funds-and-etfs/weat/historical

# Download reformatted data (columns/headings) from github
# https://github.com/123blee/Stealth_Curves.io/blob/main/WEAT_nasdaq_com_data_reformatted.xlsx

# Insert your file path in the next line of code 

weat <- read_excel("... Place your file path Here ... /WEAT_nasdaq_com_data_reformatted.xlsx")
weat


# Convert 'Date and Time' to 'Date' column
weat[["Date"]] <- as.Date(weat[["Date"]])
weat

bars <- nrow(weat)

# Add bar indicator as first tibble column

weat <- weat %>%
     add_column(t = 1:nrow(weat), .before = "Date")
weat
View tibble



Prior to developing Stealth Curve charts, it is often advantageous to view the raw data in an interactive chart.

# Interactive Pricing Chart

xmin <- 1              
ymin <- 0   
ymax_close <- ceiling(max(weat[["Close"]]))
ymax_low <- ceiling(max(weat[["Low"]]))
ymax_high <- ceiling(max(weat[["High"]]))

interactive <- hPlot(x = "t", y = "Close", data = weat, type = "line",
               
               ylim = c(ymin, ymax_close),
               
               xlim = c(xmin, bars),
               
               xaxt="n",   # suppress x-axis labels
               
               yaxt="n",   # suppress y-axis labels,
               
               ann=FALSE)  # x and y axis titles

interactive$set(height = 600)

interactive$set(width = 700)

interactive$plotOptions(line = list(color = "green"))

interactive$chart(zoomType = "x")   # Highlight range of chart to zoom in

interactive


Interactive Chart
WEAT Daily Closing Prices 




Highlight any range to zoom data and view price on any bar number.

Interactive Chart
WEAT Daily Closing Prices (Zoomed)




Prior to plotting, add 400 additional rows to the tibble in preparation for extending the calculated Stealth Curve into future periods.

# Add 400 future days to the plot for projection of the Stealth Curve
 
 future <- 400
 
 weat <- weat %>%
   add_row(t = (bars+1):(bars+future))
Chart the WEAT daily closing prices with 400 days of padding. 

 # Chart Closing WEAT prices
 
 plot.new()
 
 chart_title_close <- c("Teucrium Wheat ETF (Symbol = WEAT) \nDaily Closing Prices ($)")
 
 background <- c("azure1") 
 
 u <- par("usr") 
 
 rect(u[1], u[3], u[2], u[4], col = background) 
 
 par(new=TRUE)
 
 t <- weat[["t"]]
 Price <- weat[["Close"]]
 
 plot(x=t, y=Price, main = chart_title_close, type="l", col = "blue",        
      
      ylim = c(ymin, ymax_close) ,
      
      xlim = c(xmin, (bars+future )) ) 
The below chart represents 10 years of closing prices for the WEAT market since inception of the ETF on 9/19/2011.  The horizontal axis represents time (t) stated in bar numbers (t=1 = bar 1 = Date 9/19/2011).  This starting ‘t‘ value is entirely arbitrary and does not impact the position of a calculated Stealth Curve on a chart.



The above chart displays a ‘random’ market in decline over much of the decade.

Stealth Curves reveal an entirely different story.  They depict extreme nonlinear order with respect to market pivot lows. In order for Stealth Curves to be robust across most every liquid market, the functional form must not only be simple – it must be extremely simple. The following Stealth Curve equation is charted against the closing price data.
 # Add Stealth Curve to tibble
 
 # Stealth Curve parameters
 a <- 7231.88  
 b <-  1.18 
 c <- -7.77 
 
 weat <- weat %>%
   mutate(Stealth_Curve_Close = a/(t + c) + b)
 weat


As the Stealth Curve is negative in bars 1 through 7, these values are ignored in the chart by the use of NA padding.

 # Omit negative Stealth Curve values in charting, if any
 
 z1 <- weat[["Stealth_Curve_Close"]]
 
 weat[["Stealth_Curve_Close"]] <- ifelse(z1 < 0, NA, z1)
 weat


Add the Stealth Curve to the chart.

# Add Stealth Curve to chart
 
 lines(t, weat[["Stealth_Curve_Close"]])
Closing Prices with Stealth Curve


Once the Stealth Curve is added to the chart, extreme nonlinear market order is clearly evident.  

I personally refer to this process as overlaying a cheat-sheet on a pricing chart to understand why prices bounced where they did and where they may bounce on a go-forward basis. Stealth Curves may be plotted from [-infinity, + infinity].

The human eye is not adept at discerning the extreme accuracy of this
Stealth Curve.  As such, visual aids are added.  This simple curve serves as a strange attractor to WEAT closing prices.  The market closely hugs the Stealth Curve just prior to t=500 (oval) for 3 consecutive months.  The arrows depict 10 separate market bounces off/very near the curve.



While some of the bounces appear ‘small,’ it is important to note the prices are also relatively small.  As an example, the ‘visually small bounce’ at the ‘3rd arrow from the right’ represents a 10%+ market gain. That particular date is of interest, as it is the exact date I personally identified this Stealth trending market for the first time.  I typically do not follow the WEAT market.  Had I done so, I could have identified this Stealth Curve sooner in time.  A Stealth Curve requires only 3 market pivot points for definition.

Reference my real-time LinkedIn post of this Stealth Curve at the ‘3rd arrow’ event here. This multi-year Stealth Curve remains valid to the current date.  By definition, a Stealth Curve remains valid until it is penetrated to the downside in a meaningful manner.  Even then, it often later serves as market resistance. On occasion, a Stealth Curve will serve as support followed by resistance followed by support (reference last 2 charts in this post).   

Next, a Stealth Curve is applied to market pivot lows as defined by high prices.  

Chart high prices.

# Market Pivot Lows using High Prices
 
 # Chart High WEAT prices
 
 plot.new()
 
 chart_title_high <- c("Teucrium Wheat ETF (Symbol = WEAT) \nDaily High Prices ($)")
 
 u <- par("usr") 
 
 rect(u[1], u[3], u[2], u[4], col = background) 
 
 par(ann=TRUE)
 
 par(new=TRUE)
 
 t <- weat[["t"]]
 Price <- weat[["High"]]
 
 plot(x=t, y=Price, main = chart_title_high, type="l", col = "blue", 
      
      ylim = c(ymin, ymax_high) ,
      
      xlim = c(xmin, (bars+future )) )  


The parameterized Stealth Curve equation is as follows:
Add the Stealth Curve to the tibble.


# Add Stealth Curve to tibble
 
 # Stealth Curve parameters
 a <- 7815.16  
 b <-    1.01 
 c <-   37.35 
 
 weat <- weat %>%
   mutate(Stealth_Curve_High = a/(t + c) + b)
 
 # Omit negative Stealth Curve values in charting, if any
 
 z2 <- weat[["Stealth_Curve_High"]]
 
 weat[["Stealth_Curve_High"]] <- ifelse(z2 < 0, NA, z2)
 weat



 # Add Stealth Curve to chart
 
 lines(t, weat[["Stealth_Curve_High"]])


When backcasted in time, this Stealth Curve transitions from resistance to support and is truly amazing. When a backcasted Stealth Curve, relative to the data used for curve parameterization, displays additional periods of market support/resistance; additional confidence is placed in its ability to act as a strange attractor.  Based on visual inspection, it is doubtful no other smooth curve (infinitely many) could coincide with as many meaningful pivot highs and lows (21 total) over this 10-year period as this simple Stealth Curve. In order to appreciate the level of accuracy of the backcasted Stealth Curve, a log chart is presented of a zoomed sectional of the data. 

 # Natural Log High Prices 
 
 # Chart High WEAT prices
 
 plot.new()
 
 chart_title_high <- c("Teucrium Wheat ETF (Symbol = WEAT) \nDaily High Prices ($)")
 
 u <- par("usr") 
 
 rect(u[1], u[3], u[2], u[4], col = background) 
 
 par(ann=TRUE)
 
 par(new=TRUE)
 
 chart_title_log_high <- c("Teucrium Wheat ETF (Symbol = WEAT) \nNatural Log of Daily High Prices ($)")
 
 t <- weat[["t"]]
 Log_Price <- log(weat[["High"]])
 
 plot(x=t, y=Log_Price, main = chart_title_log_high, type="l", col = "blue", 
      
      ylim = c(log(7), log(ymax_high)) ,
      
      xlim = c(xmin, 800) ) # (bars+future )) )  
 
 # Add Log(Stealth Curve) to chart
 
 lines(t, log(weat[["Stealth_Curve_High"]]))
Zoomed Sectional
Log(High Prices) and Log(Stealth Curve)
WEAT



There are
11 successful tests of Stealth Resistance including the all-time market high of the ETF.


In total, this Stealth Curve exactly or closely identifies 21 total market pivots (Stealth Resistance = 11, Stealth Support = 10).

Lastly, a Stealth Curve is presented based on market pivot lows defined by low prices.

# Market Pivot Lows using Low Prices
 
 # Chart Low WEAT prices
 
 plot.new()
 
 u <- par("usr") 
 
 rect(u[1], u[3], u[2], u[4], col = background) 
 
 par(ann=TRUE)
 
 par(new=TRUE)
 
 chart_title_low <- c("Teucrium Wheat ETF (Symbol = WEAT) \nDaily Low Prices ($)")
 
 t <- weat[["t"]]
 Price <- weat[["Low"]]
 
 
 plot(x=t, y=Price, main = chart_title_low, type="l", col = "blue", 
      
      ylim = c(ymin, ymax_low) ,
      
      xlim = c(xmin, (bars+future )) )  
Chart the low prices.



The parameterized Stealth Curve equation based on 3 pivot lows is given below.
Add the calculated Stealth Curve to the tibble.


 # Add Stealth Curve to tibble
 
 # Stealth Curve parameters
 a <- 9022.37  
 b <-    0.48 
 c <-  125.72 
 
 weat <- weat %>%
   mutate(Stealth_Curve_Low = a/(t + c) + b)

 # Omit negative Stealth Curve values in charting, if any
 
 z3 <- weat[["Stealth_Curve_Low"]]
 
 weat[["Stealth_Curve_Low"]] <- ifelse(z3 < 0, NA, z3)
 weat


Add the Stealth Curve to the chart. 


# Add Stealth Curve to chart
 
 lines(t, weat[["Stealth_Curve_Low"]])
 



Intentionally omitting identifying arrows, it is clearly obvious this Stealth Curve identifies the greatest number of pivot lows of the 3 different charts presented (close, high, low).

As promised, below are 2 related Stealth Curve charts I posted in 2005 that transitioned from support, to resistance, to support, and then back to resistance (data no longer exists – only graphics).  This data used Corn reverse adjusted futures data.  The Stealth Curve was defined using pivot low prices.  Subsequent market resistance applied to market high prices (Chart 2 of 2). 

Chart 1 of 2




Chart 2 of 2



For those interested in additional
Stealth Curve examples applied to various other markets, simply view my LinkedIn post here.  Full details of Stealth Curve model parameterization are described in my latest Amazon publication, Stealth Curves: The Elegance of ‘Random’ Markets.

Brian K. Lee, MBA, PRM, CMA, CFA
[email protected] 

 

Four (4) Different Ways to Calculate DCF Based ‘Equity Cash Flow (ECF)’ – Part 4 of 4


This represents Part 4 of a 4-part series relative to the calculation of Equity Cash Flow (ECF) using R.  If you missed any of the prior posts, be certain to reference them before proceeding. Content in this section builds on previously described information/data.

Part 3 of 4 prior post is located here – Part 3 of 4 .

‘ECF – Method 4’ differs slightly from the prior 3 versions.  Specifically, it represents ECF with an adjustment.  By definition, Equity Value (E) is calculated as the present value of a series of Equity Cash Flow (ECF) discounted at the appropriate discount rate, the cost of levered equity capital, Ke. When using forward rate discounting, the equation for E is as follows:
The cost of levered equity capital (Ke) is shown below.

Where



Many DCF practitioners incorrectly assume the cost of equity capital (Ke) is constant in all periods.  The above equation indicates Ke can easily vary over time even if Ku, Kd, and T are all constant values.  Assuming a constant Ke value when such does not apply violates a basic premise of valuation, the value additivity rule, Debt Value (D) + Equity Value (E) = Asset Value (V). Substituting the cost of equity capital (Ke) into the Equity valuation (E) equation yield this.

Note in the above valuation equation, equity value is a function of itself. We require Equity Value (E) in the prior period (t-1) in order to obtain the discount rate (Ke) for the current period “t.” This current period discount rate is used to calculate prior period’s equity value.  This is clearly a circular calculation, as Equity Value (E) in the prior period (t-1) exists on both sides of the equation.  While Excel solutions with intentional circular references such as this can be problematic, R experiences no such problems in proper iterative solution.  Even so, we can completely bypass calculation circularity altogether and arrive at the correct iterative, circular solution. Using simple 8th grade math, a noncircular equity valuation equation is derived. Note this new noncircular equation requires a noncircular discount rate (Ku) and a noncircular numerator term in which to discount. All calculation circularity is eliminated in the equity valuation equation. The numerator includes a noncircular adjustment to Equity Cash Flow (ECF).


The 2 noncircular discount rates (Ku, Kd) are calculated using the Capital Asset Pricing Model (CAPM).

The noncircular debt valuation (D) equation using forward rate (Kd) discounting is provided below.



Reference Part 2 of 4 in this series for the calculation of debt cash flow (CFd). Update ‘data’ tibble
data <- data %>%
  mutate(Rf = rep(0.03, 6),
         MRP = rep(0.04, 6),
         Bd = rep(0.2, 6),
         Bu = rep(1.1, 6),
         Kd = Rf + Bd * MRP,
         Ku = Rf + Bu * MRP,
         N = np + cpltd + LTD,   # All interest bearing debt
         CFd = ie - (N - lag(N, default=0)),
         ECF3 = ni - ii*(1-T_) - ( Ebv - lag(Ebv, default=0) ) + ( MS  - lag(MS, default=0)) ) 

View tibble
rotate(data)


The R code below calculates Debt Value (D) and Equity Value (E) each period. The function sum these 2 values to obtain asset value (V).

R Code – ‘valuation’ R function
valuation <- function(a) {
  
  library(tidyverse)
  
  n <- length(a$bd) - 1
  
  Rf  <- a$Rf
  MRP <- a$MRP
  Ku  <- a$Ku
  Kd  <- a$Kd
  T_   <- a$T_
  
  # Flow values
  
  CFd <- a$CFd
  ECF <- a$ECF3
  
  # Initialize valuation vectors to zero by Year
  
  d <- rep(0, n+1 )  # Initialize debt value to zero each Year
  e <- rep(0, n+1 )  # Initialize equity value to zero each Year
  
  # Calculate debt and equity value by period in reverse order using discount rates 'Kd' and 'Ku', repsectively
  
  for (t in (n+1):2)    # reverse step through loop from period 'n+1' to 2
  {
    
    # Debt Valuation discounting 1-period at the forward discount rate, Kd[t]
    
    d[t-1] <- ( d[t] + CFd[t] ) / (1 + Kd[t] )
    
     # Equity Valuation discounting 1-period at the forward discount rate, Ku[t]
    
    e[t-1] <- ( e[t] + ECF[t] - (d[t-1])*(Ku[t]-Kd[t])*(1-T_[t]) ) / (1 + Ku[t] )
    
  }
  
  # Asset valuation by Year (Using Value Additivity Equation)
  v = d + e
  
  npv_0 <- round(e[1],0) + round(ECF[1],0)
  npv_0 <- c(npv_0, rep(NaN,n) )
  
  valuation <- as_tibble( cbind(a$Year, T_, Rf, MRP, Ku, Kd, Ku-Kd, ECF,
                                   -lag(d, default=0)*(1-T_)*(Ku-Kd), ECF - lag(d, default=0)*(1-T_)*(Ku-Kd), 
                                    d, e, v, d/e, c( ECF[1], rep(NaN,n)), npv_0 ) )  
  
  names(valuation) <- c("Year", "T", "Rf", "MRP", "Ku", "Kd", "Ku_Kd", "ECF",
                           "ECF_adj", "ADJ_ECF", "D", "E", "V", "D_E_Ratio", "ECF_0", "NPV_0")
  
  return(rotate(valuation))
}
View R output
valuation <- valuation( data )

round(valuation, 5)


This method of noncircular equity valuation (E) is simple and straightforward.  Unfortunately, DCF practitioners tend to incorrectly treat Ke as a noncircular calculation using CAPM.  That widely used approach violates the value additivity rule.


Additionally, there is a widely held belief the Adjusted Present Value (APV) asset valuation approach is the only one that provides a means of calculating asset value in a noncircular fashion.

Citation: Fernandez, Pablo, (August 27, 2020), Valuing Companies by Cash Flow Discounting: Only APV Does Not Require Iteration. 

Though the APV method is almost 50 years old, there is little agreement as to how to correctly calculate one of the model’s 2 primary components – the value of interest expense tax shields.  The above 8th grade approach to equity valuation (E) eliminates the need to use the APV model for asset valuation if calculation by noncircular means is the goal. Simply sum the 2 noncircular valuation equations below (D + E).  They ensure the enforcement of the value-additivity rule (V = D + E). Valuation Additivity Rule
(Assuming debt and equity are the 2 sources of financing)

In summary, circular equity valuation (E) is entirely eliminated using simple 8th grade math.  Adding this noncircular equity valuation (E) solution to noncircular debt valuation (D) results in noncircular asset valuation (V). There is no need to further academically squabble over the correct methodology for valuing tax shields relative to the noncircular APV asset valuation model.  Tax shields are not separately discounted using the above approach.

This example is taken from my newly published textbook, ‘Advanced Discounted Cash Flow (DCF) Valuation using R.’  The above method is discussed in far greater detail, including the requisite 8th grade math, along with development of the integrated financials using R. Included in the text are 40+ advanced DCF valuation models – all of which are value-additivity compliant.

Typical corporate finance texts do not teach this very important concept.  As a result, DCF practitioners often unknowingly violate the immensely important value-additivity rule.  This modeling error is closely akin to violating the accounting equation (Book Assets = Book Liabilities + Book Equity) when constructing pro form balance sheets used in a DCF valuation. 

For some reason, violation of the accounting equation is considered a valuation sin, while violation of the value-additivity rule is a well-established practice in DCF valuation land.  

Reference my website for additional details.

https://www.leewacc.com/

Next up, 10 Different, Mathematically Equivalent Ways to Calculate Free Cash Flow (FCF) …

Brian K. Lee, MBA, PRM, CMA, CFA  

Four (4) Different Ways to Calculate DCF Based ‘Equity Cash Flow (ECF)’ –  Part 3 of 4


This represents Part 3 of a 4-part series relative to the calculation of Equity Cash Flow (ECF) using R.  If you missed Parts 1 and 2, be certain to reference them before proceeding. Content in this section builds off previously described information/data. Part 1 prior post is located here – Part 1 of 4 .
Part 2 prior post is located here – Part 2 of 4 . ‘ECF – Method 3’ is defined as follows:  In words, Equity Cash Flow (ECF) equals Net Income (NI) less after-tax Interest Income less the change in the quantity ‘Equity Book Value (Ebv) minus Marketable Securities (MS).’ All terms in the equation are defined in the prior posts except for Ebv. 

Reference details of the 5-year capital project’s fully integrated financial statements developed in R at the following link.  The R output is formatted in Excel and produced in a PDF file for ease of viewing.  Zoom the PDF for detail. 

Financial Statements The Equity Book Value (Ebv) vector is added to the data tibble below.
data <- data %>%
mutate(Ebv = c(250000, 295204.551, 429491.869, 678425.4966, 988024.52, 0 ))
Though Ebv values are entered as known values, they are calculated in the text noted at the conclusion of this post.

View tibble.

R function ECF3 defines the Equity Cash Flow (ECF) equation and its components.   ‘ECF – Method 3’ R function
ECF3 <- function(a, b) {
  
  library(tibble)
  
  ECF3 <- a$ni -a$ii*(1-a$T_) - ( a$Ebv -lag(a$Ebv, default=0) ) + ( a$MS  - lag(a$MS, default=0) )  
  
  ECF_3 <-     tibble(T              = a$T_,
                      ii             = a$ii,
                      ni             = a$ni,
                      Year           = c(0:(length(ii)-1)),
                      ii_AT          = -ii*(1-T),
                      ni_less_ii_AT   = ni + ii_AT,
                      Ebv            = a$Ebv,
                      MS             = -a$MS,
                      Ebv_less_MS    = Ebv + MS,
                      chg_Ebv_less_MS  = - (Ebv_less_MS - lag(Ebv_less_MS, default=0) ) ,
                      ECF_3          = ni_less_ii_AT + chg_Ebv_less_MS )
  
  ECF_3 <- rotate(ECF_3)
  
  return(ECF_3)
  
}
 Run the R function and view the output.



R Output formatted in Excel

ECF – Method 3



ECF Method 3‘ agrees with the prior published methods each year.  Any differences are due to rounding error.

This ECF calculation example is taken from my newly published textbook, ‘Advanced Discounted Cash Flow (DCF) Valuation Using R.’ The above method is discussed in far greater detail along with development of the integrated financials using R as well 40+ advanced DCF valuation models – all of which are value-additivity compliant. Typical corporate finance texts do not teach this very important concept. 

The text importantly clearly explains ‘why’ these ECF calculation methods are mathematically equivalent, though the equations may appear vastly different. 

Reference my website for further details.

https://www.leewacc.com/

Next up, ‘ECF – Method 4‘ …

Brian K. Lee, MBA, PRM, CMA, CFA

Four (4) Different Ways to Calculate DCF Based ‘Equity Cash Flow (ECF)’ – Part 2 of 4

This represents Part 2 of a 4-part series relative to the calculation of Equity Cash Flow (ECF) using R.  If you missed Part 1, be certain read that first part before proceeding. The content builds off prior described information/data.

Part 1 previous post is located here.
‘ECF – Method 2’ is defined as follows: 
 
The equation appears innocent enough, though there are many underlying terms that require definition for understanding of the calculation. In words, ‘ECF – Method 2’ equals free cash Flow (FCFF) minus after-tax Debt Cash Flow (CFd).

Reference details of the 5-year capital project’s fully integrated financial statements developed in R at the following link.  The R output is formatted in Excel.  Zoom for detail. 

https://www.dropbox.com/s/lx3uz2mnei3obbb/financial_statements.pdf?dl=0
The first order of business is to define the terms necessary to calculate FCFF.




Next, pretax Debt Cash Flow (CFd) and its components are defined as follows:

  The following data are added to the ‘data’ tibble from the prior article relative to the financial statements.
data <- data %>%
  mutate(ie    = c(0, 10694, 8158, 527, 627, 717 ),
         np    = c(31415, 9188, 13875,  16500, 18863, 0),
         LTD   = c(250000, 184952, 0, 0, 0, 0),
         cpltd = c(0, 20550, 0, 0, 0, 0),
         ni    =  c(0, 47584,  141355,  262035, 325894, 511852),
         bd    =  c(0, 62500,  62500,   62500,   62500,   62500),
         chg_DTL_net = c(0, 35000,  55000,  35000, -25000, -100000),
         cash  = c(30500,  61250, 92500, 110000, 125750, 0),
         ar    = c(0, 61250,  92500,  110000,  125750, 0),
         inv   = c(30500, 61250, 92500, 110000,  125750, 0),
         pe    = c(915, 1838, 2775, 3300, 3773, 0),
         ap    = c(30500, 73500, 111000, 132000, 150900, 0),
         wp    = c(0, 5513, 8325, 9900, 11318, 0),
         itp   = c(0, -819.377,  9809,  34923, 60566, 0),
         CapX  = c(500000,0,0,0,0,0),
         gain  = c(0,0,0,0,0,162500),
         sp  = c(0,0,0,0,0,350000))
View tibble.



All of the above calculations are defined in the below R function ECF_2. ‘ECF – Method 2’ R function
ECF_2 <- function(a) {
  
  ECF2 <-      tibble(T_        = a$T_,
                       ie       = a$ie,
                       ii       = a$ii,
                       Year     = c(0:(length(ii)-1)),
                       ni       = a$ni,
                       bd       = a$bd,
                       chg_DTL_net = a$chg_DTL_net,
                       gain     = - a$gain,
                       sp       = a$sp,
                       ie_AT    = ie*(1-a$T_),
                       ii_AT    = - ii*(1-a$T_),
                       gcf      = ni + bd + chg_DTL_net + gain + sp 
                                + ie_AT + ii_AT,
                       OCA      = a$cash + a$ar + a$inv + a$pe,
                       OCL      = a$ap + a$wp + a$itp,
                       OWC      = OCA - OCL,
                       chg_OWC  = OWC - lag(OWC, default=0),
                       CapX     = - a$CapX,
                       FCFF1    = gcf + CapX - chg_OWC,
                       N        = a$LTD + a$cpltd + a$np,
                       chg_N    = N - lag(N, default=0),
                       CFd_AT   = ie*(1-T_) - chg_N,   
                       ECF2     = FCFF1 - CFd_AT )
                      
  
  ECF2 <- rotate(ECF2)
  return(ECF2)
  
}

Run the R function and view the output.



R Output formatted in Excel
Method 2



ECF Method 2‘ agrees with the prior results from ‘ECF Method 1‘ each year.  Any differences are due to rounding error.

This ECF calculation example is taken from my newly published textbook, ‘Advanced Discounted Cash Flow (DCF) Valuation using R.’  It is discussed in far greater detail along with development of the integrated financials using R as well as numerous, advanced DCF valuation modeling approaches – some never before published. The text importantly clearly explains ‘why’ these ECF calculation methods are mathematically exactly equivalent, though the individual components appear vastly different.

Reference my website for further details.

https://www.leewacc.com/

Next up, ‘ECF – Method 3’ …

Brian K. Lee, MBA, PRM, CMA, CFA




 

Four (4) Different Ways to Calculate DCF Based ‘Equity Cash Flow (ECF)’ – Part 1 of 4



Over the next several days, I will present 4 different methods of correctly calculating Equity Cash Flow (ECF) using R.  The valuation technique of discounted cash flow (DCF) estimates equity value (E) as the present value of forecasted ECF.  The appropriate discount rate for this flow definition is the cost of equity capital (Ke).

‘ECF – Method 1’ is defined as follows: 



where



Note: ECF is not simply ‘dividends.’  A common misconception is that discounted dividends (DIV) provide equity value.  An example of this is the common ‘dividend growth’ equity valuation model found in many corporate finance texts.  All ‘dividend growth’ models that discount dividends (DIV) at the cost of equity capital (Ke) are incorrect unless forecasted 1) marketable securities (MS) balances are zero, and 2) there is no issuance or repurchase of equity shares.

The data assumes a 5-year year hypothetical capital project.  A single revenue producing asset is purchased at the end of ‘Year 0‘ and is sold at the end of ‘Year 5.’  The $500,000 asset is purchased assuming 50% debt and 50% equity financing.   

Further, the data used to estimate ECF in this example are taken from fully integrated pro forma financial statements and other relevant data assumptions including the corporate tax rate.  This particular example only requires financial data from integrated pro forma  income statements and balance sheets.  These 2 pro forma financial statements are shown below with the relevant data rows highlighted. 



https://www.dropbox.com/s/xwy97flxe99gqr9/financials.pdf?dl=0

The above link provides access to a PDF of all financial statement pro forma data and is easily zoomable for viewing purposes.

The relevant data used to calculate ECF are initially placed in a tibble.

library(tidyverse)


data <- tibble(Year = c(0:5),
              div  = c(0, 2379, 7068, 13102, 16295, 1249876),
              MS   = c(0, 0, 7226, 350948, 698648, 0),
              ii   = c(0, 0, 0, 253, 12283, 24453),
              pic  = c(250000, 250000, 250000, 250000, 250000, 0), 
              T_   = c(0.25, 0.40, 0.40, 0.40, 0.40, 0.40))

data



An R function is created to rotate the data in standard financial data presentation format (each data line item occupies a single row instead of a column)

rotate <- function(r) {
  
  p <- t(as.matrix(as_tibble(r)))
  
  return(p)
  
}

View the  rotated data

rotate(data)



An R function reads in the appropriate data, performs the necessary calculations, and outputs the data.  The R output is then placed in a spreadsheet to formatting purposes. 

‘ECF – Method 1’ R function
ECF_1 <- function(a) {
  
  ECF1 <-     tibble( T_             = a$T_,
                      pic            = a$pic,
                      chg_pic        = pic - lag(pic, default=0),
                      MS             = a$MS,
                      ii             = a$ii,
                      Year           = c(0:(length(T_)-1)),
                      div            = a$div,
                      net_new_equity = -chg_pic,   
                      chg_MS         = MS - lag(MS, default=0),
                      ii_AT          = -ii*(1-T_),
                      ECF1           = div + net_new_equity 
                                       + chg_MS + ii_AT )
  
  ECF1 <- rotate(ECF1)
  
  return(ECF1)
  
}

View R Output

ECF_method_1 <- ECF_1( data)
ECF_method_1



Excel formatting applied to R Output



It is quite evident there is far more than just dividends (DIV) involved in the proper calculation of ECF.  Use of a ‘dividend growth’ equity valuation model in this instance would result in significant model error.

This ECF calculation example is taken from my newly published textbook, ‘Advanced Discounted Cash Flow (DCF) Valuation using R.’  It is discussed in far greater detail along with development of the integrated financials using R as well as numerous, advanced DCF valuation modeling approaches – some never before published.

Reference my website for further details.

https://www.leewacc.com/

Next up, ‘ECF – Method 2’ …

Brian K. Lee, MBA, PRM, CMA, CFA