... cvxpy two: risk preference


The code is not listed in the video, but if you want to repeat this yourself, you can use the following code to make the same charts.

Data Prep

def solve_problem(dataf, risk_pref=0.1):
    mean_stock = dataf.diff().mean().values
    cov_stock = dataf.diff().cov().values

    x = cp.Variable(len(mean_stock))

    stock_return = mean_stock.T * x
    stock_risk = cp.quad_form(x, cov_stock)

    objective = cp.Maximize(stock_return - risk_pref * stock_risk)
    constraints = [cp.sum(x) == 1, x >= 0]
    prob = cp.Problem(objective=objective, constraints=constraints)
    return prob.solve(), x.value

import numpy as np
import matplotlib.pylab as plt 

steps = np.linspace(0.01, 2, 100)
x_vals = np.zeros((steps.shape[0], 4))
profit = np.zeros(steps.shape[0])
for i, r in enumerate(steps):
    p, xs = solve_problem(df_stocks.set_index('Date'), risk_pref=r)
    x_vals[i, :] = xs
    profit[i] = p

Chart One

plt.figure(figsize=(12, 4))
plt.plot(steps, profit)
plt.xlabel("risk avoidance")
plt.ylabel("1 day ahead expected return");

Chart Two

plt.figure(figsize=(12, 4))
tickers = ["MSFT", "KLM", "ING", "MOS"]
for idx, stock in enumerate(tickers):
    plt.plot(steps, x_vals[:, idx], label=stock)
plt.xlabel("risk avoidance")
plt.ylabel("proportion of investment")

Feedback? See an issue? Something unclear? Feel free to mention it here.

If you want to be kept up to date, consider signing up for the newsletter.