Introduction and Background
For this report, I will be examining two companies: Airbus SE (AIR.PA) and the Boeing Company (BA). I chose these two companies to examine in particular as they have duopoly control over the aircraft manufacturing industry, combining to over 99% of market share of the industry. I am interested in how changes in one may affect the other, if that is possible, as aircrafts have a longer time to production. My aims are to establish the dependence of these two stocks and to gain insight into share price dependence between two competitors within a duopoly.
Airbus SE (AIR.PA) is focused in the industrial sector, in the aerospace & defense industry. Founded originally in France, its headquarters are now in the Netherlands. In 2021, the number of employees was 128,873. In 2021, the reported revenue was 52.15 billion EUR (approx. 50.61 billion USD). Airbus has three divisions: Commercial Aircraft (Airbus S.A.S.), Defense and Space, and Helicopters. As of 2019, Airbus was the largest aircraft manufacturer.The AIR.PA stock’s market cap was 90.44 billion dollars as of the end of September 2021. The AIR.PA stock’s enterprise value was 86.73 billion dollars as of the end of September 2021.
The Boeing Company (BA) is also focused in the industrial sector, in the aerospace & defense industry. The company headquarters is in Arlington, Virginia but it was originally founded in Seattle, Washington. There are 142,000 full-time employees. Boeing has four segments: Commercial Airplanes; Defense, Space & Security; Global Services; and Boeing Capital. Their market cap was 129.21 billion dollars and their enterprise value was 171.43 billion dollars as of the end of September 2021.
Dataset
The dataset I will be using is the financial data of the stocks AIR.PA and BA. I restrict this dataset to the last 10 years.
## [1] "AIR.PA"
## [1] "BA"
# Monthly Prices
AIRmonth <- to.monthly(AIR.PA)
BAmonth <- to.monthly(BA)
# Monthly Prices -> Log Monthly Returns
logAIR <- monthlyReturn(AIRmonth, subset=NULL, type='log',
leading=TRUE)
logBA <- monthlyReturn(BAmonth, subset=NULL, type='log',
leading=TRUE)
logAIR1 <- as.numeric(logAIR)
logBA1 <- as.numeric(logBA)Now that I have set up our analysis, I’ll begin by looking at summary statistics of the chosen companies in the last ten years. The number of observations is n = 130.
## Airbus Monthly Log Return: Summary Statistics
sumAIR <- summary(logAIR)
## Boeing Monthly Log Return: Summary Statistics
sumBA <- summary(logBA)
print(sumAIR[,2]) ##
## "Min. :-0.59977 " "1st Qu.:-0.03912 " "Median : 0.01654 "
##
## "Mean : 0.01140 " "3rd Qu.: 0.06556 " "Max. : 0.33766 "
##
## "Min. :-0.612286 " "1st Qu.:-0.038859 " "Median : 0.014578 "
##
## "Mean : 0.006195 " "3rd Qu.: 0.058082 " "Max. : 0.377965 "
Below are Figures 1 and 2, which display graphs for monthly log returns of Airbus SE and the Boeing Company, respectively. Note the differences in the monthly log returns prior to 2020. After the Covid-19 pandemic in 2020, the two companies’ monthly log returns appear to be more similar than before. It is highly likely that the similarity is due to the negative exogenous shock for the air travel industry.
plot(logAIR, xlab="Date",ylab="Monthly Log Returns",
main="Figure 1. Airbus SE (AIR.PA)",type="l",lty=1)plot(logBA, xlab="Date",ylab="Monthly Log Returns",
main="Figure 2. Boeing Company (BA)",type="l",lty=1)I have also provided histograms (Figures 3 & 4) to show the distributions of the monthly log returns. These will be highly important to creating our models as model assumptions rest upon the distribution. Note that both of the monthly log returns’ distributions are left skewed. These distributions off of first glance appear to best fit a skewed t-distribution.
Marginals
I can formally determine the fit of our models by using the Akaike information criterion (AIC), which is used to compare the fit of different regression models. Theoretically, the best fit is the one which produces the smallest magnitude.
## Akaike information criterion (AIC): Airbus SE
# Normal
Normal_Airbus <- AIC(fitdistr(logAIR, "normal"))
# T
T_Airbus <- AIC(fitdistr(logAIR, "t",start=list(m=mean(x),s=sd(x), df=3),lower=c(-1, 0.001,1)))
# Skewed Normal
SNorm1 <- data.frame(X=rsn(nAIR))
SNormAIR <- selm(X ~ 1, data=SNorm1)
print(SNormAIR)## Object class: selm
## Call: selm(formula = X ~ 1, data = SNorm1)
## Number of observations: 142
## Number of covariates: 1 (includes constant term)
## Number of parameters: 3
## Family: SN
## Estimation method: MLE
## Log-likelihood: -190.7849
# Skewed T
SkTAIR <- st.mple(matrix(1, nAIR, 1), y=logAIR$var1,
dp=c(mean(logAIR$var1), sd(logAIR$var1), 0, 10))
Skewed_T_Airbus <- SkTAIR$logL
# Comparing
list(Normal_Airbus, T_Airbus, SNormAIR@logL, Skewed_T_Airbus) ## [[1]]
## [1] -256.9166
##
## [[2]]
## [1] -288.796
##
## [[3]]
## [1] -190.7849
##
## [[4]]
## [1] 147.5458
## Akaike information criterion (AIC): Boeing
# Normal
Normal_Boeing <- AIC(fitdistr(logBA,"normal"))
# T
T_Boeing <- AIC(fitdistr(logBA,"t",start=list(m=mean(x),s=sd(x), df=3),lower=c(-1, 0.001,1)))
# Skewed Normal
SNorm2 <- data.frame(X=rsn(nBA))
SNormBA <- selm(X ~ 1, data=SNorm2)
print(SNormBA)## Object class: selm
## Call: selm(formula = X ~ 1, data = SNorm2)
## Number of observations: 142
## Number of covariates: 1 (includes constant term)
## Number of parameters: 3
## Family: SN
## Estimation method: MLE
## Log-likelihood: -194.6674
# Skewed T
SkTBA <- st.mple(matrix(1, nBA, 1), y=logBA$var2,
dp=c(mean(logBA$var2), sd(logBA$var2), 0, 10))
Skewed_T_Boeing <- SkTBA$logL
# Comparing
list(Normal_Boeing, T_Boeing, SNormBA@logL, Skewed_T_Boeing) ## [[1]]
## [1] -237.0792
##
## [[2]]
## [1] -274.5734
##
## [[3]]
## [1] -194.6674
##
## [[4]]
## [1] 135.179
So, according to the AIC values, the best fit out of the four distributions is the skewed T distribution for the monthly log returns of both Airbus SE and Boeing.
Copulas
Now I will look at the dependence between these two stocks. In order to do this, I will first fit skewed T distributions to each variable and then transform these variables to a uniform distribution. I create a non-parametric density estimation. Lastly, I produce a Kendall rank correlation coefficient (“tau”) which shows moderate correlation.
# Airbus Var1
n1 = nrow(logAIR)
x1 = logAIR$var1
fit1 = st.mple(matrix(1,n1,1),y=x1,dp=c(mean(x1),sd(x1),0,10))
est1 = fit1$dp
u1 = pst(x1,dp=est1)
# Boeing Var2
n2 = nrow(logBA)
x2 = logBA$var2;
fit2 = st.mple(matrix(1,n2,1),y=x2,dp=c(mean(x2),sd(x2),0,10));
est2 = fit2$dp;
u2 = pst(x2,dp=est2);
# Creating a non-parametric density estimation
U.hat = cbind(u1,u2)
plot(x1,x2, main = "Figure 5. Monthly Log Returns", xlab="Airbus", ylab="Boeing"); fhatU = kde(x=U.hat,H=Hscv(x=U.hat));
# Contour plots
plot(fhatU,cont=seq(10,80,10), main="Figure 7. Contour Plot", xlab="U1 (Airbus)", ylab="U2 (Boeing)"); # Kendall Rank Correlation Test
tau = as.numeric(cor.test(u1,u2,method="kendall")$estimate)
print(tau)## [1] 0.3256581
The moderate, positive correlation is highly relevant as these are firms in competition. Unlike other industries, because of the time to production (and likely other reasons as well), see that their returns do not respond immediately to changes in the other. It is likely that some of the correlation between the two is also directly due to Covid which similarly decreased the share prices as air travel was heavily negatively affected by Covid.
Now I can assess the fit of the copula models. Copulas, or multivariate CDFs whose univariate marginal distributions are all Uniform(0,1), characterize the dependence between these two stocks. I will use the same AIC test as used previously to determine which copula models are the best fit for our analysis.
# Estimator for rho
omega = sin(tau*pi/2);
# T Copula
Ct=fitCopula(copula=tCopula(dim=2),data=U.hat,method="ml",start=c(omega,10));
Ct@estimate;## [1] 0.5275646 18.7763852
## [1] 26.42511
T_Copula <- -2*(loglikCopula(param=Ct@estimate,u=U.hat,
copula=tCopula(dim=2)))+2*length(Ct@estimate);
## Gaussian
Cgauss=fitCopula(copula=normalCopula(dim=2),data=U.hat,method="ml",start=c(omega));
Cgauss@estimate;## [1] 0.5413556
## [1] 26.09457
Gaussian <- -2*(loglikCopula(param=Cgauss@estimate,u=U.hat,
copula=normalCopula(dim=2)))+2*length(Cgauss@estimate);
## Frank
Cfr=fitCopula(copula=frankCopula(1,dim=2),data=U.hat,method="ml");
Cfr@estimate;## [1] 3.373516
## [1] 18.6127
Frank <- -2*(loglikCopula(param=Cfr@estimate,u=U.hat,
copula=frankCopula(dim=2)))+2*length(Cfr@estimate);
## Clayton
CC=fitCopula(copula=claytonCopula(1,dim=2),data=U.hat,method="ml");
CC@estimate;## [1] 0.9658544
## [1] 14.84428
Clayton <- -2*(loglikCopula(param=CC@estimate,u=U.hat,
copula=claytonCopula(dim=2)))+2*length(CC@estimate);
## Gumbel
Cgum=fitCopula(copula=gumbelCopula(dim=2),data=U.hat,method="ml");
Cgum@estimate;## [1] 1.504836
## [1] 24.54833
Gumbel <- -2*(loglikCopula(param=Cgum@estimate,u=U.hat,
copula=gumbelCopula(dim=2)))+2*length(Cgum@estimate);
## Joe
Cjoe=fitCopula(copula=joeCopula(dim=2),data=U.hat,method="ml");
Cjoe@estimate;## [1] 1.635576
## [1] 18.57547
Joe <- -2*(loglikCopula(param=Cjoe@estimate,u=U.hat,
copula=joeCopula(dim=2)))+2*length(Cjoe@estimate);
list(T_Copula, Gaussian, Frank, Clayton, Gumbel, Joe) ## [[1]]
## [1] -48.85021
##
## [[2]]
## [1] -50.18914
##
## [[3]]
## [1] -35.2254
##
## [[4]]
## [1] -27.68856
##
## [[5]]
## [1] -47.09665
##
## [[6]]
## [1] -35.15094
As I can see, the AIC value of the smallest magnitude is the fourth, or that resulting from the Clayton copula. Therefore, the Clayton copula model is the best copula model for this dataset.
Simulated Sample
I generate a random sample with size n from the Clayton copula. Note that n1 is equal to n2, therefore using the n1 sample size will suffice. Now with the simulated sample, I will produce a bivariate random sample. This can be seen in Figure 8. Also, please note that the x and y axes are measuring the simulated probabilities of each variable, not the original monthly log return values.
Simu_U=rCopula(n1, claytonCopula(dim=2,CC@estimate))
plot(Simu_U[,1],Simu_U[,2], main = "Figure 8. Clayton Copula (Random)",
xlab="U1 Airbus", ylab="U2 Boeing")Next I transform the marginals and fit to our skewed T distribution. I lastly apply a simulated sample to the fitted marginals and copula. Below in Figure 9, I can see that in the bivariate Clayton copula, theta appears to be greater than 0. For the Clayton copula, the independence copula occurs when theta is equal to 0. Notice how this varies from the above after the skewed T transformation, which appears to have a correlation closer to 0. I can conclude that there is a positive dependency between the monthly log returns of Airbus and Boeing’s stocks.
Simu_X1=qst(Simu_U[,1],dp=est1)
Simu_X2=qst(Simu_U[,2],dp=est2)
plot(Simu_X1,Simu_X2, main = "Figure 9. Clayton Copula (Skewed-T)",
xlab="U1 Airbus", ylab="U2 Boeing")Conclusion
In conclusion, I examined two competitors that control over 99% market share of the $600 billion commercial aircraft industry as of 2022. I found that their monthly log returns were best fit to a skewed T-distribution and a Clayton copula. The two stocks have a moderate positive correlation or dependence on each other. This is not explainable under the theory of competition, where I’d expect that the gains of one firm would adversely affect the other. I believe this may be slightly influenced by the exogenous negative shock of Covid-19 (which decreased travel) and other exogenous shocks to the commercial aircraft industry as a whole.