Beispiel #1
0
def _get_leveraged_factor_score(x):
    _d_bt_bs, _d_bt_fr, _d_bt_sig, _d_comb = x
    _d_bt_bs_dt = _d_bt_bs.listdir()

    sig_wgt = _d_comb.load('Signal_Weights')

    for j, i in enumerate(_d_bt_bs_dt):
        xi_all = _d_bt_bs.load(i)
        xi = np.ascontiguousarray(xi_all['arr_0']).astype('float64')
        si1_ = np.vstack(xi_all['arr_1'])/vt
        si2_ = np.vstack(xi_all['arr_2'])/vt
        ci = xi_all['arr_4'].astype('float64')
        tci = xi_all['arr_5']
        del xi_all

        # curve-fitted (2-std)
        si1 = np.multiply(si1_, _empirical_std_lr[:, np.newaxis])
        si2 = np.multiply(si2_, _empirical_std_qr[:, np.newaxis])
        si = np.vstack((si1, si2))
        si = si*np.exp(0.5-0.5*(si**2)/4)/2

        n = xi.shape[1]
        ei = np.ones(n)

        # get the risk budgets
        bi = xi[19, :]
        bi = bi/np.sum(bi)
        lmb0 = np.median(bi/np.dot(ci, ei))

        si1_1 = lmb0*np.dot(si, crts.neut_corr_mat(ci, xi[2:14, :]))
        si1_1 = np.dot(sig_wgt, si1_1)/bi   # change this
        _d_bt_sig.save(i, tci, si1_1)
    return None
Beispiel #2
0
def _refresh_fast_backtest(x):
    _d_bt_bs, _d_bt_fr, _d_comb, _d_flag = x
    _d_bt_bs_dt = _d_bt_bs.listdir()
    _d_bt_bs_dt = _d_bt_bs_dt[:-2]

    ndt = len(_d_bt_bs_dt)
    nsig = 100

    ri1_1 = np.zeros([ndt, nsig])
    # hi1_1 = np.zeros([ndt, nsig])

    for j, i in enumerate(_d_bt_bs_dt):
        # j = 0
        # i = _d_bt_bs_dt[0]
        xi_all = _d_bt_bs.load(i)
        xi = np.ascontiguousarray(xi_all["arr_0"]).astype("float64")
        si1_ = np.vstack(xi_all["arr_1"]) / vt
        si2_ = np.vstack(xi_all["arr_2"]) / vt
        ci = xi_all["arr_4"].astype("float64")
        tci = xi_all["arr_4"]
        del xi_all

        # curve-fitted (2-std)
        si1 = np.multiply(si1_, _empirical_std_lr[:, np.newaxis])
        si2 = np.multiply(si2_, _empirical_std_qr[:, np.newaxis])
        si = np.vstack((si1, si2))
        si = si * np.exp(0.5 - 0.5 * (si ** 2) / 4) / 2

        n = xi.shape[1]
        ei = np.ones(n)

        yi = _d_bt_fr.load(i)
        yi[np.isnan(yi)] = 0

        # get the risk budgets
        bi = xi[19, :]
        bi = bi / np.sum(bi)
        lmb0 = np.median(bi / np.dot(ci, ei))

        flev = xi[0, :]

        si1_1 = lmb0 * np.dot(si, crts.neut_corr_mat(ci, xi[2:14, :])) * 10

        ri1_1[j, :] = np.dot(si1_1, yi)
        # hi1_1[j, :] = np.dot(abs(si1_1), flev)

    # combining them by mean-variance
    ri1_1_mn = np.mean(ri1_1, axis=0) * 256
    ri1_1_sd = np.std(ri1_1, axis=0) * 16
    ri1_1_corr = np.corrcoef(ri1_1.T) + np.identity(nsig)
    ri1_1_cov = np.dot(np.diag(ri1_1_sd), np.dot(ri1_1_corr, np.diag(ri1_1_sd)))
    ri1_1_cov = np.dot(np.linalg.inv(ri1_1_cov), ri1_1_mn)
    wgt1_1_ = ri1_1_cov / np.sum(ri1_1_cov)
    _d_comb.save("Signal_Weights", wgt1_1_)
    # check results
    ri1_1_g = np.dot(ri1_1, wgt1_1_)
    print("Results for Cluster # % i" % _d_flag)
    print(16 * np.mean(ri1_1, axis=0) / np.std(ri1_1, axis=0))
    print(wgt1_1_)
    print(16 * np.mean(ri1_1_g) / np.std(ri1_1_g))
Beispiel #3
0
def _generate_tradelist2(x, prm=4, eiflag=False):
    _d_bt_sig, _d_tl_id, _d_comb = x

    ret = _d_comb.retrieve('Returns')
    lev = _d_comb.retrieve('Lev_CC_120D')
    vol = _d_comb.retrieve('Vol_CC_120D')
    eq03 = _d_comb.retrieve('EQIDX_Beta_3m')
    eq06 = _d_comb.retrieve('EQIDX_Beta_6m')
    eq09 = _d_comb.retrieve('EQIDX_Beta_9m')
    eq12 = _d_comb.retrieve('EQIDX_Beta_12m')

    sp03 = _d_comb.retrieve('SP_Beta_3m')
    sp06 = _d_comb.retrieve('SP_Beta_6m')
    sp09 = _d_comb.retrieve('SP_Beta_9m')
    sp12 = _d_comb.retrieve('SP_Beta_12m')

    mom03 = _d_comb.retrieve('MOM_Beta_3m')
    mom06 = _d_comb.retrieve('MOM_Beta_6m')
    mom09 = _d_comb.retrieve('MOM_Beta_9m')
    mom12 = _d_comb.retrieve('MOM_Beta_12m')

    f_list = _d_bt_sig.listdir()
    p_dt = crup.pd_dt_to_str(lev['Date', list])
    p_dt_idx = [i for i, j in enumerate(p_dt) if j in f_list]
    # ret = ret[p_dt_idx, :]
    lev = lev[p_dt_idx, :]
    vol = vol[p_dt_idx, :]

    eq03 = eq03[p_dt_idx, :]
    eq06 = eq06[p_dt_idx, :]
    eq09 = eq09[p_dt_idx, :]
    eq12 = eq12[p_dt_idx, :]

    sp03 = sp03[p_dt_idx, :]
    sp06 = sp06[p_dt_idx, :]
    sp09 = sp09[p_dt_idx, :]
    sp12 = sp12[p_dt_idx, :]

    mom03 = mom03[p_dt_idx, :]
    mom06 = mom06[p_dt_idx, :]
    mom09 = mom09[p_dt_idx, :]
    mom12 = mom12[p_dt_idx, :]

    tc = lev.tick_cols()
    window = 200

    n = len(f_list)
    ret_coll = np.zeros(n-2)*np.nan

    for i, j in enumerate(f_list):
        # i = 0
        # j = f_list[0]
        # read the return estimates
        ret_est = _d_bt_sig.load(j)
        reti = ret_est['arr_1']
        tci = list(ret_est['arr_0'])
        tci_idx = [ii for ii, jj in enumerate(tci) if jj in tc]
        levi = lev[i, tci].values.astype('float64')
        reti_un = (reti/levi)/1000
        voli = vol[i, tci].values.astype('float64')

        eq03i = eq03[i, tci].values.astype('float64')
        eq06i = eq06[i, tci].values.astype('float64')
        eq09i = eq09[i, tci].values.astype('float64')
        eq12i = eq12[i, tci].values.astype('float64')

        sp03i = sp03[i, tci].values.astype('float64')
        sp06i = sp06[i, tci].values.astype('float64')
        sp09i = sp09[i, tci].values.astype('float64')
        sp12i = sp12[i, tci].values.astype('float64')

        mom03i = mom03[i, tci].values.astype('float64')
        mom06i = mom06[i, tci].values.astype('float64')
        mom09i = mom09[i, tci].values.astype('float64')
        mom12i = mom12[i, tci].values.astype('float64')

        ret_mini = ret[p_dt_idx[i]-window+1:p_dt_idx[i], tci].values.astype('float64')
        ret_mini[np.isnan(ret_mini)] = 0  # hygiene

        nn = len(tci)
        ei = np.ones(nn)
        cori = (np.corrcoef(ret_mini.T)+prm*np.identity(nn))/(1+prm)
        dvoli = 16*np.diag(voli)
        covi = np.linalg.inv(np.dot(dvoli, np.dot(cori, dvoli)))

        if not eiflag:
            mat_a = np.vstack((eq03i, eq06i, eq09i, eq12i,  # ei
                               sp03i, sp06i, sp09i, sp12i,
                               mom03i, mom06i, mom09i, mom12i))
        else:
            mat_a = np.vstack((ei, eq03i, eq06i, eq09i, eq12i,  # ei
                               sp03i, sp06i, sp09i, sp12i,
                               mom03i, mom06i, mom09i, mom12i))

        wgt_a = 1.5*np.dot(crts.neut_corr_mat(covi, mat_a), reti_un)
        wgt_a_sm = np.maximum(np.sum(wgt_a[wgt_a > 0]), -np.sum(wgt_a[wgt_a < 0]))
        # wgt_a_sm = np.sum(np.abs(wgt_a))
        if wgt_a_sm > 4:
            wgt_a = wgt_a*4/wgt_a_sm
        if wgt_a_sm < 0.5:
            wgt_a = wgt_a*0.5/wgt_a_sm
        _d_tl_id.save(j, tci, wgt_a)
        if i < n-2:
            reti = ret[p_dt_idx[i+2], tci].values.astype('float64')
            ret_coll[i] = np.sum(wgt_a*reti)
            # print(j, np.array([np.sum(np.abs(wgt_a)), np.max(wgt_a), np.min(wgt_a), ret_coll[i]]))
        else:
            pass
            # print(j, np.array([np.sum(np.abs(wgt_a)), np.max(wgt_a), np.min(wgt_a)]))

    # print(16*np.mean(ret_coll)/np.std(ret_coll))
    # ret_coll.shape
    f_list = f_list[:-2]
    f_list_ = crup.str_to_pd_dt(f_list)
    ret_coll = cruf.DataFrame({'Date': f_list_, 'Returns': ret_coll})
    _d_comb.store('Signal_Returns', ret_coll)

    # return ret_coll
    return None
Beispiel #4
0
def _generate_tradelist(x):
    _d_bt_sig, _d_tl_id, _d_comb = x

    ret = _d_comb.retrieve('Returns')
    lev = _d_comb.retrieve('Lev_CC_120D')
    vol = _d_comb.retrieve('Vol_CC_120D')
    eq03 = _d_comb.retrieve('EQIDX_Beta_3m')
    eq06 = _d_comb.retrieve('EQIDX_Beta_6m')
    eq09 = _d_comb.retrieve('EQIDX_Beta_9m')
    eq12 = _d_comb.retrieve('EQIDX_Beta_12m')

    sp03 = _d_comb.retrieve('SP_Beta_3m')
    sp06 = _d_comb.retrieve('SP_Beta_6m')
    sp09 = _d_comb.retrieve('SP_Beta_9m')
    sp12 = _d_comb.retrieve('SP_Beta_12m')

    mom03 = _d_comb.retrieve('MOM_Beta_3m')
    mom06 = _d_comb.retrieve('MOM_Beta_6m')
    mom09 = _d_comb.retrieve('MOM_Beta_9m')
    mom12 = _d_comb.retrieve('MOM_Beta_12m')

    f_list = _d_bt_sig.listdir()
    p_dt = crup.pd_dt_to_str(lev['Date', list])
    p_dt_idx = [i for i, j in enumerate(p_dt) if j in f_list]
    # ret = ret[p_dt_idx, :]
    lev = lev[p_dt_idx, :]
    vol = vol[p_dt_idx, :]

    eq03 = eq03[p_dt_idx, :]
    eq06 = eq06[p_dt_idx, :]
    eq09 = eq09[p_dt_idx, :]
    eq12 = eq12[p_dt_idx, :]

    sp03 = sp03[p_dt_idx, :]
    sp06 = sp06[p_dt_idx, :]
    sp09 = sp09[p_dt_idx, :]
    sp12 = sp12[p_dt_idx, :]

    mom03 = mom03[p_dt_idx, :]
    mom06 = mom06[p_dt_idx, :]
    mom09 = mom09[p_dt_idx, :]
    mom12 = mom12[p_dt_idx, :]

    tc = lev.tick_cols()
    window = 200

    n = len(f_list)
    ret_coll = np.zeros(n-2)*np.nan

    for i, j in enumerate(f_list):
        # i = 0
        # j = f_list[0]
        # read the return estimates
        ret_est = _d_bt_sig.load(j)
        reti = ret_est['arr_1']
        tci = list(ret_est['arr_0'])
        tci_idx = [ii for ii, jj in enumerate(tci) if jj in tc]
        levi = lev[i, tci].values.astype('float64')
        reti_un = (reti/levi)/1000
        voli = vol[i, tci].values.astype('float64')

        eq03i = eq03[i, tci].values.astype('float64')
        eq06i = eq06[i, tci].values.astype('float64')
        eq09i = eq09[i, tci].values.astype('float64')
        eq12i = eq12[i, tci].values.astype('float64')

        sp03i = sp03[i, tci].values.astype('float64')
        sp06i = sp06[i, tci].values.astype('float64')
        sp09i = sp09[i, tci].values.astype('float64')
        sp12i = sp12[i, tci].values.astype('float64')

        mom03i = mom03[i, tci].values.astype('float64')
        mom06i = mom06[i, tci].values.astype('float64')
        mom09i = mom09[i, tci].values.astype('float64')
        mom12i = mom12[i, tci].values.astype('float64')

        ret_mini = ret[p_dt_idx[i]-window+1:p_dt_idx[i], tci].values.astype('float64')
        ret_mini[np.isnan(ret_mini)] = 0  # hygiene

        nn = len(tci)
        ei = np.ones(nn)
        cori = (np.corrcoef(ret_mini.T)+2*np.identity(nn))/3
        dvoli = 16*np.diag(voli)
        covi = np.linalg.inv(np.dot(dvoli, np.dot(cori, dvoli)))

        mat_a = np.vstack((ei, eq03i, eq06i, eq09i, eq12i,
                           sp03i, sp06i, sp09i, sp12i,
                           mom03i, mom06i, mom09i, mom12i))

        wgt_a = 1.5*np.dot(crts.neut_corr_mat(covi, mat_a), reti_un)
        wgt_a_sm = np.sum(np.abs(wgt_a))
        if wgt_a_sm > 8:
            wgt_a = wgt_a*8/wgt_a_sm
        if wgt_a_sm < 1:
            wgt_a = wgt_a/wgt_a_sm
        if i < n-2:
            reti = ret[p_dt_idx[i+2], tci].values.astype('float64')
            ret_coll[i] = np.sum(wgt_a*reti)
            print(j, np.array([np.sum(np.abs(wgt_a)), np.max(wgt_a), np.min(wgt_a), ret_coll[i]]))
        else:
            print(j, np.array([np.sum(np.abs(wgt_a)), np.max(wgt_a), np.min(wgt_a)]))

    print(16*np.mean(ret_coll)/np.std(ret_coll))