1. Introduction

The primary objective of this research is to systematically investigate the dynamic lead-lag relationship between global gold prices and ANTM’s market-based brand equity through a robust econometric framework. This study seeks to identify the specific temporal lags at which global commodity movements influence local equity returns while simultaneously evaluating the stability of these correlations across different market regimes, particularly surrounding high-volatility events such as MSCI index rebalancing.

2. Research Methodology

2.1. Data Collection

We utilize daily adjusted closing prices for Gold Futures (GC=F) as the leading indicator and PT Aneka Tambang Tbk (ANTM.JK) as the target variable.

symbols <- c("GC=F", "ANTM.JK")
getSymbols(symbols, src = "yahoo", from = "2024-01-01", to = Sys.Date())
## [1] "GC=F"    "ANTM.JK"
gold_price <- Ad(`GC=F`)
antm_price <- Ad(ANTM.JK)
df_merged <- na.omit(merge(gold_price, antm_price, all = FALSE))
colnames(df_merged) <- c("Gold", "ANTM")
print(df_merged)
##              Gold     ANTM
## 2024-01-02 2064.4 1524.817
## 2024-01-03 2034.2 1494.057
## 2024-01-04 2042.3 1480.874
## 2024-01-05 2042.4 1472.085
## 2024-01-08 2026.6 1450.114
## 2024-01-09 2026.4 1445.720
## 2024-01-10 2021.7 1454.508
## 2024-01-11 2014.3 1436.931
## 2024-01-12 2046.7 1428.142
## 2024-01-16 2026.0 1410.565
##        ...                
## 2026-02-05 4861.4 3810.000
## 2026-02-06 4951.2 3710.000
## 2026-02-09 5050.9 3890.000
## 2026-02-10 5003.8 3890.000
## 2026-02-11 5071.6 3990.000
## 2026-02-12 4923.7 4120.000
## 2026-02-13 5022.0 4050.000
## 2026-02-18 4986.5 4050.000
## 2026-02-19 4975.9 4230.000
## 2026-02-20 5059.3 4220.000

2.2. Stationarity and Transformation

To avoid spurious correlation, we transform the price series into log returns.

# Calculate Log Returns
df_ret <- diff(log(df_merged))[-1]
print(df_ret)
##                     Gold         ANTM
## 2024-01-03 -1.473698e-02 -0.020379094
## 2024-01-04  3.974050e-03 -0.008862692
## 2024-01-05  4.895125e-05 -0.005952402
## 2024-01-08 -7.766099e-03 -0.015037970
## 2024-01-09 -9.866823e-05 -0.003034821
## 2024-01-10 -2.322114e-03  0.006060628
## 2024-01-11 -3.666953e-03 -0.012158297
## 2024-01-12  1.595695e-02 -0.006134907
## 2024-01-16 -1.016531e-02 -0.012384067
## 2024-01-17 -1.161708e-02  0.000000000
##        ...                           
## 2026-02-05 -1.206337e-02 -0.046162042
## 2026-02-06  1.830357e-02 -0.026597313
## 2026-02-09  1.993642e-02  0.047377281
## 2026-02-10 -9.368841e-03  0.000000000
## 2026-02-11  1.345878e-02  0.025382073
## 2026-02-12 -2.959605e-02  0.032061932
## 2026-02-13  1.976794e-02 -0.017136282
## 2026-02-18 -7.094000e-03  0.000000000
## 2026-02-19 -2.128022e-03  0.043485112
## 2026-02-20  1.662186e-02 -0.002366865
# Augmented Dickey-Fuller Test
adf_gold <- adf.test(df_ret$Gold)
adf_antm <- adf.test(df_ret$ANTM)

print(paste("ADF Gold p-value:", round(adf_gold$p.value, 4)))
## [1] "ADF Gold p-value: 0.01"
print(paste("ADF ANTM p-value:", round(adf_antm$p.value, 4)))
## [1] "ADF ANTM p-value: 0.01"

3. Computational Algorithm

3.1. Prewhitening Procedure

We fit an ARIMA model to the Gold returns and apply the filter to both series to extract pure innovations (residuals).

# 1. Fit ARIMA to Gold (Leading Variable)
fit_gold <- auto.arima(df_ret$Gold)
print(fit_gold)
## Series: df_ret$Gold 
## ARIMA(0,0,2) with non-zero mean 
## 
## Coefficients:
##           ma1      ma2    mean
##       -0.0753  -0.1356  0.0018
## s.e.   0.0449   0.0449  0.0005
## 
## sigma^2 = 0.0001763:  log likelihood = 1426.74
## AIC=-2845.48   AICc=-2845.4   BIC=-2828.7
# 2. Extract Residuals
res_gold <- residuals(fit_gold)
res_antm <- residuals(Arima(df_ret$ANTM, model = fit_gold))

3.2. Cross-Correlation Mapping

Now we compute the CCF on the prewhitened residuals to identify the true lead-lag signals.

# Compute CCF
ccf_obj <- ccf(as.numeric(res_gold), as.numeric(res_antm), 
               lag.max = 20, plot = FALSE)

# Visualize CCF
plot(ccf_obj, main = "CCF: Prewhitened Gold vs ANTM", 
     ylab = "Cross-Correlation Coefficient", 
     xlab = "Lag (Days)", col = "darkblue", lwd = 2)
abline(v = 0, col = "red", lty = 2)

4. Sub-Sample Analysis (Market Shocks)

As discussed, we analyze the structural break (e.g., MSCI Shock / MSCI Warning ). We split the data to pre event and post event.

crash_date <- as.Date("2026-01-28")

# Splitting the data
df_pre  <- df_ret[index(df_ret) < crash_date]
df_post <- df_ret[index(df_ret) >= crash_date]

# Plotting CCF for both periods
par(mfrow = c(1, 2))

# Period 1: Stability (Pre-Ultimatum)
ccf(as.numeric(df_pre$Gold), as.numeric(df_pre$ANTM), 
    lag.max = 15, main = "Pre-MSCI (Stability)", 
    col = "darkgreen", lwd = 2)

# Period 2: Panic & Recovery (Post-Ultimatum)
ccf(as.numeric(df_post$Gold), as.numeric(df_post$ANTM), 
    lag.max = 15, main = "Post-MSCI (Market Shock)", 
    col = "darkred", lwd = 2)