def getFrontier(na_data): """Function gets a 100 sample point frontier for given returns""" # Special Case with fTarget=None, just returns average rets. (na_avgrets, na_std, b_error) = tsu.OptPort(na_data, None) # Declaring bounds on the optimized portfolio na_lower = np.zeros(na_data.shape[1]) na_upper = np.ones(na_data.shape[1]) # Getting the range of possible returns with these bounds (f_min, f_max) = tsu.getRetRange(na_data, na_lower, na_upper, na_avgrets, s_type="long") # Getting the step size and list of returns to optimize for. f_step = (f_max - f_min) / 100.0 lf_returns = [f_min + x * f_step for x in range(101)] # Declaring empty lists lf_std = [] lna_portfolios = [] # Calling the optimization for all returns for f_target in lf_returns: (na_weights, f_std, b_error) = tsu.OptPort(na_data, f_target, na_lower, na_upper, s_type="long") lf_std.append(f_std) lna_portfolios.append(na_weights) return (lf_returns, lf_std, lna_portfolios, na_avgrets, na_std)
def getFrontier(naData): ''' Special case for fTarget = None, just get average returns ''' (naAvgRets, naStd, b_error) = tsu.OptPort(naData, None) naLower = np.zeros(naData.shape[1]) naUpper = np.ones(naData.shape[1]) (fMin, fMax) = tsu.getRetRange(naData, naLower, naUpper, naAvgRets, s_type="long") fStep = (fMax - fMin) / 100.0 lfReturn = [fMin + x * fStep for x in range(101)] lfStd = [] lnaPortfolios = [] ''' Call the function 100 times for the given range ''' for fTarget in lfReturn: (naWeights, fStd, b_error) = tsu.OptPort(naData, fTarget, naLower, naUpper, s_type="long") #if b_error == False: lfStd.append(fStd) lnaPortfolios.append(naWeights) #lfReturn.pop(lfReturn.index(fTarget)) return (lfReturn, lfStd, lnaPortfolios, naAvgRets, naStd)
def getFrontier(naData): ''' Special case for fTarget = None, just get average returns ''' (naAvgRets,naStd, b_error) = tsu.OptPort( naData, None ) naLower = np.zeros(naData.shape[1]) naUpper = np.ones(naData.shape[1]) (fMin, fMax) = tsu.getRetRange( naData, naLower, naUpper, naAvgRets, s_type="long") '''Modification- squeeze fMin/fMax to avoid infeasability on the upper and lower limits. These usually manifest with a CVXOPT error, and QSTK responds by telling you the KKT matrix is singular By avoiding the absolute edges you can eliminate this error''' reduce_amount = 0.0001 fMin += reduce_amount fMax -= reduce_amount '''End Modification''' fStep = (fMax - fMin) / 100.0 lfReturn = [fMin + x * fStep for x in range(101)] lfStd = [] lnaPortfolios = [] ''' Call the function 100 times for the given range ''' for fTarget in lfReturn: (naWeights, fStd, b_error) = tsu.OptPort( naData, fTarget, naLower, naUpper, s_type = "long") #if b_error == False: lfStd.append(fStd) lnaPortfolios.append( naWeights ) #lfReturn.pop(lfReturn.index(fTarget)) return (lfReturn, lfStd, lnaPortfolios, naAvgRets, naStd)
def getFrontier(naData): ''' Special case for fTarget = None, just get average returns ''' (naAvgRets,naStd, b_error) = tsu.OptPort( naData, None ) naLower = np.zeros(naData.shape[1]) naUpper = np.ones(naData.shape[1]) (fMin, fMax) = tsu.getRetRange( naData, naLower, naUpper, naAvgRets, s_type="long") fStep = (fMax - fMin) / 100.0 lfReturn = [fMin + x * fStep for x in range(101)] lfStd = [] lnaPortfolios = [] ''' Call the function 100 times for the given range ''' for fTarget in lfReturn: (naWeights, fStd, b_error) = tsu.OptPort( naData, fTarget, naLower, naUpper, s_type = "long") #if b_error == False: lfStd.append(fStd) lnaPortfolios.append( naWeights ) #lfReturn.pop(lfReturn.index(fTarget)) return (lfReturn, lfStd, lnaPortfolios, naAvgRets, naStd)