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
示例#3
0
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