###Pairwise Directional Connectedness Approach### (TOURISM ETFs)


library(dplyr)
library(zoo)
library(ConnectednessApproach)
library(tidyr)
library(vars)

#1. Veri Tanımlama
colnames(data) <- tolower(colnames(data))
 
df <- data[, c("date", "jets", "pej", "away", "bedz")]
 
# İsim verelim
colnames(df) <- c("DATE", "JETS", "PEJ", "AWAY", "BEDZ")
df$DATE <- as.Date(df$DATE, format = "%d.%m.%Y")


#2. Yenilenen tarihleri temizle#

df2 <- df %>%
group_by(DATE) %>%
summarise(
jets = mean(JETS, na.rm = TRUE),
pej  = mean(PEJ,  na.rm = TRUE),
away = mean(AWAY, na.rm = TRUE),
bedz = mean(BEDZ, na.rm = TRUE)
) %>%
arrange(DATE)


#3. ZOO Formatı

zdf <- zoo(df2[, c("jets","pej","away","bedz")], order.by = df2$DATE)

# 4. Log getiriler
returns <- diff(log(zdf))
returns <- na.omit(returns)

# 5. Kantil bağlı connectedness
taus <- c(0.05, 0.50, 0.95)
results <- list()
NET_list <- list()

for (tau in taus) {
  #Kantil eşik değerleri
  th <- apply(returns, 2, quantile, probs=tau, na.rm=TRUE)
  
  #Kantil alt örnekleme
  idx <- which(apply(returns < matrix(th, nrow(returns), ncol(returns), TRUE), 1, any))
  
  returns_tau <- returns[idx, ]
  
  # Yeterli gözlem yoksa uyarı ver ve atla
  if (nrow(returns_tau) < 5) {
    cat("Uyarı: tau =", tau, "için yeterli gözlem yok, atlanıyor.\n")
    next
  }
  

  # --- Optimal lag AIC ile seçimi ---
  var_opt <- VARselect(returns_tau, lag.max = 10, type = "const")$selection["AIC(n)"]
  
  # Connectedness
  conn <- ConnectednessApproach(returns_tau, nlag = var_opt, connectedness="Time")
  
  results[[paste0("tau_", tau)]] <- conn
  NET_list[[paste0("tau_", tau)]] <- conn$TO - conn$FROM
}

#6. Sonuçları görüntüle

# ✅ Toplam Connectedness
results$tau_0.05$TCI
results$tau_0.50$TCI
results$tau_0.95$TCI

# ✅ Yönlü spillover
results$tau_0.05$TO
results$tau_0.50$TO
results$tau_0.95$TO

# ✅ Net spillover
results$tau_0.05$NET
results$tau_0.50$NET
results$tau_0.95$NET

library(dplyr)
library(zoo)
library(ConnectednessApproach)
library(vars)

# Veri yükleme (sizin veri setinizle çalışacak şekilde)
# df2: Temizlenmiş ve ortalama alınmış veri (tarih, jets, pej, away, bedz)

# Rolling window boyutu
window_size <- 50

# Kuantiller
taus <- c(0.05, 0.50, 0.95)

# Sonuçlar için liste
NET_rolling <- list()

# Rolling hesaplama
for (tau in taus) {
  cat("Kuantil: ", tau, "\n")
  
  # Kuantil eşik değeri
  th <- apply(returns, 2, quantile, probs=tau, na.rm=TRUE)
  
  # Eşik altındaki veriler
  idx <- which(apply(returns < matrix(th, nrow(returns), ncol(returns), TRUE), 1, any))
  returns_tau <- returns[idx, ]
  
  if(nrow(returns_tau) < window_size) {
    cat("Uyarı: Yeterli gözlem yok. Pencere boyutunu küçültmeyi deneyin.\n")
    next  # Yetersiz veri varsa bu kuantili atla
  }
  
  # Zaman serisi için sonuçlar
  NET_time <- zoo(, order.by = index(returns_tau)[window_size:nrow(returns_tau)])
  
  # Rolling window ile her pencereyi hesapla
  for (i in window_size:nrow(returns_tau)) {
    window_data <- returns_tau[(i-window_size+1):i, ]
    
    # Sabit lag: 2
    var_opt <- 2  # Sabit bir lag değeri
    var_model <- VAR(window_data, p = var_opt)  # VAR modelini manuel kurma
    
    # Connectedness hesaplama
    conn <- ConnectednessApproach(window_data, nlag = var_opt, connectedness="Time")
    
    # Net spillover hesaplama
    NET_time[i-window_size+1] <- conn$TO - conn$FROM
  }
  
  # Sonuçları listeye kaydet
  NET_rolling[[paste0("tau_", tau)]] <- NET_time
}

# Grafik: Tüm kuantiller için net spillover
plot(NET_rolling$tau_0.05, type = "l", col = "red", lwd = 2, 
     main = "Rolling Net Spillover (Farklı Kuantiller)", ylab = "Net Spillover", xlab = "Tarih")
lines(NET_rolling$tau_0.50, col = "green", lwd = 2)
lines(NET_rolling$tau_0.95, col = "blue", lwd = 2)

legend("topright", legend = c("tau = 0.05", "tau = 0.50", "tau = 0.95"), 
       col = c("red", "green", "blue"), lwd = 2)


###Pairwise Directional Connectedness Approach### (CRYPTO ASSETS)


library(dplyr)
library(zoo)
library(ConnectednessApproach)
library(tidyr)
library(vars)

#1. Veri Tanımlama
colnames(data) <- tolower(colnames(data))
 
df <- data[, c("date", "btc", "eth", "sol", "ada", "xrp")]
 
# İsim verelim
colnames(df) <- c("DATE", "BTC", "ETH", "SOL", "ADA", "XRP")
df$DATE <- as.Date(df$DATE, format = "%d.%m.%Y")


#2. Yenilenen tarihleri temizle#

df2 <- df %>%
group_by(DATE) %>%
summarise(
btc = mean(BTC, na.rm = TRUE),
eth  = mean(ETH,  na.rm = TRUE),
sol = mean(SOL, na.rm = TRUE),
ada = mean(ADA, na.rm = TRUE),
xrp = mean(XRP, na.rm = TRUE)
) %>%
arrange(DATE)


#3. ZOO Formatı

zdf <- zoo(df2[, c("btc","eth","sol","ada", "xrp")], order.by = df2$DATE)

# 4. Log getiriler
returns <- diff(log(zdf))
returns <- na.omit(returns)

# 5. Kantil bağlı connectedness
taus <- c(0.05, 0.50, 0.95)
results <- list()
NET_list <- list()

for (tau in taus) {
  #Kantil eşik değerleri
  th <- apply(returns, 2, quantile, probs=tau, na.rm=TRUE)
  
  #Kantil alt örnekleme
  idx <- which(apply(returns < matrix(th, nrow(returns), ncol(returns), TRUE), 1, any))
  
  returns_tau <- returns[idx, ]
  
  # Yeterli gözlem yoksa uyarı ver ve atla
  if (nrow(returns_tau) < 5) {
    cat("Uyarı: tau =", tau, "için yeterli gözlem yok, atlanıyor.\n")
    next
  }
  

  # --- Optimal lag AIC ile seçimi ---
  var_opt <- VARselect(returns_tau, lag.max = 10, type = "const")$selection["AIC(n)"]
  
  # Connectedness
  conn <- ConnectednessApproach(returns_tau, nlag = var_opt, connectedness="Time")
  
  results[[paste0("tau_", tau)]] <- conn
  NET_list[[paste0("tau_", tau)]] <- conn$TO - conn$FROM
}

#6. Sonuçları görüntüle

# ✅ Toplam Connectedness
results$tau_0.05$TCI
results$tau_0.50$TCI
results$tau_0.95$TCI

# ✅ Yönlü spillover
results$tau_0.05$TO
results$tau_0.50$TO
results$tau_0.95$TO

# ✅ Net spillover
results$tau_0.05$NET
results$tau_0.50$NET
results$tau_0.95$NET



### 0.05 Quantile### 

library(zoo)
library(ConnectednessApproach)
library(vars)

# Date conversion
date <- as.Date(data$date, format = "%d.%m.%Y")
class(date)  # Check class of the date

# Prepare data
df <- data[,-1]
zoodata <- zoo(df, order.by = date)

# Function to calculate AIC for different lag lengths
select_lag_AIC <- function(zoodata, max_lag = 10) {
  aic_values <- numeric(max_lag)  # Store AIC values for each lag
  
  for (lag in 1:max_lag) {
    # Fit VAR model with current lag
    var_model <- VAR(zoodata, p = lag)
    
    # Store AIC value for this lag
    aic_values[lag] <- AIC(var_model)
  }
  
  # Select lag with minimum AIC
  optimal_lag <- which.min(aic_values)
  return(optimal_lag)
}

# Select the optimal lag using AIC
optimal_lag <- select_lag_AIC(zoodata, max_lag = 10)
print(paste("Optimal Lag Selected: ", optimal_lag))

# Run the Connectedness Approach using the selected lag
dyc <- ConnectednessApproach(
  zoodata,
  nlag = optimal_lag,
  nfore = 10,
  window.size = 200,
  corrected = FALSE,
  model = "QVAR",
  connectedness = "Time",
  VAR_config = list(QVAR = list(tau = 0.05))
)

###Average NPDC and PCI### (JETS, PEJ, AWAY, BEDZ)

#JETS#

dyc$NPDC[ , 1, ]
row_data <- dyc$NPDC[, 1, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_jets_0.05.xlsx")

dyc$PCI[ , 1, ]
row_data <- dyc$PCI[, 1, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_jets_0.05.xlsx")

#PEJ#

dyc$NPDC[ , 2, ]
row_data <- dyc$NPDC[, 2, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_pej_0.05.xlsx")

dyc$PCI[ , 2, ]
row_data <- dyc$PCI[, 2, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_pej_0.05.xlsx")


#AWAY#

dyc$NPDC[ , 3, ]
row_data <- dyc$NPDC[, 3, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_away_0.05.xlsx")

dyc$PCI[ , 3, ]
row_data <- dyc$PCI[, 3, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_away_0.05.xlsx")


#BEDZ#

dyc$NPDC[ , 4, ]
row_data <- dyc$NPDC[, 4, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_bedz_0.05.xlsx")

dyc$PCI[ , 4, ]
row_data <- dyc$PCI[, 4, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_bedz_0.05.xlsx")



### 0.5 Quantile### 

library(zoo)
library(ConnectednessApproach)
library(vars)

# Date conversion
date <- as.Date(data$date, format = "%d.%m.%Y")
class(date)  # Check class of the date

# Prepare data
df <- data[,-1]
zoodata <- zoo(df, order.by = date)

# Function to calculate AIC for different lag lengths
select_lag_AIC <- function(zoodata, max_lag = 10) {
  aic_values <- numeric(max_lag)  # Store AIC values for each lag
  
  for (lag in 1:max_lag) {
    # Fit VAR model with current lag
    var_model <- VAR(zoodata, p = lag)
    
    # Store AIC value for this lag
    aic_values[lag] <- AIC(var_model)
  }
  
  # Select lag with minimum AIC
  optimal_lag <- which.min(aic_values)
  return(optimal_lag)
}

# Select the optimal lag using AIC
optimal_lag <- select_lag_AIC(zoodata, max_lag = 10)
print(paste("Optimal Lag Selected: ", optimal_lag))

# Run the Connectedness Approach using the selected lag
dyc <- ConnectednessApproach(
  zoodata,
  nlag = optimal_lag,
  nfore = 10,
  window.size = 200,
  corrected = FALSE,
  model = "QVAR",
  connectedness = "Time",
  VAR_config = list(QVAR = list(tau = 0.5))
)


###Average NPDC and PCI### (JETS, PEJ, AWAY, BEDZ)

#JETS#

dyc$NPDC[ , 1, ]
row_data <- dyc$NPDC[, 1, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_jets_0.5.xlsx")

dyc$PCI[ , 1, ]
row_data <- dyc$PCI[, 1, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_jets_0.5.xlsx")

#PEJ#

dyc$NPDC[ , 2, ]
row_data <- dyc$NPDC[, 2, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_pej_0.5.xlsx")

dyc$PCI[ , 2, ]
row_data <- dyc$PCI[, 2, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_pej_0.5.xlsx")


#AWAY#

dyc$NPDC[ , 3, ]
row_data <- dyc$NPDC[, 3, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_away_0.5.xlsx")

dyc$PCI[ , 3, ]
row_data <- dyc$PCI[, 3, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_away_0.5.xlsx")


#BEDZ#

dyc$NPDC[ , 4, ]
row_data <- dyc$NPDC[, 4, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_bedz_0.5.xlsx")

dyc$PCI[ , 4, ]
row_data <- dyc$PCI[, 4, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_bedz_0.5.xlsx")


### 0.95 Quantile### 

library(zoo)
library(ConnectednessApproach)
library(vars)

# Date conversion
date <- as.Date(data$date, format = "%d.%m.%Y")
class(date)  # Check class of the date

# Prepare data
df <- data[,-1]
zoodata <- zoo(df, order.by = date)

# Function to calculate AIC for different lag lengths
select_lag_AIC <- function(zoodata, max_lag = 10) {
  aic_values <- numeric(max_lag)  # Store AIC values for each lag
  
  for (lag in 1:max_lag) {
    # Fit VAR model with current lag
    var_model <- VAR(zoodata, p = lag)
    
    # Store AIC value for this lag
    aic_values[lag] <- AIC(var_model)
  }
  
  # Select lag with minimum AIC
  optimal_lag <- which.min(aic_values)
  return(optimal_lag)
}

# Select the optimal lag using AIC
optimal_lag <- select_lag_AIC(zoodata, max_lag = 10)
print(paste("Optimal Lag Selected: ", optimal_lag))

# Run the Connectedness Approach using the selected lag
dyc <- ConnectednessApproach(
  zoodata,
  nlag = optimal_lag,
  nfore = 10,
  window.size = 200,
  corrected = FALSE,
  model = "QVAR",
  connectedness = "Time",
  VAR_config = list(QVAR = list(tau = 0.95))
)


###Average NPDC and PCI### (JETS, PEJ, AWAY, BEDZ)

#JETS#

dyc$NPDC[ , 1, ]
row_data <- dyc$NPDC[, 1, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_jets_0.95.xlsx")

dyc$PCI[ , 1, ]
row_data <- dyc$PCI[, 1, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_jets_0.95.xlsx")

#PEJ#

dyc$NPDC[ , 2, ]
row_data <- dyc$NPDC[, 2, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_pej_0.95.xlsx")

dyc$PCI[ , 2, ]
row_data <- dyc$PCI[, 2, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_pej_0.95.xlsx")


#AWAY#

dyc$NPDC[ , 3, ]
row_data <- dyc$NPDC[, 3, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_away_0.95.xlsx")

dyc$PCI[ , 3, ]
row_data <- dyc$PCI[, 3, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_away_0.95.xlsx")


#BEDZ#

dyc$NPDC[ , 4, ]
row_data <- dyc$NPDC[, 4, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "npdc_connectedness_bedz_0.95.xlsx")

dyc$PCI[ , 4, ]
row_data <- dyc$PCI[, 4, ]
# Veri çerçevesini satır isimleri olmadan oluştur
df <- data.frame(
  Time = time_labels,
  Value = row_data,
  row.names = NULL   # Satır isimlerini kaldır
)

# openxlsx paketini yükleyin (eğer daha önce yüklemediyseniz)
library(openxlsx)

# Veriyi Excel dosyasına yazdırma
write.xlsx(df, "pci_connectedness_bedz_0.95.xlsx")