Я использую xlwings для реализации кода Python в Excel. Я поместил следующий код в Spyder и импортировал его в Excel, используя xlwings, чтобы выполнить оптимистичную оптимизацию для портфеля из 7 активов
@xw.func
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]
weights = np.matrix(weights)
#Calculate portfolio st_dev
portfolio_stdev = calculate_portfolio_risk(weights,covariances)
#Calculate risk contributions
assets_risk_contribution = calculate_risk_contribution(weights,covariances)
#Calculate desired risk contribution of each asset
assets_risk_target = np.multiply(portfolio_stdev,assets_risk_budget).astype(float)
#Calculate error between desired contribution and calculated distribution of each asset
squared_error = np.square(assets_risk_contribution-assets_risk_target.T)
sse = sum(squared_error)
return sse
@xw.func
def erc_weights(covariances,assets_risk_budget, num_assets):
#Constraints to optimization
cons = ({'type':'eq','fun':lambda x: np.sum(x) - 1.5},
{'type':'ineq','fun':lambda x: x})
bounds = ((0,.50),(0,None),(0,None),(0,None),(0,None),(0,.50),(0,None),(0,.10),(0,.25))
init_weights = [.5]*num_assets
#Optimization in scipy
optimize_result = minimize(risk_budget_objective_error,
x0 = init_weights,
method = 'SLSQP',
args = (covariances, assets_risk_budget),
constraints = cons,
options = {'disp':True,'ftol':1e-50}
)
#Get optimized weights
weights = optimize_result.x
return weights
Моя проблема связана с функцией erc_weights. Я пытаюсь сделать так, чтобы количество активов в портфеле было одним из аргументов в функции.
В свою очередь, я сделал аргумент num_assets, который представляет собой количество активов в портфеле (отредактированный код показан ниже), но каждый раз, когда я добавляю его в качестве аргумента, функция ломается и выдает ошибку. Для ясности, единственное изменение в приведенном ниже коде - это включение num_assets в качестве аргумента и изменение формулы для init_weights на [.5] * num_assets
То же самое происходит, когда я пытаюсь сделать другие параметры эндогенными. Например: ограничение общего веса, границы и т. д., поэтому любое решение этой проблемы определенно пригодится и в этих областях. Спасибо
@xw.func
def erc_weights(covariances,assets_risk_budget, num_assets):
#Constraints to optimization
cons = ({'type':'eq','fun':lambda x: np.sum(x) - 1.5},
{'type':'ineq','fun':lambda x: x})
bounds = ((0,.50),(0,None),(0,None),(0,None),(0,None),(0,.50),(0,None),(0,.10),(0,.25))
init_weights = [.5]*num_assets
#Optimization in scipy
optimize_result = minimize(risk_budget_objective_error,
x0 = init_weights,
method = 'SLSQP',
args = (covariances, assets_risk_budget),
constraints = cons,
options = {'disp':True,'ftol':1e-50}
)
#Get optimized weights
weights = optimize_result.x
return weights