Versuchen, hier eine Portfolio-Gewichtsverteilung zu optimieren, die meine Rendite-Funktion durch Limit-Risiko maximiert. Ich habe kein Problem, das optimierte Gewicht zu finden, das zu meiner Rückkehrfunktion führt, durch einfache Einschränkung, dass die Summe aller Gewichte gleich 1 ist, und die andere Einschränkung, dass mein Gesamtrisiko unter dem Zielrisiko liegt. Mein Problem ist, dass wie für jede Gruppe Branchengewicht Grenzen hinzugefügt werden? Meine Codes sind wie folgt:SciPy Portfolio-Optimierung mit gruppiert nach Branchengrenzen
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import scipy.optimize as sco
dates = pd.date_range('1/1/2000', periods=8)
industry = ['industry', 'industry', 'utility', 'utility', 'consumer']
symbols = ['A', 'B', 'C', 'D', 'E']
zipped = list(zip(industry, symbols))
index = pd.MultiIndex.from_tuples(zipped)
noa = len(symbols)
data = np.array([[10, 9, 10, 11, 12, 13, 14, 13],
[11, 11, 10, 11, 11, 12, 11, 10],
[10, 11, 10, 11, 12, 13, 14, 13],
[11, 11, 10, 11, 11, 12, 11, 11],
[10, 11, 10, 11, 12, 13, 14, 13]])
market_to_market_price = pd.DataFrame(data.T, index=dates, columns=index)
rets = market_to_market_price/market_to_market_price.shift(1) - 1.0
rets = rets.dropna(axis=0, how='all')
expo_factor = np.ones((5,5))
factor_covariance = market_to_market_price.cov()
delta = np.diagflat([0.088024, 0.082614, 0.084237, 0.074648,
0.084237])
cov_matrix = np.dot(np.dot(expo_factor, factor_covariance),
expo_factor.T) + delta
def calculate_total_risk(weights, cov_matrix):
port_var = np.dot(np.dot(weights.T, cov_matrix), weights)
return port_var
def max_func_return(weights):
return -np.sum(rets.mean() * weights)
# optimized return with given risk
tolerance_risk = 27
noa = market_to_market_price.shape[1]
cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1},
{'type': 'eq', 'fun': lambda x: calculate_total_risk(x, cov_matrix) - tolerance_risk})
bnds = tuple((0, 1) for x in range(noa))
init_guess = noa * [1./noa,]
opts_mean = sco.minimize(max_func_return, init_guess, method='SLSQP',
bounds=bnds, constraints=cons)
In [88]: rets
Out[88]:
industry utility consumer
A B C D E
2000-01-02 -0.100000 0.000000 0.100000 0.000000 0.100000
2000-01-03 0.111111 -0.090909 -0.090909 -0.090909 -0.090909
2000-01-04 0.100000 0.100000 0.100000 0.100000 0.100000
2000-01-05 0.090909 0.000000 0.090909 0.000000 0.090909
2000-01-06 0.083333 0.090909 0.083333 0.090909 0.083333
2000-01-07 0.076923 -0.083333 0.076923 -0.083333 0.076923
2000-01-08 -0.071429 -0.090909 -0.071429 0.000000 -0.071429
In[89]: opts_mean['x'].round(3)
Out[89]: array([ 0.233, 0.117, 0.243, 0.165, 0.243])
wie kann ich eine solche Gruppe in solche, dass die Summe von 5 Vermögenswerte hinzuzufügen gebunden fallen unter gebunden?
model = pd.DataFrame(np.array([.08,.12,.05]), index= set(industry), columns = ['strategic'])
model['tactical'] = [(.05,.41), (.2,.66), (0,.16)]
In [85]: model
Out[85]:
strategic tactical
industry 0.08 (0.05, 0.41)
consumer 0.12 (0.2, 0.66)
utility 0.05 (0, 0.16)
Ich habe diese ähnliche Position SciPy optimization with grouped bounds gelesen, aber immer noch keine Hinweise, kann jeder Körper Hilfe erhalten können? Danke.
Ihre Vielen Dank für Ihre Antwort. Eine kleine Änderung bei der Funktion mapto_constraints: lbdict = {'type': 'ineq', 'Spaß': Lambda x: np.sum (x [pos [0] :(pos [-1] + 1)]) - lb } ubdict = {'type': 'ineq', 'Spaß': Lambda x: ub - np.sum (x [pos [0] :(pos [-1] + 1)])} –