Scipy оптимизация с несколькими границами
Я решаю проблему оптимизации портфеля, где мне нужно распределить веса (капитал) таким образом, чтобы конечный портфель имел минимально возможную историческую волатильность. В настоящее время у меня есть два ограничения на общую сумму весов каждой акции и их вес в квадрате. Границы для размещения в каждой акции (0,00, 0,02).
В настоящее время мой код выглядит так:
def portfolio_vol(w):
#compute porfolio volatility
portfolio_volatility = np.sqrt(w.T.dot(cov_matrix).dot(w))
return portfolio_volatility
w
вектор равных весов, рассчитанный как w = 1.0/len(composition)
def find_optimal_allocations():
bnds = tuple((0.00, 0.02) for x in weights)
cons = ({'type': 'eq', 'fun': lambda x: 1 - sum(x)}, {'type': 'ineq', 'fun': lambda x: -sum(x**2) + 0.02})
result = spo.minimize(portfolio_vol, weights, method='SLSQP', bounds = bnds, constraints = cons)
return result.x
Я храню свои веса в серии панд MultIndex, где акции сгруппированы по странам и изначально имеют равный вес:
Country Ticker
AS OMV AV Equity 0.020000
BE SOLB BB Equity 0.020000
FI NESTE FH Equity 0.020000
FR FP FP Equity 0.020000
GB LAND LN Equity 0.020000
GE BAS GR Equity 0.020000
HEI GR Equity 0.020000
GR TITK GA Equity 0.020000
IR CRH ID Equity 0.020000
RYA ID Equity 0.020000
...
US AMAT US Equity 0.020000
AMGN US Equity 0.020000
APA US Equity 0.020000
Я хотел бы включить дополнительные ограничения в find_optimal_allocations()
чтобы я мог установить ограничения для каждой страны максимальный вес: s.groupby(level=0,axis=0).sum()
Country
AS 0.020000
BE 0.020000
FI 0.020000
FR 0.020000
GB 0.020000
GE 0.040000
GR 0.020000
IR 0.040000
US 0.400000
Например, в рамках этих границ:
[(.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.10), (.05,.20)]
Как я могу включить эти границы в свою функцию оптимизации, чтобы она одновременно учитывала ограничения по весу страны и ограничения по отдельным запасам?
1 ответ
Измените свою функцию оптимизации таким образом, чтобы был высокий штраф, если вес какого-либо актива выходит за его пределы. Используя эту новую функцию, вы можете попытаться найти градиент и выполнить подъем по градиенту, чтобы оптимизировать возврат / вознаграждение.