Оптимизация scipy портфеля Equal Risk Contribution не работает - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать инструмент для портфеля с равным риском, по сути, следуя этой статье (https://quantdare.com/risk-parity-in-python/)), но на последнем этапе он не работает (def risk_parity_weights), так как оптимизатор scipy не работает.Он продолжает давать мне начальные веса как оптимизированные веса, и я знаю, что они не являются оптимизированными весами, потому что даже Excel Solver был в состоянии оптимизировать это. Все остальные функции были проверены и являются правильными. Не уверен, что яделает неправильно - пожалуйста, помогите!

#Calculate portfolio st.dev
    portfolio_stdev = np.sqrt(weights*covariances*weights.T)[0,0]

    #Calculate Marginal Risk Contribution of each asset
    MRC = covariances*weights.T/portfolio_stdev

    #Calculate Risk Contribution of each asset
    RC = np.multiply(MRC,weights.T)
    return RC

def risk_budget_objective_error(weights,*args):

    #Covariance table occupies the first position in args variable
    covariances = args[0]

    #State risk budgets
    assets_risk_budget = args[1]

    #Convert weights array to numpy matrix
    weights = np.matrix(weights)

    #Calculate portfolio st_dev
    portfolio_stdev = calculate_portfolio_stdev(ca_begweights,ca_cov)

    #Calculate risk contributions
    assets_risk_contribution = calculate_risk_contribution(ca_begweights,ca_cov)

    #Calculate desired risk contribution of each asset
    assets_risk_target = np.asmatrix(np.multiply(portfolio_stdev,assets_risk_budget))

    #Calculate error between desired contribution and calculated distribution of each asset
    error = sum(np.square(assets_risk_contribution - assets_risk_target.T))[0,0]

    return error

def risk_parity_weights(covariances,assets_risk_budget, initial_weights):

    #Constraints to optimization
    #sum equals 100%
    cons = ({'type':'eq','fun':lambda x: np.sum(x) - 1.0},
              {'type':'ineq','fun':lambda x: x})

    #Optimization in scipy
    optimize_result = minimize(risk_budget_objective_error,
                           x0 = initial_weights,
                           args = (covariances, assets_risk_budget),
                           method = 'SLSQP',
                           constraints = cons,
                           tol = Tolerance,
                           options = {'disp':True})

    #Get optimized weights
    weights = optimize_result.x

    return weights

risk_parity_weights(ca_cov,risk_budget_all, ca_begweights) дает мне

Optimization terminated successfully.    (Exit mode 0)
            Current function value: 9.54000328523598e-07
            Iterations: 1
            Function evaluations: 5
            Gradient evaluations: 1

См. данные переменных ниже

ca_cov = array([[ 5.28024463e-06, 3.29734889e-07, -7.04781216e-08], [ 3.29734889e-07, 1.32373854e-05, 3.71807979e-08], [-7.04781216e-08, 3.71807979e-08, 3.50845569e-05]]) 

risk_budget_all = Unnamed: 1 0.333333 Unnamed: 2 0.333333 Unnamed: 3 0.333333 Name: Risk Budget, dtype: object 

ca_begweights = array([0.33333333, 0.33333333, 0.33333333]) 
...