Я пытаюсь найти оптимальные веса в портфеле, чтобы веса минимизировали дисперсию портфеля.
Для этого я использую функцию минимизации scipy. Моя проблема в том, что вывод минимизации возвращает x0 (в этом случае начальное положение весов).
Я пробовал увеличить шаги eps: 1e + 3 и вывод немного отличается от x0, но незначительно. Так что это не совсем решение моей проблемы.
Кто-нибудь может помочь мне получить результат, отличный от x0?
Буду очень благодарен за любую помощь. Вот мой код:
Всего наилучшего,
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import datetime
from scipy import stats
from scipy.optimize import minimize
import math
tickers_list=['GOOGL', 'AAPL', 'AMZN','TOT']
start_date=datetime.datetime(2010, 1, 1)
end_date=datetime.datetime(2011, 1, 1)
def get_prices(tickers_list, start_date, end_date):
prices = pd.DataFrame([web.DataReader(t,'yahoo', start_date, end_date).loc[:, 'Adj Close']
for t in tickers_list], index=tickers_list).T.asfreq('B').ffill()
return prices
def get_returns(prices):
returns = prices.pct_change()[1:]
return returns
prices = get_prices(tickers_list, start_date, end_date)
returns = get_returns(prices)
def portfolio_var_bis(weights, prices):
returns = prices.pct_change()[1:]
asset_returns = (weights* returns)
matcov=asset_returns.cov()
variance = np.dot(weights.T, np.dot(matcov, weights))
return variance
n = matcov.shape[0]
bounds = ((0.0, 1.0),)*n
cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1.0})
weights = minimize(portfolio_var_bis, init_weights,
'args= (prices), options={'disp': True ,'eps' : 1e+3, 'maxiter' : 100},
method ='SLSQP', constraints=cons, bounds = bounds)'
print("ptf is :", weights.x)