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.

getSymbols("AIR.PA", src="yahoo", from="2012-01-01") # Data for Airbus for the last 10 yrs
## [1] "AIR.PA"
getSymbols("BA", src="yahoo", from="2012-01-01")  # Data for Boeing for the last 10 yrs
## [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  "
  print(sumBA[,2])
##                                                                   
## "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.

hist(logAIR$var1, main="Figure 3. Histogram of Airbus SE", xlab="Monthly log return value") 

hist(logBA$var2, main="Figure 4. Histogram of Boeing", xlab="Monthly log return value")

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
## For Airbus SE's monthly log returns, the skewed T distribution has the best fit.      
## 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
## For Boeing's monthly log returns, the skewed T distribution has the best fit.     

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");

      plot(u1,u2, main = "Figure 6. Probability (Skewed T)", xlab="U1 (Airbus)", ylab="U2 (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
        loglikCopula(param=Ct@estimate,u=U.hat,copula=tCopula(dim=2));
## [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
        loglikCopula(param=Cgauss@estimate,u=U.hat,copula=normalCopula(dim=2));
## [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
        loglikCopula(param=Cfr@estimate,u=U.hat,copula=frankCopula(dim=2));
## [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
        loglikCopula(param=CC@estimate,u=U.hat,copula=claytonCopula(dim=2));
## [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
        loglikCopula(param=Cgum@estimate,u=U.hat,copula=gumbelCopula(dim=2));
## [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
        loglikCopula(param=Cjoe@estimate,u=U.hat,copula=joeCopula(dim=2));
## [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")

      Simu_X=cbind(Simu_X1,Simu_X2)

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.

Sources

https://finance.yahoo.com/quote/BA?p=BA&.tsrc=fin-srch

https://finance.yahoo.com/quote/AIR.PA?p=AIR.PA&.tsrc=fin-srch

https://www.businesswire.com/news/home/20220427005797/en/Global-Aircraft-Manufacturing-Market-2022-to-2030---Share-Size-Trends-and-Industry-Analysis-Report---ResearchAndMarkets.com

https://en.wikipedia.org/wiki/Airbus