# Load required packages
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(xts)

# Load data
etf56 <- read.table("tw0056_20070101_20191231(1).txt", header = TRUE)
etf56 <- etf56[c(3, 7)]
colnames(etf56) <- c("date", "price")

# Check for missing values
if (any(is.na(etf56$price))) {
  stop("Missing values detected in the data. Please handle missing values before proceeding.")
}

# Convert to time series data
etf56.xts <- xts(etf56$price, order.by = as.Date(as.character(etf56$date), format = "%Y%m%d"))

# Define Simple Moving Average (SMA) function
SMA <- function(x, n) {
  stats::filter(x, rep(1/n, n), sides = 2)
}

# Calculate SMA
md <- 50
sma <- SMA(etf56.xts, md)

# Generate signals based on SMA crossover
signals <- ifelse(coredata(etf56.xts) >= coredata(sma), 1, 0)

# Calculate returns for Buy & Hold strategy
buy_hold_returns <- diff(etf56.xts)

# Calculate returns for SMA Crossover strategy
sma_cross_returns <- diff(etf56.xts) * signals[-1]
## Warning in `*.default`(diff(etf56.xts), signals[-1]): longer object length is
## not a multiple of shorter object length
# Calculate cumulative returns
buy_hold_cumulative_returns <- cumsum(buy_hold_returns)
sma_cross_cumulative_returns <- cumsum(sma_cross_returns)

# Print the cumulative returns
print("Buy & Hold Cumulative Returns:")
## [1] "Buy & Hold Cumulative Returns:"
print(buy_hold_cumulative_returns)
##            m.c.seq.row..seq.n...seq.col..drop...FALSE.
## 2007-12-26                                          NA
## 2007-12-27                                          NA
## 2007-12-28                                          NA
## 2007-12-31                                          NA
## 2008-01-02                                          NA
## 2008-01-03                                          NA
## 2008-01-04                                          NA
## 2008-01-07                                          NA
## 2008-01-08                                          NA
## 2008-01-09                                          NA
##        ...                                            
## 2019-12-18                                          NA
## 2019-12-19                                          NA
## 2019-12-20                                          NA
## 2019-12-23                                          NA
## 2019-12-24                                          NA
## 2019-12-25                                          NA
## 2019-12-26                                          NA
## 2019-12-27                                          NA
## 2019-12-30                                          NA
## 2019-12-31                                          NA
cat("\n")
print("SMA Crossover Cumulative Returns:")
## [1] "SMA Crossover Cumulative Returns:"
print(sma_cross_cumulative_returns)
##            m.c.seq.row..seq.n...seq.col..drop...FALSE.
## 2007-12-26                                          NA
## 2007-12-27                                          NA
## 2007-12-28                                          NA
## 2007-12-31                                          NA
## 2008-01-02                                          NA
## 2008-01-03                                          NA
## 2008-01-04                                          NA
## 2008-01-07                                          NA
## 2008-01-08                                          NA
## 2008-01-09                                          NA
##        ...                                            
## 2019-12-18                                          NA
## 2019-12-19                                          NA
## 2019-12-20                                          NA
## 2019-12-23                                          NA
## 2019-12-24                                          NA
## 2019-12-25                                          NA
## 2019-12-26                                          NA
## 2019-12-27                                          NA
## 2019-12-30                                          NA
## 2019-12-31                                          NA