knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE, 
                      error = FALSE)
library(InvMgmt)
library(kableExtra)
load('data.Rds')
data(ret)
colnames(ret) <- c('date', 'US Large Cap', 'US Small Cap', 'US Value', 
                   'US Growth', 'EAFA', 'Em Mkt Stock', 'US Treas Long', 
                   'US Treas Interm', 'Em Mkt Bond', 'US Inv Grade', 
                   'US High Yield', 'Real Estate', 'MLP', 'Infrastructure', 
                   'Nat. Resources', 'Gold')
fundret <- combineRet(fund, bench, freq = 'd', method = 'matrix')

\newpage

Fund Summary

Name

Catalyst Millburn Hedged Strategy (MBXIX)

Benchmark used for Report

SPDR S&P 500 ETF (SPY)

Investment Objective

The investment seeks long-term capital appreciation. The fund seeks to achieve its investment objective by investing in a portfolio comprised of (i) futures contracts, forward and spot contracts, and/or options on futures contracts on or related to the following sectors: currencies, interest rate instruments, stock indices, metals, energy and agricultural commodities, (the "Futures Component") and (ii) equity ETFs, common stocks (the "Equity Component"), intended to capitalize on the non-correlated, long term historical performance of the equities and managed futures asset classes.

Morningstar Category

US Fund Multialternative

Expense Ratio

2.02%

AUM (MM)

$5,300

Advisor / Sub-Advisor

Catalyst / Millburn

\newpage

Performance Summary

chartWealth(fundret) +
  labs(title = '', subtitle = '') +
  scale_color_manual(values = c('dodgerblue', 'darkgrey')) + 
  theme_bw() +
  theme(legend.position = 'bottom')
ann_ret <- annRet(fundret, 'd')
sharpe <- sharpeRatio(fundret, rf, 'd')
sortino <- sortinoRatio(fundret, rf, 'd') %>%
  select(-excess_ret)
worst_dd <- drawdown(fundret) %>% 
  select(-date) %>% 
  apply(2, min) %>%
  enframe() %>%
  rename('asset' = 'name')
dat <- reduce(list(ann_ret, sharpe, sortino, worst_dd), full_join, by = 'asset') %>%
  mutate_at(vars(-asset, -sharpe, -sortino), fPercent) %>%
  mutate_at(vars(sharpe, sortino), fNum)
colnames(dat) <- c('Asset', 'Annual Return', 'Excess Return', 'Volatility', 
                   'Sharpe', 'Down Volatility', 'Sortino', 'Worst Drawdown')
kableExtra::kable(dat, 'latex') %>%
  kableExtra::kable_styling(latex_options = 'striped')

$$E[\mu]=3.6, E[\sigma]=11.0$$

chartCone(fundret[, 1:2], 0.0363, 0.11, 'd') +
  labs(title = '', subtitle = '') +
  theme(legend.position = 'bottom')

Correlation

corr_ret <- combineRet(fund, ret, freq = 'd', method = 'matrix')
corr_ret %>% 
  select(-date) %>% 
  cor() %>%
  chartCorr()
chartDendro(corr_ret)

\newpage

PCA

chartPCA(fund, ret, rf, n_pc = 2) +
  xlab('') + ylab('') + 
  theme_bw()

Rolling Regression v.s. Benchmark (90 day)

chartRollUniReg(fund, bench, rf, 'd', 90) +
  labs(title = '', subtitle = '') +
  geom_hline(yintercept = 0, color = 'black') +
  theme_bw() +
  theme(legend.position = 'none')

\newpage

Rolling Volatility and Drawdowns

chartRollSd(fundret, 'd', 90, TRUE) +
  scale_color_manual(values = c('dodgerblue', 'darkgrey')) +
  labs(title = '', subtitle = '') +
  xlab('') + ylab('') +
  theme_bw() +
  theme(legend.position = 'bottom')

Emperical PDF and Recent Returns

chartPDF(fund, 'd') +
  theme_bw() +
  theme(legend.position = 'top')
chartPDF(fund, 'm', 12) + 
  theme_bw() +
  theme(legend.position = 'top')
chartPDF(fund, 'q', 4) +
  theme_bw() +
  theme(legend.position = 'top')

\newpage

Return Conditional on Fragility and Turbulence

sysRiskPerf(fundret, sys_risk, 'd') %>%
  mutate_at(vars(-Asset), fPercent) %>%
  kableExtra::kable('latex') %>%
  kableExtra::kable_styling(latex_options = 'striped')

\vspace{18pt}

hline_df <- tibble(series = c('Std. Change of Absorp. Ratio',
                              'Turbulence Percentile'),
                   yintercept = c(1.75, 0.90))
sys_risk %>%
  select(date, delta.ar, percentile) %>%
  rename('Std. Change of Absorp. Ratio' = 'delta.ar', 
         'Turbulence Percentile' = 'percentile') %>%
  left_join(drawdown(fund), by = 'date') %>%
  pivot_longer(-date, names_to = 'series', values_to = 'values') %>%
  ggplot(aes(x = date, y = values, color = series)) + 
    geom_bar(stat = 'identity', position = 'dodge') +
    geom_hline(data = hline_df, aes(yintercept = yintercept)) +
    facet_wrap(series ~., scales = 'free', ncol = 1) +
    ylab('') + xlab('') +
    theme_bw() + 
    theme(legend.position = 'none')

Risk / Reward Trade-offs

mu <- annRet(ret, 'd')
sigma <- annSd(ret, 'd')
fund_mu <- annRet(fundret, 'd')
fund_sigma <- annSd(fundret, 'd')
fund_dat <- left_join(fund_mu, fund_sigma, by = 'asset')
left_join(mu, sigma, by = 'asset') %>%
  ggplot(aes(x = sd, y = ann_ret, label = asset)) +
  geom_point(size = 3) +
  ggrepel::geom_text_repel(size = 3.5) +
  geom_point(data = fund_dat, aes(x = sd, y = ann_ret, color = asset,
             label = asset), show.legend = FALSE, size = 3) +
  ggrepel::geom_text_repel(data = fund_dat, size = 3.5) + 
  ylab('Annualized Return') + xlab('Annualized Volatility') +
  scale_y_continuous(labels = scales::percent) +
  scale_x_continuous(labels = scales::percent) +
  theme_bw()
max_dd <- drawdown(ret) %>%
  select(-date) %>%
  apply(2, min) %>%
  tibble() %>%
  add_column(asset = ret %>% select(-date) %>% colnames()) %>%
  rename('max_dd' = '.')
fund_max_dd <- drawdown(fundret) %>%
  select(-date) %>%
  apply(2, min) %>%
  tibble() %>%
  add_column(asset = fundret %>% select(-date) %>% colnames()) %>%
  rename('max_dd' = '.')
fund_dat <- left_join(fund_mu, fund_max_dd, by = 'asset')
left_join(mu, max_dd, by = 'asset') %>%
  ggplot(aes(x = max_dd, y = ann_ret, label = asset)) +
  geom_point(size = 3) +
  ggrepel::geom_text_repel(size = 3.5) +
  geom_point(data = fund_dat, aes(x = max_dd, y = ann_ret, color = asset,
             label = asset), show.legend = FALSE, size = 3) +
  ggrepel::geom_text_repel(data = fund_dat, size = 3.5) + 
  ylab('Annualized Return') + xlab('Worst Drawdown') +
  scale_y_continuous(labels = scales::percent) +
  scale_x_reverse(labels = scales::percent) +
  theme_bw()

Up and Down Benchmark Periods




alejandro-sotolongo/InvMgmt documentation built on Dec. 18, 2019, 3:33 a.m.