Optimal Portfolios: Borrowing Frictions


Kevin Crotty
BUSI 448: Investments

Where are we?

Last time:

  • Capital Allocation: Risk-free + Risky
  • Preferences over risk and return
  • Optimal portfolios

Today:

  • Borrowing frictions

Borrowing frictions

Leverage constraints

Many investors (like me!) cannot borrow at the same rate at which they can lend.

In this case, the capital allocation line is not a straight line.

For most investors:

\[r^{\text{borrow}}>r^{\text{saving}}\]

Kinked Capital Allocation Lines

  • For portfolios with some risk-free saving:

\[ E[r_p] = r_f^{\text{saving}} + \bigg[ \frac{E[r_{\text{risky}}]-r_f^{\text{saving}}}{\text{sd}[r_{\text{risky}}] }\bigg]\cdot \text{sd}[r_p]\,.\]

  • For portfolios with borrowing, the capital allocation line has a lower slope:

\[ E[r_p] = r_f^{\text{borrow}} + \bigg[ \frac{E[r_{\text{risky}}]-r_f^{\text{borrow}}}{\text{sd}[r_{\text{risky}}] }\bigg]\cdot \text{sd}[r_p]\,.\]

Kinked Capital Allocation Lines

Optimal portfolios with leverage frictions

Capital allocation with leverage frictions

  • Where do investors with different risk aversions choose to invest when faced with this investment opportunity set?

  • The answer depends on the investor’s risk aversion and the reward-risk ratios of the efficient low risk and high mean portfolios.

Capital allocation with leverage frictions

High risk aversion investors invest in the efficient low risk portfolio and save:

\[ w^*_{\text{low}} = \frac{E[r_{\text{low}}-r_f^{\text{saving}}]}{A \cdot \text{var}_{\text{low}}}.\]

Low risk aversion investors invest in the efficient high mean portfolio and borrow:

\[ w^*_{\text{high}} = \frac{E[r_{\text{high}}-r_f^{\text{borrow}}]}{A \cdot \text{var}_{\text{high}}}.\]

Capital allocation with leverage frictions

Intermediate risk aversion investors invest in risky assets only.

  • Can express as a two-asset portfolio of the efficient low and high risk portfolios.

  • The optimal weight \(a^*\) in the low-risk portfolio is: \[ a^* = \frac{E[r_{\text{low}} - r_{\text{high}}] - A (\text{cov}[r_{\text{low}}, r_{\text{high}}]-\text{var}[r_{\text{high}}])}{A (\text{var}[r_{\text{low}}]+\text{var}[r_{\text{high}}]-2\text{cov}[r_{\text{low}}, r_{\text{high}}])}\,,\]

  • Note: \(\text{cov}[r_{\text{low}}, r_{\text{high}}] = w_{\text{low}}' V w_{\text{high}}\), where \(w_{\text{low}}\) and \(w_{\text{high}}\) are the weights in the underlying risky assets for the efficient low-risk and high-mean portfolios, respectively.

Capital allocation with leverage frictions

Risky asset allocation with leverage frictions

Capital allocation: two solution methods

  • Method #1: Find risk aversion thresholds that represent low- and high-risk portfolios
  • Method #2: Directly maximize mean-variance utility using all assets, including risk-free savings and borrowings

Method #1: Risk aversion thresholds

We can find the risk aversion thresholds for savings and borrowing by setting risky asset allocation \(w^* \le 1\) (savings) or \(w^* \ge 1\) (borrowing) in the capital allocation expressions and solving for risk aversion.

  • Upper risk aversion threshold: some savings if \[A \ge \frac{E[r_{\text{low}}-r_f]}{\text{var}(r_{\text{low}})}.\]

  • Lower risk aversion threshold: some borrowing if \[A \le \frac{E[r_{\text{high}}-r_f]}{\text{var}(r_{\text{high}})}.\]

Method #2: Direct optimization of utility

The optimal portfolio for investor with risk aversion \(A\) solves:

\[ \underset{w_{\text{saving}},w_{\text{borrow}},w_1,w_2,\dots,w_N}{\text{max}} E[r_p] - 0.5 \cdot A \cdot \text{var}[r_p] \]

subject to the constraints \[w_{\text{saving}} + w_{\text{borrow}} + \sum_i w_i=1,\] \[w_{\text{saving}} \ge 0,\] \[w_{\text{borrow}} \le 0.\]

  • We need to augment the expected return vector and covariance matrix with elements for the savings and borrowing assets.

Mapping to cvxopt.solvers.qp

Recall the cvxopt.solvers.qp function’s general form: \[\begin{align*} \underset{w}{\text{min }}& \frac{1}{2} w' Q w + p'w \\ \text{subject to } & Gw \le h \\ & Aw = b \\ \end{align*}\]

  • \(0.5w'Qw\) captures \(0.5 \cdot A \cdot \text{var}[r_p]\)
  • \(p'w\) captures \(-E[r_p]\)
  • \(Gw \le h\) captures only positive saving and negative borrowing
  • \(Aw=b\) is the fully invested constraint

Python implementation

def opt_allocation2(means, cov, rf_save, rf_borrow, risk_aversion):
    n=len(means)
    Q = np.zeros((n + 2, n + 2))
    Q[2:, 2:] = risk_aversion * cov
    Q = matrix(Q, tc="d")
    p = np.array([-rf_save, -rf_borrow] + list(-means))
    p = matrix(p, (n + 2, 1), tc="d")
    # Constraint: saving weight positive, borrowing weight negative
    G = np.zeros((2, n + 2))
    G[0, 0] = -1
    G[1, 1] = 1
    G = matrix(G, (2, n+2), tc="d")
    h = matrix([0, 0], (2, 1), tc="d")
    # Constraint: fully-invested portfolio
    A = matrix(np.ones(n+2), (1, n+2), tc="d")
    b = matrix([1], (1, 1), tc="d")
    sol = Solver(Q, p, G, h, A, b)
    if sol["status"] == "optimal":
        wgts_optimal = np.array(sol["x"]).flatten()
    else:
        wgts_optimal = None
    return wgts_optimal

Learn Investments Dashboard resources

Optimal allocation with different rates

For next time: Short-sale constraints