Advertisement
Guest User

fr

a guest
Mar 3rd, 2020
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.20 KB | None | 0 0
  1. import pandas as pd
  2. import numpy as np
  3. import cvxopt as opt
  4. from cvxopt import blas, solvers
  5.  
  6.  
  7. def return_portfolios(expected_returns, cov_matrix):
  8.     port_returns = []
  9.     port_volatility = []
  10.     stock_weights = []
  11.  
  12.     selected = (expected_returns.axes)[0]
  13.  
  14.     num_assets = len(selected)
  15.     num_portfolios = 5000
  16.  
  17.     for single_portfolio in range(num_portfolios):
  18.         weights = np.random.random(num_assets)
  19.         weights /= np.sum(weights)
  20.         returns = np.dot(weights, expected_returns)
  21.         volatility = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
  22.         port_returns.append(returns)
  23.         port_volatility.append(volatility)
  24.         stock_weights.append(weights)
  25.  
  26.     portfolio = {'Returns': port_returns,
  27.                  'Volatility': port_volatility}
  28.  
  29.     for counter, symbol in enumerate(selected):
  30.         portfolio[symbol + ' Weight'] = [Weight[counter] for Weight in stock_weights]
  31.  
  32.     df = pd.DataFrame(portfolio)
  33.  
  34.     column_order = ['Returns', 'Volatility'] + [stock + ' Weight' for stock in selected]
  35.  
  36.     df = df[column_order]
  37.  
  38.     return df
  39.  
  40.  
  41. def optimal_portfolio(returns):
  42.     n = returns.shape[1]
  43.     returns = np.transpose(returns.as_matrix())
  44.  
  45.     N = 100
  46.     mus = [10 ** (5.0 * t / N - 1.0) for t in range(N)]
  47.  
  48.     # Convert to cvxopt matrices
  49.     S = opt.matrix(np.cov(returns))
  50.     pbar = opt.matrix(np.mean(returns, axis=1))
  51.  
  52.     # Create constraint matrices
  53.     G = -opt.matrix(np.eye(n))  # negative n x n identity matrix
  54.     h = opt.matrix(0.0, (n, 1))
  55.     A = opt.matrix(1.0, (1, n))
  56.     b = opt.matrix(1.0)
  57.  
  58.     # Calculate efficient frontier weights using quadratic programming
  59.     portfolios = [solvers.qp(mu * S, -pbar, G, h, A, b)['x']
  60.                   for mu in mus]
  61.     ## CALCULATE RISKS AND RETURNS FOR FRONTIER
  62.     returns = [blas.dot(pbar, x) for x in portfolios]
  63.     risks = [np.sqrt(blas.dot(x, S * x)) for x in portfolios]
  64.     ## CALCULATE THE 2ND DEGREE POLYNOMIAL OF THE FRONTIER CURVE
  65.     m1 = np.polyfit(returns, risks, 2)
  66.     x1 = np.sqrt(m1[2] / m1[0])
  67.     # CALCULATE THE OPTIMAL PORTFOLIO
  68.     wt = solvers.qp(opt.matrix(x1 * S), -pbar, G, h, A, b)['x']
  69.     return np.asarray(wt), returns, risks
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement