Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
Help with scipy.optimize error?

Hi - I am trying to run a minimum variance portfolio optimization and scipy.optimize.minimize keeps giving me a very generic error. Can anybody help me out? Debug shows it errors out when executing the minimize() function. This code runs perfectly offline when I replicate the price data (using Python 3.4 and scipy 0.14.0)

import datetime  
from pandas import Timestamp  
import numpy as np  
import pandas as pd  
import math  
from scipy.optimize import minimize

def initialize(context):  
    context.secs = [  
                    sid(8554),  
                    sid(21769),  
                    sid(14520),  
                    sid(24705),  
                    sid(26669),  
                    sid(33072),  
                    sid(23870),  
                    sid(23921),  
                    sid(28054),  
                    sid(26981)  
                   ]

    context.cov_lookback = 60

    set_commission(commission.PerTrade(cost=0.05))  
    schedule_function(  
        func=rebalance,  
        date_rule=date_rules.week_start(days_offset=1),  
        time_rule=time_rules.market_open(minutes=1)  
    )

def meanvaropt(x, cov_matrix):  
    scaling = 1/x.sum()  
    x = x * scaling  
    port_var_components = cov_matrix * x  
    port_var_components = port_var_components.transpose() * x  
    port_var = port_var_components.sum()  
    return port_var

def rebalance(context, data):  
    df = history(252, '1d', 'price').filter(items = context.secs)  
    securities_df = pd.DataFrame(data=np.ones(len(df.columns)),index=df.columns.values,columns=['weight'])

    # calculate covariance matrix for selected stocks  
    selected_returns = df.filter(items = securities_df.index).pct_change()[1:]  
    selected_returns_cov = selected_returns[len(selected_returns) - context.cov_lookback:].cov()  
    # solve minimum variance optimization for portfolio of selected securities  
    solution = minimize(meanvaropt,  
                        securities_df['weight'].values,  
                        args = [selected_returns_cov.as_matrix()],  
                        method = 'L-BFGS-B',  
                        bounds = [(0.,1.) for _ in range(len(securities_df['weight']))],  
                        options = {'disp':True}  
                        )  
    scaling = 1 / solution.x.sum()  
    securities_df['weight'] = solution.x * scaling

    for sec in securities_df.index:  
        order_target_percent(sec, securities_df['weight'][sec])  
def handle_data(context, data):  
    return  
2 responses

Hi Matt,

You might have a look at https://www.quantopian.com/posts/long-only-minimum-variance-portfolio-using-scipy-dot-optimize-dot-minimize. It appears you are trying to do something similar.

Grant

Thanks Grant - I ended up using the closed form solution. Still curious what was causing the error but speaking practically it's working now so who cares :)

Congrats on the contest win btw