Introduction

Problem

A freight forwarder with a fleet of bulk carriers wants to optimize their portfolio in metals markets with entry into the nickel business and use of the tramp trade. Tramp ships are the company’s “swing” option without any fixed charter or other constraint. They allow the company flexibility in managing several aspects of freight uncertainty. The call for tramp transportation is a derived demand based on the value of the cargoes. This value varies widely in the spot markets. The company allocates $250 million to manage receivables. The company wants us to:

  1. Retrieve and begin to analyze data about potential commodities for diversification,
  2. Compare potential commodities with existing commodities in conventional metal spot markets,
  3. Begin to generate economic scenarios based on events that may, or may not, materialize in the commodities.
  4. The company wants to mitigate their risk by diversifying their cargo loads. This risk measures the amount of capital the company needs to maintain its portfolio of services.

Here is some additional detail.

  1. Product: Metals commodities and freight charters
  2. Metal, Company, and Geography:
    1. Nickel: MMC Norilisk, Russia
    2. Copper: Codelco, Chile and MMC Norilisk, Russia
    3. Aluminium: Vale, Brasil and Rio Tinto Alcan, Australia
  3. Customers: Ship Owners, manufacturers, traders
  4. All metals are traded on the London Metal Exchange

Key business questions - answer these at the end

  1. How would the performance of these commodities affect the size and timing of shipping arrangements?
  2. How would the value of new shipping arrangements affect the value of our business with our current customers?
  3. How would we manage the allocation of existing resources given we have just landed in this new market?

Getting to a reponse - these detailed questions are answered in part by the tables, graphs and models developed - add commentary as needed to explain the outputs

  1. What is the decision the freight-forwarder must make? List key business questions and data needed to help answer these questions and support the freight-forwarder’s decision. Retrieve data and build financial market detail into the data story behind the questions.

  2. Develop the stylized facts of the markets the freight-forwarder faces. Include level, returns, size times series plots. Calculate and display in a table the summary statistics, including quantiles, of each of these series. Use autocorrelation, partial autocorrelation, and cross correlation functions to understand some of the persistence of returns including leverage and volatility clustering effects. Use quantile regressions to develop the distribution of sensitivity of each market to spill-over effects from other markets. Interpret these stylized “facts” in terms of the business decision the freight-forwarder makes.

  3. How much capital would the freight-forwarder need? Determine various measures of risk in the tail of each metal’s distribution. Then figure out a loss function to develop the portfolio of risk, and the determination of risk capital the freight-forwarder might need. Confidence intervals might be used to create a risk management plan with varying tail experience thresholds.

CorrelationMX

Column

Correlation Matrix Decsription

The Correlation Matrix shows the relationship between the three metals - nickel - copper - aluminum

Column

Correlation Matrix

##               nickel       copper    aluminium
## nickel     1.0000000 -0.114838413  0.101273327
## copper    -0.1148384  1.000000000 -0.003052345
## aluminium  0.1012733 -0.003052345  1.000000000
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.05
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)    -0.05397     -0.40459  0.14316
## aluminium.vols -0.17118     -0.42537  0.02518
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.1
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)    -0.01786     -0.15781  0.08171
## aluminium.vols -0.15170     -0.28679 -0.02101
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.15
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)    -0.02471     -0.15702  0.12179
## aluminium.vols -0.11890     -0.24820  0.03687
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.2
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)    -0.00813     -0.31566  0.28975
## aluminium.vols -0.12727     -0.31959  0.31056
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.25
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.10032     -0.39221  0.53809
## aluminium.vols -0.16334     -0.39326  0.28243
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.3
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.06726     -0.34820  0.53906
## aluminium.vols -0.04141     -0.46709  0.27199
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.35
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.29078     -0.23797  0.78554
## aluminium.vols -0.15267     -0.41292  0.22856
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.4
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.23620     -0.17074  0.95165
## aluminium.vols -0.05901     -0.59212  0.16453
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.45
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.26592      0.02807  0.93053
## aluminium.vols -0.06001     -0.58330  0.15708
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.5
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.44727      0.03808  0.94220
## aluminium.vols -0.04144     -0.57169  0.22286
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.55
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.52212      0.15217  0.93074
## aluminium.vols -0.07678     -0.50418  0.07893
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.6
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.55363      0.36540  0.79769
## aluminium.vols -0.08639     -0.38895  0.25567
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.65
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.65918      0.23864  0.73891
## aluminium.vols -0.13100     -0.29084  0.24795
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.7
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.66366      0.28976  0.77302
## aluminium.vols -0.10129     -0.18815  0.23285
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.75
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.56879      0.38611  0.78297
## aluminium.vols  0.03309     -0.17204  0.19506
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.8
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.51937      0.42302  0.92597
## aluminium.vols  0.10310     -0.20078  0.18097
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.85
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.54811      0.47784  1.03242
## aluminium.vols  0.11645     -0.28740  0.19514
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.9
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.57486      0.45168  0.96205
## aluminium.vols  0.12111     -0.19360  0.25662
## 
## Call: rq(formula = nickel.corrs ~ aluminium.vols, tau = taus)
## 
## tau: [1] 0.95
## 
## Coefficients:
##                coefficients lower bd upper bd
## (Intercept)     0.72776      0.53769  0.88823
## aluminium.vols  0.05522     -0.06503  0.73609

Sensitivity(RP)

Column

Sensitivity

(Ref: BOOK-Financial_Analytics.pdf p105)

  1. We set taus as the quantiles of interest.
  2. We run the quantile regression using the quantreg package and a call to the rq function.
  3. We can overlay the quantile regression results onto the standard linear model regression.
  4. We can sensitize our analysis with the range of upper and lower bounds on the parameter estimates of the relationship between correlation and volatility. This sensitivity analysis is really a confidence interval based on quantile regressions.

Column

Sensitivity - Nickel Copper

Sensitivity(RP) Nickel Aluminium

Sensitivity(RP) Copper Aluminium

Column

PctChange

Percentage Change

These two charts show the Percentage change in both price and size for the period 2012 thru 2017

Column

Price

Analysing the Trend, Seasonality and Cyclic nature of the data.

* Trend From the graphs above, there is no upward or downward movement. Trend is absent * Seasonlity. To analyse the seasonality, the time-series data is averaged in weekly, monthly and yearly frequencies.

x
0.2582503
x
0.4829495
x
0.4501229
x
0.3931139
x
0.4569281
x
0.3979057
x
0.3923656
x
0.2003287
x
0.2317585
x
0.5628102
x
0.2474569
x
0.3635475
x
0.2640719
x
0.4547605
x
0.3143393
x
0.5087229
x
0.2511239
x
0.443375
x
0.380177
x
0.2874311
x
0.3242338
x
0.2000335
x
0.339614
x
0.13594
x
0.3578557
x
0.1595054
x
0.256872
x
0.1894998
x
0.3257788
x
0.333711
x
0.2588723
x
0.1995675
x
0.4114861
x
0.3089826
x
0.3449255
x
0.5681173
x
0.5134754
x
0.3595605
x
0.4505445
x
0.2591481
x
0.6501497
x
0.3978078
x
0.6393383
x
0.5560341
x
0.3362203
x
0.4468832
x
0.6497333
x
0.3696859
x
0.4334682
x
0.3791317
x
0.3548598
x
0.2828548
x
0.4462522
x
0.1683977
x
0.3278026
x
0.3740425
x
0.1619936
x
0.2593682
x
0.3022514
x
0.4418843
x
0.2367898
x
0.1367894
x
0.3839908

Size

ACF

Auto-correlation function

These two charts show the Auto Correlation in both price and size for the period 2012 thru 2017

Column

Returns

Sizes

PACF

Partial-Autocorrelation function

These two charts show the Partial Auto Correlation for the period 2012 thru 2017

Column

Partial Autocorrelation chart

PACF2

Partial-Autocorrelation function

These two charts show the Partial Auto Correlation for the period 2012 thru 2017. Based on a function that is written to determine this

Column

Partial Autocorrelation chart (#2)

Moments

Moments function

These table show the data moments for the period 2012 thru 2017

Column

Data Moments Table

mean median std_dev IQR skewness kurtosis
copper.size 0.8830 0.6823 0.7849 0.9217 1.7713 7.8654
aluminium.size 0.8072 0.5510 0.8986 1.0136 1.8899 8.4006
nickel.dir 0.0447 1.0000 0.9959 2.0000 -0.0895 1.0150
copper.dir 0.0540 1.0000 0.9931 2.0000 -0.1081 1.0235

The Mean

## [1] 1.282969

Risk Assessments

To compute log-returns, simple returns and basic differences (or the inverse operations) from given data we use the qrmtools ## Monthly Risk Assessments

Nickel Returns

Returns Description

This chart shows the returns for Nickel for the period 2012 thru 2017

Column

Returns chart

Copper Returns

Returns Description

This chart shows the returns for Copper for the period 2012 thru 2017

Column

Returns chart

Aluminium Returns

Returns Description

This chart shows the returns for Aluminium for the period 2012 thru 2017

Column

Returns chart

LossAnalysis

Loss Analysis Description

This chart shows the returns for Loss Analysis for the period 2012 thru 2017

Column

Loss Limits

Loss Analysis using The Monte Carlo method based on a fitted multivariate normal distribution vs. the Variance-Covariance Method

## An 'xts' object on 2012-01-11/2017-03-16 containing:
##   Data: int [1:1298, 1:2] 7660 7652 7470 7514 7503 7641 7689 7946 7965 8020 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:2] "copper" "aluminium"
##   Indexed by objects of class: [Date] TZ: UTC
##   xts Attributes:  
##  NULL
##            copper aluminium
## 2012-01-11   7660      2075
## 2012-01-12   7652      2091
## 2012-01-13   7470      2056
## 2012-01-16   7514      2035
## 2012-01-17   7503      2070
## 2012-01-18   7641      2055
##            copper aluminium
## 2017-03-09   5653      1690
## 2017-03-10   5714      1690
## 2017-03-13   5793      1690
## 2017-03-14   5746      1690
## 2017-03-15   5850      1690
## 2017-03-16   5910      1710
##            copper aluminium
## 2017-03-09   5653      1690
## 2017-03-10   5714      1690
## 2017-03-13   5793      1690
## 2017-03-14   5746      1690
## 2017-03-15   5850      1690
## 2017-03-16   5910      1710
### 3 Compute VaR and ES for the
### standard methods
### ##############################

lambda <- c(1, 10)  # (example) number of shares of the two stocks
alpha <- 0.99  # confidence levels for computing the risk measures
N <- 10000  # Monte Carlo sample size

## Estimate VaR and ES with the
## various methods
set.seed(271)  # set a seed so that all simulation results are reproducible; see ?set.seed
var.cov <- risk_measure(S, lambda = lambda, 
    alpha = alpha, method = "Var.Cov")
hist.sim <- risk_measure(S, lambda = lambda, 
    alpha = alpha, method = "hist.sim")
MC.N <- risk_measure(S, lambda = lambda, 
    alpha = alpha, method = "MC.N", N = N)
POT <- risk_measure(S, lambda = lambda, 
    alpha = alpha, method = "POT", N = N, 
    q = 0.9)
MC.t <- risk_measure(S, lambda = lambda, 
    alpha = alpha, method = "MC.t", N = N)

## Pick out VaR and ES for all methods
(rm <- rbind(`MC (normal)` = unlist(MC.N[c("VaR", 
    "ES")]), `Var.-cov.` = unlist(var.cov[c("VaR", 
    "ES")]), `Hist. sim.` = unlist(hist.sim[c("VaR", 
    "ES")]), POT = unlist(POT[c("VaR", 
    "ES")]), `MC (Student t)` = unlist(MC.t[c("VaR", 
    "ES")])))
##                     VaR       ES
## MC (normal)    505.7637 576.9648
## Var.-cov.      516.2075 590.8569
## Hist. sim.     572.0365 748.7303
## POT            576.1223 736.2985
## MC (Student t) 548.6801 680.5177
## Graphical assessment of the fitted
## GPD Transform the excesses with the
## fitted GPD distribution function.
## The resulting sample should roughly
## follow a standard uniform
## distribution.
excess <- POT$excess  # excesses over the threshold
xi.hat <- POT$xi  # estimated xi
beta.hat <- POT$beta  # estimated beta
z <- pGPD(excess, shape = xi.hat, scale = beta.hat)  # should be U[0,1]
plot(z, ylab = "Fitted GPD applied to the excesses")  # looks fine

Analysis of VaR and ES methods

  • The Monte Carlo method based on a fitted multivariate normal distribution and the variance-covariance method lead to similar results (they both assume multivariate normal distributed risk-factor changes but differ in the computation of the loss distribution (analytical vs empirical)).
  • Both underestimate VaR and ES as estimated by historical simulation.
  • The historical simulation method implies that the loss distribution is more heavy-tailed. This is captured quite well by POT method and (possibly too well by) the Monte Carlo method for multivariate t distributed risk-factor changes (degrees of freedom are MC.t$df ~= 2.4).
  • It’s overall reassuring that several methods (historical simulation, POT method and – with slight departure for ES – MC for a Student t) lead to similar results. Somewhere in this range, one can then determine an adequate amount of risk capital.

Skills and Tools

: Some of the skills and tools used in this analysis are wide ranged. Flexdashboard was used to organize the information and related graphs or charts into a smooth and easy to navigate dashboard. It helps to resize the information and data into storyboard layouts making the data presentable and sequenced. The Shiny package is then layered in to help create a dynamic and interactive visualization of the data. The QRM and qrmdata packages help to introduce a quantitative risk management approach to analyzing the data and data sets in the assignment specifically, commodities like ferrous and non-ferrous metals such as nickel, copper and aluminum. XTS is utilized with the Zoo package to enable uniform observations and handling of time series and irregular time series. The psych package functions are leveraged for a number of analyses such as multivariate, factor, cluster and principle component.

What skills contributed towards data exploration and anaytics?

: Being able to install the necessary packages such as flexdashboard and shiny were necessary to get the analysis going. Adding, manipulating and organizing the code to produce the additional charts and clean format was necessary to have a dashboard that had a sequential feel and flow to it.

: The correlation matrix helps to show the correlation coefficients between the three metals of nickel, copper and aluminum. We can see that the matrix is symmetrical with each metal correlating with itself. We can see in the Metals Market percentage changes for price and size that a lot of the clustering for each metal happens during different time periods.

Business Remarks

:

How would the performance of these commodities affect the size and timing of shipping arrangements?

: The performance of these commodities would have a big impact on the size and timing of the shipping arrangements. Because the ships used are tramp freight liners, they give the company the most flexibility in sourcing the best priced and available metals. The downside is the $250 million that is set aside for receivable as the company would have to ensure they make enough to cover the these monies. The company would have to ensure it is sourcing enough metals at the right price to break even.

How would the value of new shipping arrangements affect the value of our business with our current customers?

How would we manage the allocation of existing resources given we have just landed in this new market?

: We can see that the prices for nickel have the most volatility where the prices for copper are more stable. The price changes for aluminum fall in the middle so I would suggest putting less focus on allocating resources or focus on sourcing nickel and more on copper and aluminum.