# Import / Load the necessary librarys
library(openxlsx)
library(readxl)
# Reading the Data from the Sheet (Excel)
fx_data <- read.xlsx("Foreign_Exchange_Rates.xlsx", sheet = "Rates")
# Replacement of all "ND" values
# Using the values from the previous rows to do so
for (col_index in 1:ncol(fx_data)) {
for (row_index in 1:nrow(fx_data)) {
if (fx_data[row_index, col_index] == "ND") {
fx_data[row_index, col_index] <- fx_data[row_index - 1, col_index]
}
}
}
# Saving the cleaned data under another Excel file
write.xlsx(fx_data, "Cleaned_Foreign_Exchange_Rates.xlsx", sheetName = "Rates")
# Assigning each currency's rates to individual variables (Named after their currency codes (EUR,GBP,AUD,SGD,JPY))
EUR <- c(fx_data$`EURO.AREA.-.EURO/US$`)
GBP <- c(fx_data$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`)
AUD <- c(fx_data$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`)
SGD <- c(fx_data$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`)
JPY <- c(fx_data$`JAPAN.-.YEN/US$`)
#All exchange rates: Each plotted in a separate table
par(mfrow = c(2, 3))
plot(EUR , type = "l",col = "gold", xlab = "columns", ylab = "Exchange Rate to USD", main = "Euro")
plot(GBP , type = "l",col = "green", xlab = "columns", ylab = "Exchange to USD", main = "Great Britain Pound")
plot(AUD , type = "l", col = "darkblue", xlab = "columns", ylab = "Exchange Rate to USD", main = "Australian Dollar")
plot(SGD , type = "l", col = "red", xlab = "columns", ylab = "Exchange Rate to USD", main = "Singapore Dollar")
plot(JPY , type = "l", col = "purple", xlab = "columns", ylab = "Exchange Rate to USD", main = "Japanese Yen")
par(mfrow = c(1, 1))

# All exchange rates in a single table: Leaving out JPY (Due to Visibility)
plot(EUR , type = "l",col = "gold", xlab = "Columns", ylab = "Exchange Rates to USD", ylim = c(0.3, 2.2), main = "Exchange Rates over time")
lines(GBP , type = "l",col = "green")
lines(AUD , type = "l",col = "darkblue")
lines(SGD , type = "l",col = "red")

# Load required packages or install (if necessary)
if (!require("corrplot")) {install.packages("corrplot"); library("corrplot")}
## Loading required package: corrplot
## corrplot 0.92 loaded
#Converting exchange rate data to numeric format(Enabling mathematical operations and analysis)
EUR <- as.numeric(EUR)
GBP <- as.numeric(GBP)
AUD <- as.numeric(AUD)
SGD <- as.numeric(SGD)
JPY <- as.numeric(JPY)
#Calculating the discrete returns for each currency: Taking the difference between consecutive exchange rate values and dividing by the previous value
#Effectively computing the percentage change from one period to the next.
# R[t]=P[t]/P[t-1]-1
Return_EUR <- diff(EUR) / EUR[-length(EUR)]
Return_GBP <- diff(GBP) / GBP[-length(GBP)]
Return_AUD <- diff(AUD) / AUD[-length(AUD)]
Return_SGD <- diff(SGD) / SGD[-length(SGD)]
Return_JPY <- diff(JPY) / JPY[-length(JPY)]
# Assuming all return vectors have the same length
returns <- cbind(Return_EUR, Return_GBP, Return_AUD, Return_SGD, Return_JPY)
colnames(returns) <- c("EUR", "GBP", "AUD", "SGD", "JPY")
# Calculate correlation matrix
cor_matrix <- cor(returns, use = "complete.obs")
# Plot correlation matrix
corrplot(cor_matrix, method = "color")

# Creating the Return Histograms
par(mfrow = c(2, 2))
hist(Return_EUR, breaks = 30, col = "gold", xlab = "Return", ylab = "Frequency", main = "Histogram: EUR Returns")
hist(Return_GBP, breaks = 30, col = "green", xlab = "Return", ylab = "Frequency", main = "Histogram: GBP Returns")
hist(Return_AUD, breaks = 30, col = "darkblue", xlab = "Return", ylab = "Frequency", main = "Histogram: AUD Returns")
hist(Return_SGD, breaks = 30, col = "red", xlab = "Return", ylab = "Frequency", main = "Histogram: SGD Returns")

hist(Return_JPY, breaks = 30, col = "purple", xlab = "Return", ylab = "Frequency", main = "Histogram: JPY Returns")

# Plotting all Daily Returns in single tables
par(mfrow = c(2, 3))
plot(Return_EUR,type = "l",col = "gold", xlab = "time", ylab = "Daily Returns", ylim = c(-0.05, 0.05), main = "Euro Return")
plot(Return_GBP , type = "l",col = "green", xlab = "time", ylab = "Daily Returns", ylim = c(-0.05, 0.05), main = "Great Britain Pound Return")
plot(Return_AUD , type = "l", col = "darkblue", xlab = "time", ylab = "Daily Returns", ylim = c(-0.05, 0.05), main = "Australian Dollar Return")
plot(Return_SGD , type = "l", col = "red", xlab = "time", ylab = "Daily Returns", ylim = c(-0.05, 0.05), main = "Singapore Dollar Return")
plot(Return_JPY , type = "l", col = "purple", xlab = "time", ylab = "Daily Returns", ylim = c(-0.05, 0.05), main = "Japanese Yen Return")
par(mfrow = c(1, 1))

# Loading the required "moments" package (if necessary)
if (!require("moments")) {install.packages("moments"); library("moments")}
## Loading required package: moments
# List of all the currencies
currencies <- c("EUR", "GBP", "AUD", "SGD", "JPY")
# Function: Calculating the measures for each currency
calculate_measures <- function(currency) {
returns <- get(paste0("Return_", currency))
# Calculation: Return p.a. (250 trading days per year)
mean_return_pa <- mean(returns) * 250
# Calculation: Historical volatility
sd_pa <- sd(returns) * sqrt(250)
# Calculation: Skewness
skew <- skewness(returns)
# Kurtosis
kurt <- kurtosis(returns)
# Sharpe ratio with a 3.4% risk-free rate
sharpe_ratio <- (mean_return_pa - 0.034) / sd_pa
# Calculation: Value-at-Risk (1 year, 3 Months, 10 Days // 95% Confidence)
var_1year <- mean_return_pa + qnorm(0.05) * sd_pa
var_3months <- mean_return_pa + qnorm(0.05) * sd_pa * sqrt(60)
var_10days <- mean_return_pa + qnorm(0.05) * sd_pa * sqrt(10)
return(c(mean_return_pa, sd_pa, skew, kurt, sharpe_ratio, var_1year, var_3months, var_10days))
}
# Calculating the relevant measures for every currency
results <- t(sapply(currencies, calculate_measures))
# Reviewing the dimensions of the results matrix to ensure there were no calculation mistakes
print(dim(results))
## [1] 5 8
#Generating a data frame for the results
results_df <- data.frame(
Mean_Return_pa = results[,1],
Volatility_pa = results[,2],
Skewness = results[,3],
Kurtosis = results[,4],
Sharpe_Ratio = results[,5],
VaR_1year = results[,6],
VaR_3months = results[,7],
VaR_10days = results[,8]
)
# Display the results
print(results_df)
## Mean_Return_pa Volatility_pa Skewness Kurtosis Sharpe_Ratio VaR_1year
## EUR -0.0003710667 0.09420434 -0.04721343 5.562962 -0.3648565 -0.15532342
## GBP 0.0140379613 0.09251702 0.85736170 16.114097 -0.2157661 -0.13813900
## AUD 0.0045870609 0.12414954 0.80673282 16.560690 -0.2369154 -0.19962077
## SGD -0.0087018845 0.05081241 0.03338141 8.431664 -0.8403830 -0.09228086
## JPY 0.0078775149 0.09690920 -0.26413005 7.353733 -0.2695563 -0.15152394
## VaR_3months VaR_10days
## EUR -1.2006268 -0.4903734
## GBP -1.1647197 -0.4671878
## AUD -1.5772000 -0.6411748
## SGD -0.6561019 -0.2730018
## JPY -1.2268408 -0.4961941
# Load required packages or install (if necessery)
if(!require(TTR)) {install.packages("TTR");library(TTR)}
## Loading required package: TTR
if(!require(zoo)) {install.packages("zoo");library(zoo)}
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
if(!require(tibble)) {install.packages("tibble");library(tibble)}
## Loading required package: tibble
# Convert columns to numeric format
fx_data$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$` <- as.numeric(as.character(fx_data$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`))
fx_data$`EURO.AREA.-.EURO/US$` <- as.numeric(as.character(fx_data$`EURO.AREA.-.EURO/US$`))
fx_data$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$` <- as.numeric(as.character(fx_data$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`))
fx_data$`SINGAPORE.-.SINGAPORE.DOLLAR/US$` <- as.numeric(as.character(fx_data$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`))
fx_data$`JAPAN.-.YEN/US$` <- as.numeric(as.character(fx_data$`JAPAN.-.YEN/US$`))
# Calculate the Simple Moving Average (SMA) for each currency pair
SMA_AustralianDollar_US<-SMA(fx_data$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`, n=200)
SMA_EURO_US<-SMA(fx_data$`EURO.AREA.-.EURO/US$`, n=200)
SMA_POUND_US<-SMA(fx_data$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`, n=200)
SMA_SingDollar_US<-SMA(fx_data$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`, n=200)
SMA_YEN_US<-SMA(fx_data$`JAPAN.-.YEN/US$`, n=200)
# Eliminate NA´s in SMA (first 200 rows)
SMA_AustralianDollar_US<-SMA_AustralianDollar_US[-c(1:200)]
SMA_EURO_US<-SMA_EURO_US[-c(1:200)]
SMA_POUND_US<-SMA_POUND_US[-c(1:200)]
SMA_SingDollar_US<-SMA_SingDollar_US[-c(1:200)]
SMA_YEN_US<-SMA_YEN_US[-c(1:200)]
# For same length eliminate first 200 rows in fx_data
fx_data_shortened <- fx_data[201:nrow(fx_data), ]
# Implement the Long-Position based on the SMA
Long_Position_AustralianDollar_US<-ifelse(fx_data_shortened$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`>SMA_AustralianDollar_US,1,0)
Long_Position_EURO_US<-ifelse(fx_data_shortened$`EURO.AREA.-.EURO/US$`>SMA_EURO_US,1,0)
Long_Position_POUND_US<-ifelse(fx_data_shortened$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`>SMA_POUND_US,1,0)
Long_Position_SingDollar_US<-ifelse(fx_data_shortened$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`>SMA_SingDollar_US,1,0)
Long_Position_YEN_US<-ifelse(fx_data_shortened$`JAPAN.-.YEN/US$`>SMA_YEN_US,1,0)
# Implement the Short-Position based on the SMA
Short_Position_AustralianDollar_US<-ifelse(fx_data_shortened$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`<= SMA_AustralianDollar_US,1,0)
Short_Position_EURO_US<-ifelse(fx_data_shortened$`EURO.AREA.-.EURO/US$`<=SMA_EURO_US,1,0)
Short_Position_POUND_US<-ifelse(fx_data_shortened$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`<=SMA_POUND_US,1,0)
Short_Position_SingDollar_US<-ifelse(fx_data_shortened$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`<=SMA_SingDollar_US,1,0)
Short_Position_YEN_US<-ifelse(fx_data_shortened$`JAPAN.-.YEN/US$`<=SMA_YEN_US,1,0)
# Calculate MACD for the currency rates
macd_signal_AustralienDollar_US<-MACD(x=fx_data$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`, nFast = 12, nSlow = 26, nSig = 9)
macd_signal_EURO_US<-MACD(x=fx_data$`EURO.AREA.-.EURO/US$`, nFast = 12, nSlow = 26, nSig = 9)
macd_signal_POUND_US<-MACD(x=fx_data$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`, nFast = 12, nSlow = 26, nSig = 9)
macd_signal_SingDollar_US<-MACD(x=fx_data$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`, nFast = 12, nSlow = 26, nSig = 9)
macd_signal_YEN_US<-MACD(x=fx_data$`JAPAN.-.YEN/US$`, nFast = 12, nSlow = 26, nSig = 9)
# Set NA values to mean values
mean_value<-mean(na.omit(macd_signal_AustralienDollar_US))
macd_signal_AustralienDollar_US[is.na(macd_signal_AustralienDollar_US)]<- mean_value
mean_value<-mean(na.omit(macd_signal_EURO_US))
macd_signal_EURO_US[is.na(macd_signal_EURO_US)]<- mean_value
mean_value<-mean(na.omit(macd_signal_POUND_US))
macd_signal_POUND_US[is.na(macd_signal_POUND_US)]<- mean_value
mean_value<-mean(na.omit(macd_signal_SingDollar_US))
macd_signal_SingDollar_US[is.na(macd_signal_SingDollar_US)]<- mean_value
mean_value<-mean(na.omit(macd_signal_YEN_US))
macd_signal_YEN_US[is.na(macd_signal_YEN_US)]<- mean_value
# Separate investment strategy based on MACD signal
MACD_Line_AustralianDollar_US<-macd_signal_AustralienDollar_US[, "macd"]
Signal_Line_AustralianDollar_US<-macd_signal_AustralienDollar_US[, "signal"]
MACD_Line_EURO_US<-macd_signal_EURO_US[, "macd"]
Signal_Line_EURO_US<-macd_signal_EURO_US[, "signal"]
MACD_Line_POUND_US<-macd_signal_POUND_US[, "macd"]
Signal_Line_POUND_US<-macd_signal_POUND_US[, "signal"]
MACD_Line_SingDollar<-macd_signal_SingDollar_US[, "macd"]
Signal_Line_SingDollar_US<-macd_signal_SingDollar_US[, "signal"]
MACD_Line_YEN_US<-macd_signal_YEN_US[, "macd"]
Signal_Line_YEN_US<-macd_signal_YEN_US[, "signal"]
# Generate Buy/Sell signals based on MACD crossovers
Buy_Signal_AustralianDollar_US<-ifelse(MACD_Line_AustralianDollar_US>Signal_Line_AustralianDollar_US,1,0)
Sell_Signal_Australian_US<-ifelse(MACD_Line_AustralianDollar_US < Signal_Line_AustralianDollar_US,1,0)
Buy_Signal_EURO_US<-ifelse(MACD_Line_EURO_US>Signal_Line_EURO_US,1,0)
Sell_Signal_EURO_US<-ifelse(MACD_Line_EURO_US<Signal_Line_EURO_US,1,0)
Buy_Signal_POUND_US<-ifelse(MACD_Line_POUND_US>Signal_Line_POUND_US,1,0)
Sell_Signal_POUND_US<-ifelse(MACD_Line_POUND_US<Signal_Line_POUND_US,1,0)
Buy_Signal_SingDollar_US<-ifelse(MACD_Line_SingDollar>Signal_Line_SingDollar_US,1,0)
Sell_Signal_SingDollar_US<-ifelse(MACD_Line_SingDollar<Signal_Line_SingDollar_US,1,0)
Buy_Signal_YEN_US<-ifelse(MACD_Line_YEN_US>Signal_Line_YEN_US,1,0)
Sell_Signal_YEN_US<-ifelse(MACD_Line_YEN_US<Signal_Line_YEN_US,1,0)
# Calculate the measures for SMA strategy
# Calculate daily returns of each currency
Daily_Return_AustralianDollar_4 <- c(NA, diff(log(fx_data_shortened$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`)))
Daily_Return_EURO_4 <- c(NA, diff(log(fx_data_shortened$`EURO.AREA.-.EURO/US$`)))
Daily_Return_POUND_4 <- c(NA, diff(log(fx_data_shortened$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`)))
Daily_Return_SingDollar_4 <- c(NA, diff(log(fx_data_shortened$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`)))
Daily_Return_YEN_4 <- c(NA, diff(log(fx_data_shortened$`JAPAN.-.YEN/US$`)))
# Calculate daily exchange rate returns based on Long and Short positions SMA
Return_AustralianDollar_SMA <- ifelse(Long_Position_AustralianDollar_US == 1, Daily_Return_AustralianDollar_4, ifelse(Short_Position_AustralianDollar_US == 1, -Daily_Return_AustralianDollar_4, 0))
Return_EURO_SMA <- ifelse(Long_Position_EURO_US == 1, Daily_Return_EURO_4, ifelse(Short_Position_EURO_US == 1, -Daily_Return_EURO_4, 0))
Return_POUND_SMA <- ifelse(Long_Position_POUND_US == 1, Daily_Return_POUND_4, ifelse(Short_Position_POUND_US == 1, -Daily_Return_POUND_4, 0))
Return_SingDollar_SMA <- ifelse(Long_Position_SingDollar_US == 1, Daily_Return_SingDollar_4, ifelse(Short_Position_SingDollar_US == 1, -Daily_Return_SingDollar_4, 0))
Return_YEN_SMA <- ifelse(Long_Position_YEN_US == 1, Daily_Return_YEN_4, ifelse(Short_Position_YEN_US == 1, -Daily_Return_YEN_4, 0))
# Replacement for NA values
Return_AustralianDollar_SMA <- na.locf(Return_AustralianDollar_SMA)
Return_EURO_SMA <- na.locf(Return_EURO_SMA)
Return_POUND_SMA <- na.locf(Return_POUND_SMA)
Return_SingDollar_SMA<-na.locf(Return_SingDollar_SMA)
Return_YEN_SMA <- na.locf(Return_YEN_SMA)
# Combining the return vectors for different currencies into a single matrix "SMA_returns" using "cbind()", and then assigns column names to this matrix corresponding to each currency.
SMA_returns <- cbind(Return_AustralianDollar_SMA, Return_EURO_SMA,Return_POUND_SMA,Return_SingDollar_SMA,Return_YEN_SMA)
SMA_returns <- cbind(Return_AustralianDollar_SMA, Return_EURO_SMA,Return_POUND_SMA,Return_SingDollar_SMA,Return_YEN_SMA)
# List of all the currencies
currencies <- c("EURO_SMA", "POUND_SMA", "AustralianDollar_SMA","SingDollar_SMA", "YEN_SMA")
# Function: Calculating the measures for each currencies SMA-Return
calculate_measures <- function(currency) {
SMA_returns <- get(paste0("Return_", currency))
# Calculation: Return p.a. (250 trading days per year)
SMA_mean_return_pa <- mean(SMA_returns) * 250
# Calculation: Historical volatility
SMA_sd_pa <- sd(SMA_returns) * sqrt(250)
# Calculation: Skewness
SMA_skew <- skewness(SMA_returns)
# Kurtosis
SMA_kurt <- kurtosis(SMA_returns)
# Sharpe ratio with 3.4% risk-free rate
SMA_sharpe_ratio <- (SMA_mean_return_pa - 0.034) / SMA_sd_pa
# Calculation: Value-at-Risk (1 year, 3 Months, 10 Days // 95% Confidence)
SMA_var_1year <- SMA_mean_return_pa + qnorm(0.05) * SMA_sd_pa
SMA_var_3months <- SMA_mean_return_pa + qnorm(0.05) * SMA_sd_pa * sqrt(60)
SMA_var_10days <- SMA_mean_return_pa + qnorm(0.05) * SMA_sd_pa * sqrt(10)
SMA_returns <- c(SMA_mean_return_pa, SMA_sd_pa, SMA_skew, SMA_kurt, SMA_sharpe_ratio,
SMA_var_1year, SMA_var_3months, SMA_var_10days)
}
# Calculating the relevant measures for every currency
SMA_results<-t(simplify2array(lapply(currencies,calculate_measures)))
# Reviewing the dimensions of the results matrix to ensure there were no calculation mistakes
print(dim(SMA_results))
## [1] 5 8
#Generating a data frame for the results
SMA_results_df<- data.frame(
SMA_mean_return_pa=SMA_results[,1],
SMA_Volatility = SMA_results[,2],
SMA_skewness = SMA_results[,3],
SMA_kurtosis = SMA_results[,4],
SMA_sharpe_ratio= SMA_results[,5],
SMA_var_1year=SMA_results[,6],
SMA_var_3months= SMA_results[,7],
SMA_var_10days=SMA_results[,8]
)
# Display the Results
print(SMA_results_df)
## SMA_mean_return_pa SMA_Volatility SMA_skewness SMA_kurtosis SMA_sharpe_ratio
## 1 0.13073769 0.09301986 -0.1948710 5.811834 1.0399682
## 2 0.11618252 0.09242477 0.6974604 15.022849 0.8891828
## 3 0.15481942 0.12372043 0.3226664 16.125627 0.9765519
## 4 0.06846254 0.05117993 0.1718891 8.372795 0.6733604
## 5 0.13703277 0.09627589 0.3082140 7.580660 1.0701825
## SMA_var_1year SMA_var_3months SMA_var_10days
## 1 -0.02226636 -1.054427 -0.3531036
## 2 -0.03584271 -1.061400 -0.3645635
## 3 -0.04868257 -1.421500 -0.4887104
## 4 -0.01572096 -0.583620 -0.1977491
## 5 -0.02132698 -1.089617 -0.3637447
# Calculation of measures based on MACD-strategy
# Daily returns of each currency
Daily_Return_AustralianDollar <- c(NA, diff(log(fx_data$`AUSTRALIA.-.AUSTRALIAN.DOLLAR/US$`)))
Daily_Return_EURO <- c(NA, diff(log(fx_data$`EURO.AREA.-.EURO/US$`)))
Daily_Return_POUND <- c(NA, diff(log(fx_data$`UNITED.KINGDOM.-.UNITED.KINGDOM.POUND/US$`)))
Daily_Return_SingDollar <- c(NA, diff(log(fx_data$`SINGAPORE.-.SINGAPORE.DOLLAR/US$`)))
Daily_Return_YEN <- c(NA, diff(log(fx_data$`JAPAN.-.YEN/US$`)))
# Daily returns based on BUY- and SELL-Signals
Return_AustralianDollar_MACD <- ifelse(Buy_Signal_AustralianDollar_US == 1, Daily_Return_AustralianDollar, ifelse(Sell_Signal_Australian_US == 1, -Daily_Return_AustralianDollar, 0))
Return_EURO_MACD <- ifelse(Buy_Signal_EURO_US == 1, Daily_Return_EURO, ifelse(Sell_Signal_EURO_US == 1, -Daily_Return_EURO, 0))
Return_POUND_MACD <- ifelse(Buy_Signal_POUND_US == 1, Daily_Return_POUND, ifelse(Sell_Signal_POUND_US == 1, -Daily_Return_POUND, 0))
Return_SingDollar_MACD <- ifelse(Buy_Signal_SingDollar_US == 1, Daily_Return_SingDollar, ifelse(Sell_Signal_SingDollar_US == 1, -Daily_Return_SingDollar, 0))
Return_YEN_MACD <- ifelse(Buy_Signal_YEN_US == 1, Daily_Return_YEN, ifelse(Sell_Signal_YEN_US == 1, -Daily_Return_YEN, 0))
# Combining the return vectors for different currencies into a single matrix "MACD_returns" using "cbind()", and then assigns column names to this matrix corresponding to each currency.
MACD_returns<-cbind(Return_AustralianDollar_MACD,Return_EURO_MACD,Return_POUND_MACD,Return_SingDollar_MACD,Return_YEN_MACD)
# Eliminate NAs
MACD_returns <- na.locf(MACD_returns)
# List of all the currencies
currencies <- c("EURO_MACD","POUND_MACD", "AustralianDollar_MACD", "SingDollar_MACD", "YEN_MACD")
# Function: Calculating the measures for each currency's MACD-Return
calculate_measures <- function(currency) {
MACD_returns <- get(paste0("Return_", currency))
# Calculation: Return p.a. (250 trading days per year)
MACD_mean_return_pa <- mean(MACD_returns, na.rm = TRUE) * 250
# Calculation: Historical volatility
MACD_sd_pa <- sd(MACD_returns, na.rm = TRUE) * sqrt(250)
# Calculation: Skewness
MACD_skew <- moments::skewness(MACD_returns, na.rm = TRUE)
# Kurtosis
MACD_kurt <- moments::kurtosis(MACD_returns, na.rm = TRUE)
# Sharpe ratio with 3.4% risk-free rate
MACD_sharpe_ratio <- (MACD_mean_return_pa - 0.034) / MACD_sd_pa
# Calculation: Value-at-Risk (1 year, 3 Months, 10 Days // 95% Confidence)
MACD_var_1year <- MACD_mean_return_pa + qnorm(0.05) * MACD_sd_pa
MACD_var_3months <- MACD_mean_return_pa + qnorm(0.05) * MACD_sd_pa * sqrt(60)
MACD_var_10days <- MACD_mean_return_pa + qnorm(0.05) * MACD_sd_pa * sqrt(10)
return(c(MACD_mean_return_pa, MACD_sd_pa, MACD_skew, MACD_kurt, MACD_sharpe_ratio,
MACD_var_1year, MACD_var_3months, MACD_var_10days))
}
# Calculating the relevant measures for every currency's MAC returns
MAC_results <- t(simplify2array(lapply(currencies, calculate_measures)))
# Reviewing the dimensions of the results matrix to ensure there were no calculation mistakes
print(dim(MAC_results))
## [1] 5 8
# Generating a data frame for the results
MAC_results_df<- data.frame(MAC_mean_return_pa= MAC_results[,1], MAC_Volatility=MAC_results[, 2], MAC_skewness=MAC_results[,3], MAC_kurtosis=MAC_results[,4], MAC_sharpe_ratio=MAC_results[,5], MAC_var_1year=MAC_results[,6], MAC_var_3months=MAC_results[,7], MAC_var_10days=MAC_results[,8])
# Display the results: MACD
print(MAC_results_df)
## MAC_mean_return_pa MAC_Volatility MAC_skewness MAC_kurtosis MAC_sharpe_ratio
## 1 0.2213334 0.09284718 0.3780264 5.589621 2.017653
## 2 0.2109481 0.09120296 0.8455402 14.962618 1.940157
## 3 0.2640266 0.12202951 0.7474839 16.051315 1.885008
## 4 0.1148976 0.05016882 0.6084873 8.360319 1.612508
## 5 0.2134878 0.09574606 0.4768269 7.477799 1.874623
## MAC_var_1year MAC_var_3months MAC_var_10days
## 1 0.06861337 -0.9616308 -0.2616097
## 2 0.06093254 -0.9510672 -0.2634427
## 3 0.06330597 -1.2907490 -0.3707079
## 4 0.03237725 -0.5243024 -0.1460547
## 5 0.05599952 -1.0064110 -0.2845338
# Display the results: SMA
print(SMA_results_df)
## SMA_mean_return_pa SMA_Volatility SMA_skewness SMA_kurtosis SMA_sharpe_ratio
## 1 0.13073769 0.09301986 -0.1948710 5.811834 1.0399682
## 2 0.11618252 0.09242477 0.6974604 15.022849 0.8891828
## 3 0.15481942 0.12372043 0.3226664 16.125627 0.9765519
## 4 0.06846254 0.05117993 0.1718891 8.372795 0.6733604
## 5 0.13703277 0.09627589 0.3082140 7.580660 1.0701825
## SMA_var_1year SMA_var_3months SMA_var_10days
## 1 -0.02226636 -1.054427 -0.3531036
## 2 -0.03584271 -1.061400 -0.3645635
## 3 -0.04868257 -1.421500 -0.4887104
## 4 -0.01572096 -0.583620 -0.1977491
## 5 -0.02132698 -1.089617 -0.3637447