コード例 #1
0
ファイル: cal_pair_2.py プロジェクト: q40603/pairs_trade_nsd
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
コード例 #2
0
ファイル: cal_pair_2.py プロジェクト: q40603/pairs_trade_nsd
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)
コード例 #3
0
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
コード例 #4
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
コード例 #5
0
ファイル: Matrix_function.py プロジェクト: q40603/MOST-demo
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
コード例 #6
0
ファイル: Matrix_function.py プロジェクト: q40603/MOST-demo
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]