Horticultural export competitiveness and risk with agriTradeRisk

library(agriTradeRisk)

Export growth in horticulture can come with rising risk: dependence on a few destinations, sensitivity to exchange rates, weak transmission of world prices to growers and entry barriers in new markets. agriTradeRisk puts these dimensions in one reproducible workflow.

The example data describe Indian exports of mango, grapes, pomegranate and processed products to eight destinations. They are simulated for illustration and are not official trade statistics; replace them with data from sources such as UN Comtrade, DGCI&S or APEDA for empirical work.

head(hort_exports)
#>   year product destination export_value export_quantity world_import
#> 1 2010   mango         UAE       31.370           18237       350.16
#> 2 2011   mango         UAE       26.049           17642       406.54
#> 3 2012   mango         UAE       27.945           16783       430.91
#> 4 2013   mango         UAE       38.016           20924       443.18
#> 5 2014   mango         UAE       39.427           26986       490.90
#> 6 2015   mango         UAE       46.387           29095       484.47

1. Destination concentration

ec <- export_concentration(hort_exports, value = "export_value",
                           partner = "destination",
                           by = c("product", "year"))
subset(ec, year %in% c(2010, 2023),
       c(product, year, hhi, equivalent_partners, top_share,
         leading_partner, leading_share))
#>        product year       hhi equivalent_partners top_share leading_partner
#> 1       grapes 2010 0.3064015            3.263691 0.8027010     Netherlands
#> 14      grapes 2023 0.2699796            3.703983 0.8043329              UK
#> 15       mango 2010 0.3543028            2.822444 0.8098177             UAE
#> 28       mango 2023 0.4645840            2.152463 0.8588060             UAE
#> 29 pomegranate 2010 0.1955417            5.113997 0.6846011             UAE
#> 42 pomegranate 2023 0.1819519            5.495958 0.6471147             UAE
#> 43   processed 2010 0.1790101            5.586276 0.6568046             USA
#> 56   processed 2023 0.1843062            5.425754 0.6735960             USA
#>    leading_share
#> 1      0.4823765
#> 14     0.3615895
#> 15     0.5579369
#> 28     0.6635575
#> 29     0.3090770
#> 42     0.2959197
#> 43     0.2472052
#> 56     0.2470270

An HHI above 0.25 (fewer than four equivalent markets) signals heavy dependence on a small number of destinations.

2. Competitiveness

py <- aggregate(cbind(export_value, world_import) ~ product + year,
                data = hort_exports, FUN = sum)
ci <- competitiveness_index(merge(py, trade_totals, by = "year"),
                            "export_value", "india_total_exports",
                            "world_import", "world_total_exports")
xtabs(round(rca, 2) ~ year + product, data = subset(ci, year >= 2019))
#>       product
#> year   grapes mango pomegranate processed
#>   2019   1.11  5.44        9.45      0.96
#>   2020   1.16  5.02        9.32      0.96
#>   2021   1.13  4.75       10.70      1.14
#>   2022   1.15  5.52       10.35      1.09
#>   2023   0.89  5.32        9.87      1.11

Sources of export growth

d0 <- subset(hort_exports, year == 2015)
d1 <- subset(hort_exports, year == 2023)
m <- merge(d0, d1, by = c("product", "destination"), suffixes = c("0", "1"))
cms <- cms_decomposition(m, "product", "destination", "export_value0",
                         "export_value1", "world_import0", "world_import1")
cms
#> Constant market share decomposition of export change
#> 
#>                 effect  value share_of_change
#>           world_growth 374.92           65.6%
#>  commodity_composition  -4.04           -0.7%
#>    market_distribution -20.98           -3.7%
#>        competitiveness 221.20           38.7%
#>           total_change 571.10          100.0%
#> 
#> Growth of world imports in the data: 51.0%
cms$by_product
#>       product world_growth commodity_composition market_distribution
#> 1      grapes    104.10130              7.958924         -10.7802694
#> 2       mango     42.91001             12.394097           4.9975841
#> 3 pomegranate     59.86718            -17.000112           0.0383154
#> 4   processed    168.04545             -7.393349         -15.2365816
#>   competitiveness total_change
#> 1       -51.25796       50.022
#> 2        71.23231      131.534
#> 3        58.71562      101.621
#> 4       142.50548      287.921

A positive competitiveness effect means India gained market share beyond what world demand growth, product mix and market mix explain.

3. Price transmission

pt <- price_transmission(grape_prices$domestic_price,
                         grape_prices$export_unit_value)
pt
#> Price transmission analysis (144 observations, log prices)
#> 
#> Long-run elasticity:   0.834 (R2 = 0.848)
#> Engle-Granger ADF:     -4.614 (lag 0; 5% critical value -3.336) -> cointegrated at 5%
#> Short-run elasticity:  0.497
#> Adjustment speed:      -0.248 (p = 0.000)
#> Half-life (periods):   2.44
pa <- price_transmission(grape_prices$domestic_price,
                         grape_prices$export_unit_value, asymmetric = TRUE)
pa
#> Price transmission analysis (144 observations, log prices)
#> 
#> Long-run elasticity:   0.834 (R2 = 0.848)
#> Engle-Granger ADF:     -4.614 (lag 0; 5% critical value -3.336) -> cointegrated at 5%
#> Short-run elasticity:  0.496
#> Adjustment speed:      positive -0.299, negative -0.207
#> Half-life (periods):   positive 1.95, negative 2.98
#> Symmetry test:         F = 0.28, p = 0.595

4. Exchange-rate exposure

Shares of export earnings by invoicing currency:

sh <- c(USD = 0.35, EUR = 0.20, GBP = 0.15, AED = 0.15, SAR = 0.05,
        BDT = 0.05, RUB = 0.05)
fx <- exchange_rate_exposure(fx_rates[, names(sh)], sh,
                             export_value = 5000, freq = 12)
fx
#> Exchange-rate exposure of export earnings
#> 
#>  currency share volatility_annual risk_contribution
#>       USD 0.350             0.040             32.3%
#>       EUR 0.200             0.067             23.0%
#>       GBP 0.150             0.071             14.9%
#>       AED 0.150             0.040             13.8%
#>       SAR 0.050             0.040              4.6%
#>       BDT 0.050             0.046              4.6%
#>       RUB 0.050             0.198              6.8%
#> 
#> Portfolio volatility (annual): 0.038
#> Undiversified volatility:      0.058
#> Diversification ratio:         1.528
#> Value at risk (95%, 1 period): parametric 91, historical 86
plot(fx_rates$date, fx$effective_index, type = "l",
     xlab = "", ylab = "Export-weighted rupee index (2014 = 100)")

The diversification ratio shows how much currency risk is reduced by earning in several currencies; risk contributions show which currencies dominate the remaining exposure.

5. Market-entry risk

mk <- data.frame(
  market = c("UAE", "Saudi Arabia", "UK", "Netherlands", "USA",
             "Bangladesh", "Nepal", "Russia"),
  sps_rejections = c(2, 3, 5, 8, 6, 1, 1, 4),
  tariff = c(0, 0, 0, 0, 2, 10, 5, 7),
  transit_days = c(4, 6, 18, 20, 30, 3, 2, 25),
  fx_volatility = c(0.04, 0.04, 0.07, 0.07, 0.04, 0.05, 0.01, 0.19),
  demand_growth = c(0.06, 0.05, 0.03, 0.04, 0.05, 0.08, 0.07, 0.02))
er <- market_entry_risk(mk, "market",
                        c("sps_rejections", "tariff", "transit_days",
                          "fx_volatility"),
                        higher_is_riskier = rep(TRUE, 4),
                        attractiveness = "demand_growth")
er[order(er$priority_rank),
   c("market", "risk_score", "risk_adjusted_attractiveness",
     "priority_rank")]
#>         market risk_score risk_adjusted_attractiveness priority_rank
#> 6   Bangladesh  0.3144841                    0.8427579             1
#> 7        Nepal  0.1250000                    0.7812500             2
#> 1          UAE  0.0952381                    0.6349206             3
#> 2 Saudi Arabia  0.1488095                    0.4627976             4
#> 5          USA  0.5202381                    0.3699405             5
#> 4  Netherlands  0.4940476                    0.2509921             6
#> 3           UK  0.3690476                    0.1359127             7
#> 8       Russia  0.7375000                    0.0000000             8

The indicator values here are hypothetical.

6. Risk-efficient destination mix

Using annual growth of grape export earnings by destination:

g <- subset(hort_exports, product == "grapes")
wide <- reshape(g[, c("year", "destination", "export_value")],
                idvar = "year", timevar = "destination", direction = "wide")
vals <- as.matrix(wide[order(wide$year), -1])
colnames(vals) <- sub("export_value.", "", colnames(vals))
growth <- diff(log(vals))
current <- vals[nrow(vals), ] / sum(vals[nrow(vals), ])
md <- market_diversification(growth, shares = current, max_share = 0.35)
md
#> Mean-variance destination market analysis
#> 
#> Shares
#>        market current minimum_variance best_return_to_risk
#>           UAE   0.097            0.240               0.247
#>  Saudi Arabia   0.048            0.129               0.150
#>            UK   0.362            0.170               0.196
#>   Netherlands   0.346            0.076               0.064
#>           USA   0.013            0.051               0.020
#>    Bangladesh   0.043            0.066               0.045
#>         Nepal   0.017            0.072               0.091
#>        Russia   0.075            0.196               0.187
#> 
#> Portfolio statistics (per period)
#>                     return   risk  ratio    hhi
#> current             0.0480 0.0562 0.8541 0.2700
#> minimum_variance    0.0505 0.0224 2.2509 0.1594
#> best_return_to_risk 0.0522 0.0229 2.2857 0.1717
plot(md)

Comparing the current mix with the efficient frontier shows how far re-orienting exports could reduce earnings risk without lowering expected growth. Upper bounds on shares represent market-size, access or logistics limits.