# 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