2017-11-12 5 views
0

Ich versuche, die effiziente Grenze für ein Portfolio von 10 Aktien zu finden. Ich lade zuerst die Daten (Daten), die die wöchentlichen Renditen für 10 Aktien über 104 Perioden enthält. Dann randomisieren i Gewichte beliebige Portfolios zeichnen diesen Code verwenden:Markowitz Mittelwert Varianz Optimierung in Python mit scipy optimieren

def random_weights(n): 
    a = np.random.rand(n) 
    return a/a.sum() 

def initial_portfolio(data): 
    cov = data.cov() 
    expected_return = np.matrix(data.mean()) 
    weights = np.matrix(random_weights(expected_return.shape[1])) 

    mu = weights.dot(expected_return.T) 
    sigma = np.sqrt(weights.dot(cov.dot(weights.T))) 
    var = weights.dot(cov.dot(weights.T)) 

    return mu[0,0], sigma[0,0], var[0,0]#, cov, expected_return, weights 


def initial_portfolio_other(data): 
    cov = np.cov(data) 
    expected_return = np.matrix(data.mean()) 
    weights = np.matrix(random_weights(expected_return.shape[1])) 

    mu = weights.dot(expected_return.T) 
    sigma = np.sqrt(weights * cov.dot(weights.T)) 
    var = weights * cov.dot(weights.T) 

    return cov, expected_return, weights 

n_portfolios = 1000 

means, stds, var = np.column_stack([ 
     initial_portfolio(data) 
     for _ in range(n_portfolios) 
]) 



plt.xlabel('Standard deviation') 
plt.ylabel('Expected return') 
plt.scatter(stds, means) 
plt.axis([0.02, 0.035, 0.002,0.009]) 
plt.figure(figsize = (8,6)) 
plt.show() 

Bisher ist der Code funktioniert gut, die nächste i die effiziente Grenze finden will, indem Sie die Portfoliovarianz für 1000 wöchentliche Renditen zu minimieren. Dies ist der Code i bisher haben

def calc_var(w, c): 
    return np.dot(np.dot(w, c),w) 


def optimal_portfolio(returns): 

    n = len(returns.mean()) 
    returns = np.matrix(returns) 
    avg_returns = np.matrix(returns.mean()) 
    #min_mu = min(returns.mean()) 
    #max_mu = max(returns.mean()) 
    mus = np.random.uniform(0.001,0.03,1000) 

    S = np.cov(returns, rowvar = False) 
    pbar = np.matrix(returns.mean()) 

    var = lambda w: w.dot(S.dot(w.T)) 

    frontier_mean, frontier_var, frontier_weights = [], [], [] 

    for r in mus: 
     w = np.ones([n])/n 
     w_bound = [(0, 1) for i in range(n)] 
     w_constraint = ({'type': 'eq', 'fun': lambda w: sum(w) - 1.}) 

     optimal_w = scipy.optimize.minimize(var, w, method = 'SLSQP', constraints = w_constraint, bounds = w_bound) 
     frontier_mean.append(r) 
     frontier_var.append(calc_var(w, S)) 
     frontier_weights.append(optimal_w.x) 

    return frontier_mean, frontier_var, frontier_weights 

result = optimal_portfolio(data) 

die Ausgabe eine Liste von 1000 Varianzen ist, die alle identisch und natürlich 1000 Satz von Gewichten gibt, die alle identisch sind. Ich weiß, dass etwas fehlt, aber ich kann einfach nicht herausfinden, was es ist. Ich sehe immer wieder das Argument Argument in der Funktion Minimieren, das von anderen Leuten benutzt wird, aber ich habe wirklich keine Ahnung, wie oder was ich durchgehen soll. Wenn jemand Erfahrung in der Optimierung von Python hat, insbesondere in der Optimierung der mittleren Varianz, würde ich die Hilfe sehr schätzen.

+0

Sieht aus wie 'grand_var.append (calc_var (w, S))' führt immer die gleiche Berechnung. "w" ist ein Array von Einsen, und "S" ist die Kovarianzmatrix von "returns". Da es nicht von "mus" abhängig ist, erhalten Sie für jede Iteration in Ihrer Schleife das gleiche Ergebnis. –

Antwort

0

Es gibt zu wenige Einschränkungen. Die Optimierung sollte auch die Einschränkung enthalten, die den Portfoliorendius an r ausgleicht; so etwas wie diese:

w_constraint2 = ({'type': 'eq', 'fun': lambda w: np.dot(avg_returns,np.matrix(w).T) - r}) 

Aber für diese, würden Sie die Anweisung schreiben müssen avg_returns = np.matrix(returns.mean()), bevor Sie wieder in einer numpy Matrix konvertieren. Ansonsten, average_returns is a 1 x 1 matrix (instead of 1 x num_stocks)

+0

Und auch, sollten Sie optimal_w.x an Frontier_std anhängen. Sie fügen nur die Anfangsgewichte (w) in jede Schleife ein. – Ananya

Verwandte Themen