Package 'epo'

Title: Enhanced Portfolio Optimization (EPO)
Description: Implements the Enhanced Portfolio Optimization (EPO) method as described in Pedersen, Babu and Levine (2021) <doi:10.2139/ssrn.3530390>.
Authors: Bernardo Reckziegel [aut, cre, cph]
Maintainer: Bernardo Reckziegel <[email protected]>
License: MIT + file LICENSE
Version: 0.1.0.9000
Built: 2024-11-19 03:54:48 UTC
Source: https://github.com/reckziegel/epo

Help Index


Enhanced Portfolio Optimization (EPO)

Description

Computes the optimal portfolio allocation using the EPO method.

Usage

epo(
  x,
  signal,
  lambda,
  method = c("simple", "anchored"),
  w,
  anchor = NULL,
  normalize = TRUE,
  endogenous = TRUE
)

## Default S3 method:
epo(
  x,
  signal,
  lambda,
  method = c("simple", "anchored"),
  w,
  anchor = NULL,
  normalize = TRUE,
  endogenous = TRUE
)

## S3 method for class 'tbl'
epo(
  x,
  signal,
  lambda,
  method = c("simple", "anchored"),
  w,
  anchor = NULL,
  normalize = TRUE,
  endogenous = TRUE
)

## S3 method for class 'xts'
epo(
  x,
  signal,
  lambda,
  method = c("simple", "anchored"),
  w,
  anchor = NULL,
  normalize = TRUE,
  endogenous = TRUE
)

## S3 method for class 'matrix'
epo(
  x,
  signal,
  lambda,
  method = c("simple", "anchored"),
  w,
  anchor = NULL,
  normalize = TRUE,
  endogenous = TRUE
)

Arguments

x

A data-set with asset returns. It should be a tibble, a xts or a matrix.

signal

A double vector with the investor's belief's (signals, forecasts).

lambda

A double with the investor's risk-aversion preference.

method

A character. One of: "simple" or "anchored".

w

A double between 0 and 1. The shrinkage level increases from 0 to 1.

anchor

A double vector with the anchor (benchmark) in which the allocation should not deviate too much from. Only used when method = "anchored".

normalize

A boolean indicating whether the allocation should be normalized to sum 1 (full-investment constraint). The default is normalize = TRUE.

endogenous

A boolean indicating whether the risk-aversion parameter should be considered endogenous (only used when method = "anchored"). The default is endogenous = TRUE.

Value

The optimal allocation vector.

Examples

x <- diff(log(EuStockMarkets)) # stock returns
s <- colMeans(x) # it could be any signal

##################
### Simple EPO ###
##################

# Traditional Mean-Variance Analysis
epo(x = x, signal = s, lambda = 10, method = "simple", w = 0)

# 100% Shrinkage
epo(x = x, signal = s, lambda = 10, method = "simple", w = 1)

# 50% Classical MVO and 50% Shrinkage
epo(x = x, signal = s, lambda = 10, method = "simple", w = 0.5)

####################
### Anchored EPO ###
####################

benchmark <- rep(0.25, 4) # 1/N Portfolio

# Traditional Mean-Variance Analysis
epo(x = x, signal = s, lambda = 10, method = "anchored", w = 0.0, anchor = benchmark)

# 100% on the Anchor portfolio
epo(x = x, signal = s, lambda = 10, method = "anchored", w = 1.0, anchor = benchmark)

# Somewhere between the two worlds
epo(x = x, signal = s, lambda = 10, method = "anchored", w = 0.5, anchor = benchmark)