def spread_mean(stock1, stock2, i, table): if table.model_type.iloc[i] == 'model1': model = 'H2' elif table.model_type.iloc[i] == 'model2': model = 'H1*' elif table.model_type.iloc[i] == 'model3': model = 'H1' stock1 = stock1[i, :150] stock2 = stock2[i, :150] b1 = table.w1.iloc[i] b2 = table.w2.iloc[i] y = np.vstack([stock1, stock2]).T logy = np.log(y) # print(logy) lyc = logy.copy() p = order_select(logy, 5) #print('p:',p) _, _, para = para_vecm(logy, model, p) logy = np.mat(logy) y_1 = np.mat(logy[p:]) dy = np.mat(np.diff(logy, axis=0)) for j in range(len(stock1) - p - 1): if model == 'H1': if p != 1: delta = para[0] * para[1].T * y_1[j].T + para[2] * np.hstack( [dy[j:(j + p - 1)].flatten(), np.mat([1])]).T else: delta = para[0] * para[1].T * y_1[j].T + para[2] * np.mat([1]) elif model == 'H1*': if p != 1: delta = para[0] * para[1].T * np.hstack([ y_1[j], np.mat([1]) ]).T + para[2] * dy[j:(j + p - 1)].flatten().T else: delta = para[0] * para[1].T * np.hstack([y_1[j], np.mat([1])]).T elif model == 'H2': if p != 1: delta = para[0] * para[1].T * y_1[j].T + para[2] * dy[j:( j + p - 1)].flatten().T else: delta = para[0] * para[1].T * y_1[j].T else: print('Errrrror') break dy[j + p, :] = delta.T y_1[j + 1] = y_1[j] + delta.T b = np.mat([[b1], [b2]]) spread = b.T * lyc[p:].T spread_m = np.array(b.T * y_1.T).flatten() return spread_m, spread
def get_Estd(stock1, stock2, i, table, dy=True, D=16): if table.model_type.iloc[i] == 'model1': model = 'H2' elif table.model_type.iloc[i] == 'model2': model = 'H1*' elif table.model_type.iloc[i] == 'model3': model = 'H1' stock1 = stock1[i, :150] stock2 = stock2[i, :150] b1 = table.w1.iloc[i] b2 = table.w2.iloc[i] b = np.mat([[b1], [b2]]) y = np.vstack([stock1, stock2]).T logy = np.log(y) #np.log(y) p = order_select(logy, 5) u, A, _ = para_vecm(logy, model, p) constant = np.mat(A[:, 0]) A = A[:, 1:] l = A.shape[1] extend = np.hstack([np.identity(l - 2), np.zeros([l - 2, 2])]) newA = np.vstack([A, extend]) if not dy: lagy = logy[p - 1:-1, :] for i in range(1, p): lagy = np.hstack([lagy, logy[p - 1 - i:-i - 1, :]]) MatrixA = np.mat(A) MatrixLagy = np.mat(lagy) Estimate_logy = MatrixA * MatrixLagy.T + constant e = logy[p:, :].T - Estimate_logy var = e * e.T / e.shape[1] else: var = u * u.T / u.shape[1] NowCoef = np.mat(np.eye(len(newA))) Evar = var.copy() for i in range(149): NowCoef = newA * NowCoef Evar = Evar + NowCoef[:2, :2] * var * NowCoef[:2, :2].T Evar = b.T * Evar * b return np.sqrt(Evar)
def JB_VECM(stock1, stock2, model, p): #eng = matlab.engine.start_matlab() #i = 0 #j = 2 #stock1 = day1_1.iloc[:,i] #stock2 = day1_1.iloc[:,j] #stock1_name = day1.columns.values[i] #stock2_name = day1.columns.values[j] if model == 'model1': model_name = 'H2' elif model == 'model2': model_name = 'H1*' else: model_name = 'H1' z = (np.vstack([stock1, stock2]).T) k = len(z.T) z = np.log(z) #p = order_select(z,5) ut = para_vecm(z, model_name, p)[0] ut_cov = np.dot(ut, ut.T) / len(ut.T) #ut = eng.res_jci( matlab.double(z.tolist()) , model , (p-1) , 1 ) #ut_cov = eng.cov_jci( matlab.double(z.tolist()) , model , (p-1) , 1 ) L = np.linalg.cholesky(ut_cov) w = pd.DataFrame(np.dot(np.linalg.inv(L), np.array(ut))).T b1 = w.apply(lambda x: np.mean(x**3), axis=1) b2 = w.apply(lambda x: np.mean(x**4), axis=1) lambda_s = np.dot(b1, b1.T) * len(w) / 6 lambda_k = np.dot(b2 - 3, (b2 - 3).T) * len(w) / 24 lambda_sk = lambda_s + lambda_k #print(lambda_sk) #eng.quit() if lambda_sk > float(chi2.ppf(0.95, 2 * k)): return 1 # 拒絕虛無假設,表示殘差不是常態 else: return 0
def fore_chow(stock1, stock2, stock1_trade, stock2_trade, model): #eng = matlab.engine.start_matlab() #stock1 = day1_1.iloc[:,0] #stock2 = day1_1.iloc[:,2] #stock1_trade = day1.iloc[0:210,0] #stock2_trade = day1.iloc[0:210,2] #model_name = 'H1' if model == 'model1': model_name = 'H2' elif model == 'model2': model_name = 'H1*' else: model_name = 'H1' y = (np.vstack([stock1, stock2]).T) day1 = (np.vstack([stock1_trade, stock2_trade]).T) k = len(y.T) # 幾檔股票 n = len(y) # formation period 資料長度 y = np.log(y) day1 = np.log(day1) h = len(day1) - n p = order_select(y, 5) # 計算最佳落後期數 #ut , A = VAR_model(y , p) # 計算VAR殘差共變異數與參數 at, A = para_vecm(y, model_name, p) ut = np.dot(at, at.T) / len(at.T) #A = pd.DataFrame(A) A = A.T phi_0 = np.eye(k) A1 = np.delete(A, 0, axis=0).T phi = np.hstack((np.zeros([k, 2 * (p - 1)]), phi_0)) sigma_t = np.dot(np.dot(phi_0, ut), phi_0.T) # sigma hat ut_h = [] for i in range(1, h + 1): lag_mat = day1[len(day1) - i - p - 1:len(day1) - i, :] lag_mat = np.array(lag_mat[::-1]) if p == 1: ut_h.append(lag_mat[0].T - (A[0].T + np.dot(A[1:k * p + 1].T, lag_mat[1:2].T)).T) else: ut_h.append(lag_mat[0].T - (A[0].T + np.dot( A[1:k * p + 1].T, lag_mat[1:k * p - 1].reshape([k * p, 1]))).T) for i in range(h - 1): a = phi[:, i * 2:len(phi.T)] phi_i = np.dot(A1, a.T) sigma_t = sigma_t + np.dot(np.dot(phi_i, ut), phi_i.T) phi = np.hstack((phi, phi_i)) phi = phi[:, ((p - 1) * k):len(phi.T)] ut_h = np.array(ut_h).reshape([1, h * 2]) e_t = np.dot(phi, ut_h.T) # 程式防呆,如果 sigma_t inverse 發散,則回傳有結構性斷裂。 try: tau_h = np.dot(np.dot(e_t.T, np.linalg.inv(sigma_t)), e_t) / k except: return 1 else: if tau_h > float(f.ppf( 0.99, k, n - k * p + 1)): #tau_h > float(chi2.ppf(0.99,k)): return 1 # 有結構性斷裂 else: return 0
def fore_chow(stock1, stock2, model, Flen, give=False, p=0, A=0, ut=0, maxp=5): #Flen:formation length if model == 1: model_name = 'H2' elif model == 2: model_name = 'H1*' else: model_name = 'H1' day1 = (np.vstack([stock1, stock2]).T) day1 = np.log(day1) h = len(day1) - Flen k = 2 # 幾檔股票 n = Flen # formation period 資料長度 if give == False: y = (np.vstack([stock1[0:Flen], stock2[0:Flen]]).T) y = np.log(y) p = order_select(y, maxp) at, A, _ = para_vecm(y, model_name, p) # at , A = para_vecm(y,model_name,p) ut = np.dot(at, at.T) / len(at.T) #sigma_u Remain_A = A.copy() Remain_ut = ut.copy() Remain_p = p #LUKE pg184 A = A.T phi_0 = np.eye(k) A1 = np.delete(A, 0, axis=0).T phi = np.hstack((np.zeros([k, 2 * (p - 1)]), phi_0)) sigma_t = np.dot(np.dot(phi_0, ut), phi_0.T) # sigma hat ut_h = [] for i in range(1, h + 1): lag_mat = day1[len(day1) - i - p - 1:len(day1) - i, :] lag_mat = np.array(lag_mat[::-1]) if p == 1: ut_h.append(lag_mat[0].T - (A[0].T + np.dot(A[1:k * p + 1].T, lag_mat[1:2].T)).T) else: ut_h.append(lag_mat[0].T - (A[0].T + np.dot( A[1:k * p + 1].T, lag_mat[1:k * p - 1].reshape([k * p, 1]))).T) for i in range(h - 1): a = phi[:, i * 2:len(phi.T)] phi_i = np.dot(A1, a.T) sigma_t = sigma_t + np.dot(np.dot(phi_i, ut), phi_i.T) phi = np.hstack((phi, phi_i)) phi = phi[:, ((p - 1) * k):len(phi.T)] ut_h = np.array(ut_h).reshape([1, h * 2]) e_t = np.dot(phi, ut_h.T) # 程式防呆,如果 sigma_t inverse 發散,則回傳有結構性斷裂。 try: tau_h = np.dot(np.dot(e_t.T, np.linalg.inv(sigma_t)), e_t) / k except: return Remain_p, Remain_A, Remain_ut, 1 else: if tau_h > float(f.ppf( 0.99, k, n - k * p + 1)): #tau_h > float(chi2.ppf(0.99,k)): return Remain_p, Remain_A, Remain_ut, 1 # 有結構性斷裂 else: return Remain_p, Remain_A, Remain_ut, 0
def spread_mean(output, i, model, D, ini=0, future=True, order=False): ''' if model == 'model1': model = 'H2' elif model == 'model2': model = 'H1*' elif model == 'model3': model = 'H1' ''' if model == 1: model = 'H2' elif model == 2: model = 'H1*' elif model == 3: model = 'H1' stock1 = output[2 * i, 8:158] stock2 = output[(2 * i + 1), 8:158] b1 = output[2 * i, 3] b2 = output[(2 * i + 1), 3] spread = output[2 * i, 3] * np.log(output[2 * i, 8:(274 - D)]) + output[ (2 * i + 1), 3] * np.log(output[(2 * i + 1), 8:(274 - D)]) y = np.vstack([stock1, stock2]).T logy = np.log(y) p = order_select(logy, 5) #print('p:',p) _, _, para = para_vecm(logy, model, p) logy = np.mat(logy) y_1 = np.mat(logy[p + ini:]) dy = np.mat(np.diff(logy, axis=0)[ini:, :]) for j in range(len(stock1) - p - 1 - ini): if model == 'H1': #MODEL3 if p != 1: delta = para[0] * para[1].T * y_1[j].T + para[2] * np.hstack( [dy[j:(j + p - 1)].flatten(), np.mat([1])]).T else: delta = para[0] * para[1].T * y_1[j].T + para[2] * np.mat([1]) elif model == 'H1*': #MODEL2 if p != 1: delta = para[0] * para[1].T * np.hstack([ y_1[j], np.mat([1]) ]).T + para[2] * dy[j:(j + p - 1)].flatten().T else: delta = para[0] * para[1].T * np.hstack([y_1[j], np.mat([1])]).T elif model == 'H2': #MODEL1 if p != 1: delta = para[0] * para[1].T * y_1[j].T + para[2] * dy[j:( j + p - 1)].flatten().T else: delta = para[0] * para[1].T * y_1[j].T else: print('Errrrror') break dy[j + p, :] = delta.T y_1[j + 1] = y_1[j] + delta.T b = np.mat([[b1], [b2]]) spread_m = np.array(b.T * y_1.T).flatten() if future: if order: return spread_m, spread[p + ini:], p else: return spread_m, spread[p + ini:] else: if order: return spread_m, spread[p + ini:150], p else: return spread_m, spread[p + ini:150]