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.47ec <- 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.2470270An HHI above 0.25 (fewer than four equivalent markets) signals heavy dependence on a small number of destinations.
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.11d0 <- 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.921A positive competitiveness effect means India gained market share beyond what world demand growth, product mix and market mix explain.
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.595Shares 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.
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 8The indicator values here are hypothetical.
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.