StatArb / StatBot / Execution / func_get_zscore.py
func_get_zscore.py
Raw
from config_ws_connect import subs_public
#from config_ws_connect import ws_public           # <- original code websocket method
from config_ws_connect import ws_public_get_orderbook   # <- new websocket method
from func_calcultions import get_trade_details
from func_price_calls import get_latest_klines
from func_stats import calculate_metrics
from exceptions import FailedRequestError, InvalidRequestError
from requests.exceptions import ConnectionError, Timeout, RequestException
from json.decoder import JSONDecodeError

# Get latest z-score
def get_latest_zscore():

    exception = True
    try:
        # Get latest asset orderbook prices and add dummy price for latest
        #orderbook_1 = ws_public.fetch(subs_public[0])          # <- original code websocket method
        orderbook_1 = ws_public_get_orderbook(subs_public[0])   # <- new websocket method
        mid_price_1, _, _, = get_trade_details(orderbook_1)
        #orderbook_2 = ws_public.fetch(subs_public[1])          # <- original code websocket method
        orderbook_2 = ws_public_get_orderbook(subs_public[1])   # <- new websocket method
        mid_price_2, _, _, = get_trade_details(orderbook_2)

        # print("\n")
        # print('-------------------------------------------------------------------')
        # print("Get Latest Zscore")
        # print(orderbook_1)
        # print(orderbook_2)
        # print('-------------------------------------------------------------------')
        # print("\n")

        # Get latest price history
        series_1, series_2, exception = get_latest_klines()
        if exception:
            return (0, False, exception)

        # Get z_score and confirm if hot
        if len(series_1) > 0 and len(series_2) > 0:

            # Replace last kline price with latest orderbook mid price
            series_1 = series_1[:-1]
            series_2 = series_2[:-1]
            series_1.append(mid_price_1)
            series_2.append(mid_price_2)

            # Get latest zscore
            _, zscore_list = calculate_metrics(series_1, series_2)
            zscore = zscore_list[-1]
            if zscore > 0:
                signal_sign_positive = True
            else:
                signal_sign_positive = False
            exception = False
            # Return output
            return (zscore, signal_sign_positive, exception)
    except (ConnectionError, Timeout, RequestException, JSONDecodeError, FailedRequestError, InvalidRequestError) as e:
        print(e)
    # Return output if not true
    return (0, False, exception)