The Milk & Baker case study, details the evolution of the milk industry in
California as well as relevant federal policies, marketing programs and futures
markets. Over recent decades there has been massive aggregation in the dairy sector,
especially in California, during which a handful of larger dairy farms grew substantially
at the expense of smaller dairy farms. This was achieved by the larger farms having
higher productivity margins, utilizing technology and exhibiting better control over
operational costs. Size supported survivorship for the dairy farm industry
from 1970 to 2006, as can be learn from the data provided.
Throughout the study we learn of Gerard, an owner of a large dairy farm in California
who has been struggling with rising input costs, fluctuating milk prices and unclear
hedging strategies. We gather from the article that he is considering buying
put options (insurance from a falling market) and trying to estimate his upside
from it. Put Options can allow an investor to limit their losses, however there
are disadvantages, such as:
1. The potential upside is limited and payoff is relative to the falling market
2. They are complex investment tools, so pricing them is relatively hard as they involve
stochastic factors
3. Gerard would only benefit if the market is reasonably volatile
Using the data provided we have computed which commodity futures
correlate the most with mailbox price. We have also come up with predictions
for profit from put options for the right combinations of Strike price and
underlying asset price. We have also incorporated the costs of put options
and transactional costs while coming up with estimates with reasonable assumptions.
Based on dairy pricing data from January 2004 to May 2007 along with corresponding
mailbox prices, four SLR models were generated using the mailbox price to predict
the prices of Class III milk, Class IV milk, butter and nonfat dry milk.
lm_Class.3 <- lm(Class.III ~ Mailbox, data = milk)
lm_Class.4 <- lm(Class.IV ~ Mailbox, data = milk)
lm_Butter <- lm(Butter ~ Mailbox, data = milk)
lm_NFDM <- lm(NFDM ~ Mailbox, data = milk)
The resulting models are:
\(Y_1 = -1.557 + 1.182X\)
\(Y_2 = 2.6891 + 0.7599X\)
\(Y_3 = -0.1031 + 1.1227X\)
\(Y_4 = 0.72693 + 0.02339X\)
Where \(X\) is the Mailbox price, \(Y_1\) is the price of Class III milk, \(Y_2\) is the price of Class IV milk, \(Y_3\) is the price of butter and \(Y_4\) is the price of nonfat dry milk.
Using these four models to make predictions for the asset price given a mailbox
price of X = $12.50, we predict that the asset prices will be $13.22, $12.19, $1.43
and $1.02 for Class III milk, Class IV milk, butter and nonfat dry milk,
respectively, and are displayed in Figs. 2.1.a - 2.1.d below.
Based on Figs. 2.1.a - 2.1.d, it appears that Class III milk has the strongest
relationship with Mailbox price and that nonfat dry milk has the weakest relationship
with Mailbox price. The correlation matrix is computed in order to precisely
determine which commodity is correlated strongest with the Mailbox price (Table 2.2).
Table 2.2: Correlation Matrix for Dairy Commodity Prices
Mailbox Class.IV Class.III Butter NFDM
Mailbox 1.0000000 0.8438798 0.9627200 0.7854923 0.1712796
Class.IV 0.8438798 1.0000000 0.8155221 0.5507575 0.5595575
Class.III 0.9627200 0.8155221 1.0000000 0.7225272 0.2233964
Butter 0.7854923 0.5507575 0.7225272 1.0000000 -0.2933746
NFDM 0.1712796 0.5595575 0.2233964 -0.2933746 1.0000000
For a more visual representation we have a correlation plot (Fig. 2.2.a).
Fig. 2.2.a: Correlation Plot for Dairy Commodity Prices
Indeed Class 3 milk is correlated strongest with Mailbox price
Checking for the distribution of Residuals of Class 3 futures & Mailbox
residualPlot(lm_Class.3, main = "Residual Plot for Class 3 Futures",
col.main = 'dark blue')
The residuals of the above plot don't seem to have flat line.
We have discussed the possibilities in the Appendix section 3.1
We perform a one tailed test as we only want the futures's prices to decrease.
Hence we will have a single threshold point, below which we
always want the futures's price to be. Hence we take the upper bound
at the 95 percentile mark as the Strike Price,
which shall produce profit 95% time for the Put Option Buyer.
We choose the Class 3 Future as it is most closely related to the Mailbox price.
Strike price should be: $ 14.24
However since the strike prices of Class III milk futures come in increments of $0.25, for example
$11.50, $11.75, $12.00, we choose the approximate strike price for this contract.
So choosing a strike price of $14.25 based on the above computation and
visualizing the pay-off from the put options for Gerard at a strike Price
of $14.25. Figure 2.3 shows how the payout of a put option varies with
future price.
Making predictions for the possible price for Class 3 milk, based on the previous
prediction model. This is a one tail test as we want the futures's prices
to move in only the decreasing direction. Hence we will only have a threshold
point, below which we always want the futures's price to be.
Hence we take the upper bound at the 95 percentile mark as the strike price,
which shall produce profit 95% time for the Put Option buyer.
CI.2 <- predict(lm_1, data.frame(Mailbox = 11.5), level = .90
, interval = "prediction")
Strike_price_2 <- CI.2[1]
cat("The value of the put option would be:", round(Strike_price_2, 2))
The value of the put option would be: 12.04
Gerard couldn't be sure that his net price would exceed $12.50 with 95% confidence.
This is because the point estimate of this put option at 95% is 11.01.
Moreover, Gerard could be 95% confident that his put option would have a price
of $11.01 or more. In order to include the net price of $12.50, the confidence
level would need to be significantly lower, specifically:
perc <- 100 * (1 - pnorm(12.5, mean = 12.04, sd = sd(milk$Class.III)))
cat("We could be:", perc,"% sure of strike price crossing 12.5")
We could be: 41.66667 % sure of strike price crossing 12.5
Looking more closely at the scatterplot and residual plot of
the Class III price vs. mailbox price model, there seem to some deviations
from the Normal distribution. Lets explore the curvilinear fit of the response and
dependent variable by including 2nd and 3rd degree terms of the predictor to the model.
Order of fit R-squared
1 1 0.927
2 2 0.951
3 3 0.957
#analyzing the relation for the same (Adding a Degree 3 term)
boxTidwell(Class.III ~ Mailbox, data = milk)
Score Statistic p-value MLE of lambda
4.196027 2.72e-05 2.925734
iterations = 3
lm_3 <- lm(Class.III ~ Mailbox + I(Mailbox ^ 2) + I(Mailbox ^ 3)
, data = milk)
summary(lm_3)
Call:
lm(formula = Class.III ~ Mailbox + I(Mailbox^2) + I(Mailbox^3),
data = milk)
Residuals:
Min 1Q Median 3Q Max
-1.07484 -0.21964 0.03525 0.29497 0.80354
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -43.26004 24.85947 -1.740 0.0901 .
Mailbox 11.78466 5.65157 2.085 0.0440 *
I(Mailbox^2) -0.87465 0.42208 -2.072 0.0453 *
I(Mailbox^3) 0.02345 0.01036 2.265 0.0295 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.4715 on 37 degrees of freedom
Multiple R-squared: 0.957, Adjusted R-squared: 0.9535
F-statistic: 274.3 on 3 and 37 DF, p-value: < 2.2e-16
par(mfrow = c(1, 2))
residualPlots(lm_3)
Test stat Pr(>|t|)
Mailbox 1.073 0.291
I(Mailbox^2) 1.970 0.057
I(Mailbox^3) 1.936 0.061
Tukey test 1.903 0.057
bptest(lm_3)
studentized Breusch-Pagan test
data: lm_3
BP = 1.2446, df = 3, p-value = 0.7423
par(mfrow = c(1, 1))
1) Adjusted R Square & R Square have increased
2) Value of Residuals plots look far consistent with the desired
charachterstics
3) Breush Pagan Test also confirms Homoskedasticity
However, none of the co-efficients seem to be strongly significant.
Money made on Put Options not considering for premium cost & Transaction costs for the Put Buyer
put_price_calulator <- function(Strike = 14.2) {
Class3.fut <- seq(0, 22, .01) ; put_payoff <- NULL
for (i in 1 : length(Class3.fut)) {
if (Class3.fut[i] < Strike) {
put_payoff[i] <- abs(Class3.fut[i] - Strike)
} else {
put_payoff[i] <- 0
}
}
par(col.lab = "brown")
par(fg = 'light blue')
plot(Class3.fut, put_payoff, xlab = 'Prices of Futures', font = 4
, col.main = "Dark Blue", ylab = 'Put Payoff', col = 'dark green'
, lwd = 5, lty = 3, type = 'l'
, main = 'Payoff from Put option (Strike = $14.25)')
abline(h = 0, col = "red")
}
#Calling the function
cat("Enter a strke price for computing Put_payoff in the function below : \n")
Enter a strke price for computing Put_payoff in the function below :
put_price_calulator()
Money made on Put Options considering premium cost & Transaction costs
for the put Buyer
put_price_calulator1 <- function(Strike = 14.2, option.price = .5, trade = .1) {
par(mar = c(5, 5, 5, 5))
Class3.fut <- seq(0, 22, .01) ; put_payoff1 <- NULL
for (i in 1 : length(Class3.fut)) {
if (Class3.fut[i] < Strike) {
put_payoff1[i] <- abs(Class3.fut[i] - Strike) - option.price - trade
} else {
put_payoff1[i] <- - option.price - trade
}
}
par(col.lab = "brown")
par(fg = 'light blue')
plot(Class3.fut, put_payoff1, xlab = 'Prices of Futures', font = 4
, col.main = "Dark Blue", ylab = 'Put Payoff', col = 'dark green'
, lwd = 5, lty = 3, type = 'l'
, main = 'Payoff from Put option (Strike = 14.25)')
abline(h = 0, col = "red")
}
#Calling the function
cat("Enter a strke price for computing Put_payoff in the function below : \n")
Enter a strke price for computing Put_payoff in the function below :
put_price_calulator1()