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
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))
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
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))