#' Calculate equity curve from transactions.
#'
#' @param trans Transactions which contains date and pnl.
#' @param base_xts xts which contains all trading days.
#'
#' @return Equity curve by data.table format.
#' @export
calcEquityCurveFromTrans <- function(trans, base_xts = NULL,
start_date = NULL, end_date = NULL) {
# Functions
extractDates <- function(base_xts) {
dates <- index(base_xts)
dates <- data.table::data.table(as.Date(strftime(dates, "%Y-%m-%d")))
colnames(dates) <- "date"
return(dates)
}
# Extract PnL
ec <- trans %>%
dplyr::group_by(date) %>%
dplyr::summarise(ttl_pnl = sum(pnl), count = n()) %>%
dplyr::select(date, ttl_pnl, count) %>%
dplyr::rename(pnl = ttl_pnl) %>%
data.table::data.table()
# Merge with all trading dates
if (!is.null(base_xts)) {
dt <- extractDates(base_xts)
} else {
dt <- getTradingDays(start_date, end_date, type = "dt")
}
ec <- ec[dt, on = "date", all = TRUE]
ec[is.na(ec)] <- 0
# Equity curve
ec[, cum_pnl := cumsum(pnl)]
# Calc equity drawdown
ec[, peak := 0]
for (i in 1:nrow(ec)) { ec[i, "peak"] <- max(ec[1:i, "cum_pnl"]) }
ec[, drawdown := cum_pnl - peak]
ec[, peak := NULL]
return (ec)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.