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:
Here is some additional detail.
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.
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.
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.
The Correlation Matrix shows the relationship between the three metals - nickel - copper - aluminum
## 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
(Ref: BOOK-Financial_Analytics.pdf p105)
These two charts show the Percentage change in both price and size for the period 2012 thru 2017
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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
These two charts show the Auto Correlation in both price and size for the period 2012 thru 2017
These two charts show the Partial Auto Correlation for the period 2012 thru 2017
These two charts show the Partial Auto Correlation for the period 2012 thru 2017. Based on a function that is written to determine this
These table show the data moments for the period 2012 thru 2017
| 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 |
## [1] 1.282969
To compute log-returns, simple returns and basic differences (or the inverse operations) from given data we use the qrmtools ## Monthly Risk Assessments
This chart shows the returns for Nickel for the period 2012 thru 2017
This chart shows the returns for Copper for the period 2012 thru 2017
This chart shows the returns for Aluminium for the period 2012 thru 2017
This chart shows the returns for Loss Analysis for the period 2012 thru 2017
## 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
: 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.
:
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.