scipy Minimum function SLSQP возвращает x0 - не работает - минимальная дисперсия оптимизации портфеля - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь найти оптимальные веса в портфеле, чтобы веса минимизировали дисперсию портфеля.

Для этого я использую функцию минимизации 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)
...