如何使用 Python 解决风险平价分配问题
How to solve risk parity allocation using Python
我想使用 python 来解决风险平价问题。
风险平价是金融投资组合构建的经典方法。基本思想是确保每个资产的风险贡献相等。
例如,假设有 3 个资产,资产 returns 的协方差矩阵已知:
(var_11,var_12,var_13
var_12,var_22,var_23
var_13,var_23,var_33)
我想为这些资产 (w1,w2,w3) 提出一个投资组合权重,以便:
w1+w2+w3=1
w1>=0
w2>=0
w3>=0
并且每项资产的风险贡献等于:
w1^2*var_11+w1*w2*var_12+w1*w3*var_13
=w2^2*var_22+w1*w2*var_12+w2*w3*var_23
=w3^2*var_33+w1*w3*var_13+w2*w3*var_23
我不确定如何使用 python 求解这些方程,任何人都可以解释一下吗?
晚了一年多,但使用了 numpy 和 scipy 求解器。这家伙解释得很好并且在 python.
中做到了
https://thequantmba.wordpress.com/2016/12/14/risk-parityrisk-budgeting-portfolio-in-python/
所有功劳都归功于写博客的人 post。这是博客中的代码...
from __future__ import division
import numpy as np
from matplotlib import pyplot as plt
from numpy.linalg import inv,pinv
from scipy.optimize import minimize
# risk budgeting optimization
def calculate_portfolio_var(w,V):
# function that calculates portfolio risk
w = np.matrix(w)
return (w*V*w.T)[0,0]
def calculate_risk_contribution(w,V):
# function that calculates asset contribution to total risk
w = np.matrix(w)
sigma = np.sqrt(calculate_portfolio_var(w,V))
# Marginal Risk Contribution
MRC = V*w.T
# Risk Contribution
RC = np.multiply(MRC,w.T)/sigma
return RC
def risk_budget_objective(x,pars):
# calculate portfolio risk
V = pars[0]# covariance table
x_t = pars[1] # risk target in percent of portfolio risk
sig_p = np.sqrt(calculate_portfolio_var(x,V)) # portfolio sigma
risk_target = np.asmatrix(np.multiply(sig_p,x_t))
asset_RC = calculate_risk_contribution(x,V)
J = sum(np.square(asset_RC-risk_target.T))[0,0] # sum of squared error
return J
def total_weight_constraint(x):
return np.sum(x)-1.0
def long_only_constraint(x):
return x
x_t = [0.25, 0.25, 0.25, 0.25] # your risk budget percent of total portfolio risk (equal risk)
cons = ({'type': 'eq', 'fun': total_weight_constraint},
{'type': 'ineq', 'fun': long_only_constraint})
res= minimize(risk_budget_objective, w0, args=[V,x_t], method='SLSQP',constraints=cons, options={'disp': True})
w_rb = np.asmatrix(res.x)
我刚刚发布了一个 python 包来解决经典的风险平价问题。
基本上一行就可以解决你的问题:
import riskparityportfolio as rp
optimum_weights = rp.vanilla.design(cov, b)
其中 cov
是资产的协方差矩阵,b
是所需的预算向量。
此外,该软件包允许任意线性等式和不等式约束,以及添加 objective 项,例如均值 return 和波动率。检查一下:https://mirca.github.io/riskparity.py and https://github.com/mirca/riskparity.py
我想使用 python 来解决风险平价问题。
风险平价是金融投资组合构建的经典方法。基本思想是确保每个资产的风险贡献相等。
例如,假设有 3 个资产,资产 returns 的协方差矩阵已知:
(var_11,var_12,var_13
var_12,var_22,var_23
var_13,var_23,var_33)
我想为这些资产 (w1,w2,w3) 提出一个投资组合权重,以便:
w1+w2+w3=1
w1>=0
w2>=0
w3>=0
并且每项资产的风险贡献等于:
w1^2*var_11+w1*w2*var_12+w1*w3*var_13
=w2^2*var_22+w1*w2*var_12+w2*w3*var_23
=w3^2*var_33+w1*w3*var_13+w2*w3*var_23
我不确定如何使用 python 求解这些方程,任何人都可以解释一下吗?
晚了一年多,但使用了 numpy 和 scipy 求解器。这家伙解释得很好并且在 python.
中做到了https://thequantmba.wordpress.com/2016/12/14/risk-parityrisk-budgeting-portfolio-in-python/
所有功劳都归功于写博客的人 post。这是博客中的代码...
from __future__ import division
import numpy as np
from matplotlib import pyplot as plt
from numpy.linalg import inv,pinv
from scipy.optimize import minimize
# risk budgeting optimization
def calculate_portfolio_var(w,V):
# function that calculates portfolio risk
w = np.matrix(w)
return (w*V*w.T)[0,0]
def calculate_risk_contribution(w,V):
# function that calculates asset contribution to total risk
w = np.matrix(w)
sigma = np.sqrt(calculate_portfolio_var(w,V))
# Marginal Risk Contribution
MRC = V*w.T
# Risk Contribution
RC = np.multiply(MRC,w.T)/sigma
return RC
def risk_budget_objective(x,pars):
# calculate portfolio risk
V = pars[0]# covariance table
x_t = pars[1] # risk target in percent of portfolio risk
sig_p = np.sqrt(calculate_portfolio_var(x,V)) # portfolio sigma
risk_target = np.asmatrix(np.multiply(sig_p,x_t))
asset_RC = calculate_risk_contribution(x,V)
J = sum(np.square(asset_RC-risk_target.T))[0,0] # sum of squared error
return J
def total_weight_constraint(x):
return np.sum(x)-1.0
def long_only_constraint(x):
return x
x_t = [0.25, 0.25, 0.25, 0.25] # your risk budget percent of total portfolio risk (equal risk)
cons = ({'type': 'eq', 'fun': total_weight_constraint},
{'type': 'ineq', 'fun': long_only_constraint})
res= minimize(risk_budget_objective, w0, args=[V,x_t], method='SLSQP',constraints=cons, options={'disp': True})
w_rb = np.asmatrix(res.x)
我刚刚发布了一个 python 包来解决经典的风险平价问题。
基本上一行就可以解决你的问题:
import riskparityportfolio as rp
optimum_weights = rp.vanilla.design(cov, b)
其中 cov
是资产的协方差矩阵,b
是所需的预算向量。
此外,该软件包允许任意线性等式和不等式约束,以及添加 objective 项,例如均值 return 和波动率。检查一下:https://mirca.github.io/riskparity.py and https://github.com/mirca/riskparity.py