def pfOptimizer(longTickers, shortTickers, Coef, StockBeta, BETA_BOUND, WEIGHT_BOUND): longTickers["bWeight"] = 1 # binary weights shortTickers["bWeight"] = -1 pfTickers = ( pd.concat((shortTickers[["ticker"]], longTickers[["ticker"]]), axis=0).sort("ticker").reset_index(drop=True) ) # sens = Coef[['ticker', 'Mkt-RF', 'SMB', 'HML', 'UMD']].merge(pfTickers).rename(columns={'Mkt-RF': 'beta'}) # control = matrix([1, 0.2, 0.2, 0.5]) # scores = matrix(sens[['beta', 'SMB', 'HML', 'UMD']].as_matrix()) * control betas = Coef[["ticker", "Mkt-RF"]].merge(pfTickers).rename(columns={"Mkt-RF": "beta"}).reset_index(drop=True) mBeta = matrix(betas["beta"]) mCqaBeta = matrix(StockBeta.merge(pfTickers)["cqaBeta"]) longIndex = matrix(pfTickers.merge(longTickers, how="left").fillna(0)["bWeight"]) mLongIndex = np.diag(pfTickers.merge(longTickers, how="left").fillna(0)["bWeight"]) mLongIndex = matrix(mLongIndex[np.logical_or.reduce([np.sum(mLongIndex, 1) > 0.5])]).trans() # mLongIndex = matrix(np.diag(tickers.merge(longTickers, how='left').fillna(0)['bWeight'])) shortIndex = -matrix(pfTickers.merge(shortTickers, how="left").fillna(0)["bWeight"]) mShortIndex = -np.diag(pfTickers.merge(shortTickers, how="left").fillna(0)["bWeight"]) mShortIndex = matrix(mShortIndex[np.logical_or.reduce([np.sum(mShortIndex, 1) > 0.5])]).trans() # mShortIndex = matrix(np.diag(pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight'])) # wTickers = functions.iniWeights(pfTickers, shortTickers, longTickers) # initial weights wStart = matrix(functions.iniWeights(pfTickers, longTickers, shortTickers)["weight"]) N = pfTickers.shape[0] id = spmatrix(1.0, range(N), range(N)) wBounds = matrix(np.ones((N, 1)) * WEIGHT_BOUND) longBounds = matrix(np.zeros((shortTickers.shape[0], 1))) # longBounds = matrix(np.ones((shortTickers.shape[0], 1)) * 0.002) shortBounds = matrix(np.zeros((longTickers.shape[0], 1))) # shortBounds = matrix(np.ones((longTickers.shape[0], 1)) * (-0.005)) A = matrix( [ [mCqaBeta], [-mCqaBeta], [longIndex], [-longIndex], [shortIndex], [-shortIndex], [id], [-id], [-mLongIndex], [mShortIndex], ] ).trans() b = matrix([BETA_BOUND, BETA_BOUND, 1, -0.98, -0.98, 1, wBounds, wBounds, longBounds, shortBounds]) # A = matrix([ [longIndex], [-longIndex], # [shortIndex], [-shortIndex], # [id], [-id], # [-mLongIndex], [mShortIndex]]).trans() # b = matrix([ 1, -0.98, -0.98, 1, wBounds, wBounds, longBounds, shortBounds]) # scores = mBeta # sol = solvers.lp(-scores, A, b) sol = solvers.lp(-mBeta, A, b) w_res = sol["x"] wTickers = pfTickers wTickers["weight"] = w_res return wTickers
def pfOptimizer_sector(longTickers, shortTickers, Coef, StockBeta, industry_data, BETA_BOUND, WEIGHT_BOUND, SECTOR_WEIGHT): longTickers['bWeight'] = 1 # binary weights shortTickers['bWeight'] = -1 pfTickers = pd.concat((shortTickers[['ticker']], longTickers[['ticker']]), axis=0).sort('ticker').reset_index(drop=True) pfTickers = pfTickers.merge(industry_data[['ticker', 'sector']]) sector_list = pfTickers['sector'].unique() betas = Coef[['ticker', 'Mkt-RF']].merge(pfTickers).rename(columns={'Mkt-RF': 'beta'}).reset_index(drop=True) mBeta = matrix(betas['beta']) mCqaBeta = matrix(StockBeta.merge(pfTickers)['cqaBeta']) longIndex = matrix(pfTickers.merge(longTickers, how='left').fillna(0)['bWeight']) mLongIndex = np.diag(pfTickers.merge(longTickers, how='left').fillna(0)['bWeight']) mLongIndex = matrix(mLongIndex[np.logical_or.reduce([np.sum(mLongIndex,1) > 0.5])]).trans() # mLongIndex = matrix(np.diag(tickers.merge(longTickers, how='left').fillna(0)['bWeight'])) shortIndex = -matrix(pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight']) mShortIndex = -np.diag(pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight']) mShortIndex = matrix(mShortIndex[np.logical_or.reduce([np.sum(mShortIndex,1) > 0.5])]).trans() # mShortIndex = matrix(np.diag(pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight'])) sector_index = pfTickers[['ticker', 'sector']] for sector in sector_list: sector_index.loc[:,sector] = 0.0 sector_index.ix[sector_index['sector'] == sector, sector] = 1.0 mSector_index = matrix(sector_index.iloc[:, 2:].as_matrix()) # wTickers = functions.iniWeights(pfTickers, shortTickers, longTickers) # initial weights wStart = matrix(functions.iniWeights(pfTickers, longTickers, shortTickers)['weight']) N = pfTickers.shape[0] id = spmatrix(1.0, range(N), range(N)) wBounds = matrix(np.ones((N,1)) * WEIGHT_BOUND) longBounds = matrix(np.zeros((shortTickers.shape[0], 1))) # longBounds = matrix(np.ones((shortTickers.shape[0], 1)) * 0.002) shortBounds = matrix(np.zeros((longTickers.shape[0], 1))) # shortBounds = matrix(np.ones((longTickers.shape[0], 1)) * (-0.005)) A = matrix([[mSector_index], [-mSector_index], [mCqaBeta], [-mCqaBeta], [longIndex], [-longIndex], [shortIndex], [-shortIndex], [id], [-id], [-mLongIndex], [mShortIndex]]).trans() b = matrix([SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, BETA_BOUND, BETA_BOUND, 1, -0.98, -0.98, 1, wBounds, wBounds, longBounds, shortBounds]) sol = solvers.lp(-mBeta, A, b) w_res = sol['x'] print 'cqaBeta = %.4f' % np.float64(w_res.trans() * mCqaBeta)[0,0] print 'beta = %.4f' % np.float64(w_res.trans() * mBeta)[0,0] wTickers = pfTickers wTickers['weight'] = w_res return wTickers
def pfOptimizer(longTickers, shortTickers, Coef, StockBeta, BETA_BOUND, WEIGHT_BOUND): longTickers['bWeight'] = 1 # binary weights shortTickers['bWeight'] = -1 pfTickers = pd.concat((shortTickers[['ticker']], longTickers[['ticker']]), axis=0).sort('ticker').reset_index(drop=True) # sens = Coef[['ticker', 'Mkt-RF', 'SMB', 'HML', 'UMD']].merge(pfTickers).rename(columns={'Mkt-RF': 'beta'}) # control = matrix([1, 0.2, 0.2, 0.5]) # scores = matrix(sens[['beta', 'SMB', 'HML', 'UMD']].as_matrix()) * control betas = Coef[['ticker', 'Mkt-RF']].merge(pfTickers).rename(columns={ 'Mkt-RF': 'beta' }).reset_index(drop=True) mBeta = matrix(betas['beta']) mCqaBeta = matrix(StockBeta.merge(pfTickers)['cqaBeta']) longIndex = matrix( pfTickers.merge(longTickers, how='left').fillna(0)['bWeight']) mLongIndex = np.diag( pfTickers.merge(longTickers, how='left').fillna(0)['bWeight']) mLongIndex = matrix(mLongIndex[np.logical_or.reduce( [np.sum(mLongIndex, 1) > 0.5])]).trans() # mLongIndex = matrix(np.diag(tickers.merge(longTickers, how='left').fillna(0)['bWeight'])) shortIndex = -matrix( pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight']) mShortIndex = -np.diag( pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight']) mShortIndex = matrix(mShortIndex[np.logical_or.reduce( [np.sum(mShortIndex, 1) > 0.5])]).trans() # mShortIndex = matrix(np.diag(pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight'])) # wTickers = functions.iniWeights(pfTickers, shortTickers, longTickers) # initial weights wStart = matrix( functions.iniWeights(pfTickers, longTickers, shortTickers)['weight']) N = pfTickers.shape[0] id = spmatrix(1.0, range(N), range(N)) wBounds = matrix(np.ones((N, 1)) * WEIGHT_BOUND) longBounds = matrix(np.zeros((shortTickers.shape[0], 1))) # longBounds = matrix(np.ones((shortTickers.shape[0], 1)) * 0.002) shortBounds = matrix(np.zeros((longTickers.shape[0], 1))) # shortBounds = matrix(np.ones((longTickers.shape[0], 1)) * (-0.005)) A = matrix([[mCqaBeta], [-mCqaBeta], [longIndex], [-longIndex], [shortIndex], [-shortIndex], [id], [-id], [-mLongIndex], [mShortIndex]]).trans() b = matrix([ BETA_BOUND, BETA_BOUND, 1, -0.98, -0.98, 1, wBounds, wBounds, longBounds, shortBounds ]) # A = matrix([ [longIndex], [-longIndex], # [shortIndex], [-shortIndex], # [id], [-id], # [-mLongIndex], [mShortIndex]]).trans() # b = matrix([ 1, -0.98, -0.98, 1, wBounds, wBounds, longBounds, shortBounds]) # scores = mBeta # sol = solvers.lp(-scores, A, b) sol = solvers.lp(-mBeta, A, b) w_res = sol['x'] print 'cqaBeta = %.4f' % np.float64(w_res.trans() * mCqaBeta)[0, 0] print 'beta = %.4f' % np.float64(w_res.trans() * mBeta)[0, 0] wTickers = pfTickers wTickers['weight'] = w_res return wTickers
def pfOptimizer_sector(longTickers, shortTickers, Coef, StockBeta, industry_data, BETA_BOUND, WEIGHT_BOUND, SECTOR_WEIGHT): longTickers['bWeight'] = 1 # binary weights shortTickers['bWeight'] = -1 pfTickers = pd.concat((shortTickers[['ticker']], longTickers[['ticker']]), axis=0).sort('ticker').reset_index(drop=True) pfTickers = pfTickers.merge(industry_data[['ticker', 'sector']]) sector_list = pfTickers['sector'].unique() betas = Coef[['ticker', 'Mkt-RF']].merge(pfTickers).rename(columns={ 'Mkt-RF': 'beta' }).reset_index(drop=True) mBeta = matrix(betas['beta']) mCqaBeta = matrix(StockBeta.merge(pfTickers)['cqaBeta']) longIndex = matrix( pfTickers.merge(longTickers, how='left').fillna(0)['bWeight']) mLongIndex = np.diag( pfTickers.merge(longTickers, how='left').fillna(0)['bWeight']) mLongIndex = matrix(mLongIndex[np.logical_or.reduce( [np.sum(mLongIndex, 1) > 0.5])]).trans() # mLongIndex = matrix(np.diag(tickers.merge(longTickers, how='left').fillna(0)['bWeight'])) shortIndex = -matrix( pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight']) mShortIndex = -np.diag( pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight']) mShortIndex = matrix(mShortIndex[np.logical_or.reduce( [np.sum(mShortIndex, 1) > 0.5])]).trans() # mShortIndex = matrix(np.diag(pfTickers.merge(shortTickers, how='left').fillna(0)['bWeight'])) sector_index = pfTickers[['ticker', 'sector']] for sector in sector_list: sector_index.loc[:, sector] = 0.0 sector_index.ix[sector_index['sector'] == sector, sector] = 1.0 mSector_index = matrix(sector_index.iloc[:, 2:].as_matrix()) # wTickers = functions.iniWeights(pfTickers, shortTickers, longTickers) # initial weights wStart = matrix( functions.iniWeights(pfTickers, longTickers, shortTickers)['weight']) N = pfTickers.shape[0] id = spmatrix(1.0, range(N), range(N)) wBounds = matrix(np.ones((N, 1)) * WEIGHT_BOUND) longBounds = matrix(np.zeros((shortTickers.shape[0], 1))) # longBounds = matrix(np.ones((shortTickers.shape[0], 1)) * 0.002) shortBounds = matrix(np.zeros((longTickers.shape[0], 1))) # shortBounds = matrix(np.ones((longTickers.shape[0], 1)) * (-0.005)) A = matrix([[mSector_index], [-mSector_index], [mCqaBeta], [-mCqaBeta], [longIndex], [-longIndex], [shortIndex], [-shortIndex], [id], [-id], [-mLongIndex], [mShortIndex]]).trans() b = matrix([ SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, SECTOR_WEIGHT, BETA_BOUND, BETA_BOUND, 1, -0.98, -0.98, 1, wBounds, wBounds, longBounds, shortBounds ]) sol = solvers.lp(-mBeta, A, b) w_res = sol['x'] print 'cqaBeta = %.4f' % np.float64(w_res.trans() * mCqaBeta)[0, 0] print 'beta = %.4f' % np.float64(w_res.trans() * mBeta)[0, 0] wTickers = pfTickers wTickers['weight'] = w_res return wTickers