Information Bar Sampling

이전의 예를 다시 한 번 살펴보자. 개장 직후 한시간과 장마감 전 30분간 시장에서 거래가 빈번하게 발생하는데, 이때 관측되는 정보의 양은 점심 시간대의 거래에서 포착되는 정보의 양보다 많을 것이다. 여기서 '정보'의 의미는 시장 미시구조 측면에서 사용되는 말이며, 효율적 시장 가설이 깨지는 bid-ask 가격 간의 불균형한 상황에서 비롯된 정보를 의미한다.

증권 시장 내에서 매매자의 유형을 정보를 가지지 않는 일반 거래자와 정보를 가진 정보 기반 거래자의 유형으로 나뉘어 있다고 가정해 보자. 정보를 가지지 않는 일반 거래자만이 거래를 한다면, bid-ask 가격 간의 차이가 있을지언정 그 중간 가격인 mid-price는 크게 변동을 하지 않을 것이다.

중간 가격이 크게 변동하지 않은 상황에서 정보 기반 거래자가 개입을 하게 된다면 bid-ask spread는 벌어지게 되고, 시장의 균형은 무너지며 중간 가격이 크게 변동을 하게 될 것이다. 표본 추출을 이러한 정보 기반 거래자의 개입과 연동시키면 가격이 새로운 균형 상태에 이르기 전에 투자 의사결정을 내릴 수 있게 될 것이다.

Tick Imbalance Bar

틱의 sequence {(pt,vt)}t=1,,T\{(p_t, v_t)\}_{t = 1, \dots, T}가 있다고 가정해 보자. 여기서 ptp_t는 tick tt에 연계된 가격이고, vtv_t는 tick tt에서의 거래량이다. 이 상황에서 Tick Rule은 다음을 만족하는 sequence {bt}t=1,,T\{b_t\}_{t = 1, \dots, T}를 정의한다.

bt={bt1,if  Δpt=0Δptpt,if  Δpt0b_t= \begin{cases} b_{t-1}, & \mathrm{if \space\space }\Delta p_t = 0 \\ \frac{|\Delta p_t|}{p_t}, & \mathrm{if \space\space }\Delta p_t \neq 0 \end{cases}

여기서 bt{1,1}b_t \in \{-1, 1\}이고 경계 조건 b0b_0은 바로 직전 바에서의 끝단값 bTb_T와 일치하도록 설정한다. Tick imbalance bar의 기본 아이디어는 틱 불균형이 예상을 초과할 때마다 샘플링을 한다는 것이다. 정보 기반 거래자가 개입한 경우 불균형 수준의 기대값을 벗어날 것이기 때문이다.

다음으로 중요한 작업은 바로 틱의 누적값이 주어진 임계값을 넘는 틱 인덱스 TT를 찾는 것이다. 우선, 시간 TT에서의 tick imbalance에 대해 다음과 같이 정의한다.

θT=t=1Tbt\theta_T = \sum_{t=1}^T {b_t}

둘째, 바의 시작점에서의 기대값 θT\theta_T를 다음과 같이 계산한다.

E0[θT]=E0[T](P[bt=1]P[bt=1])E_0 [\theta_T] = E_0[T](P[b_t = 1] - P[b_t = -1])

여기서 E0[T]E_0[T]는 틱 바의 기대 크기이고, P[bt=1]P[b_t = 1]은 틱이 매수로 분류될 비조건부 확률(unconditional probability)이다. 마찬가지로 P[bt=1]P[b_t = -1]은 틱이 매도로 분류될 비조건부 확률이다. P[bt=1],P[bt=1]P[b_t = 1], P[b_t = -1]은 확률이므로 P[bt=1]+P[bt=1]=1P[b_t = 1] + P[b_t = -1] = 1이다. 따라서 E0[θT]=E0[T](2P[bt=1]1)E_0[\theta_T] = E_0[T](2P[b_t = 1] - 1)이다. 경험적으로 E0[T]E_0[T]는 이전 샘플들로부터의 btb_t값의 지수 가중 이동 평균(EWMA)으로 계산할 수 있다.

셋째, Tick imbalance bar를 다음 조건을 만족하는 틱의 TT^*연접 부분집합으로 정의한다.

T=arg minT{θTE0[T]2P[bt=1]1}T^* = \argmin_{T} \left\{ |\theta_T| \geq E_0[T] |2P[b_t = 1] - 1| \right\}

여기서 2P[bt=1]1|2P[b_t = 1] - 1|는 추정된 기대 불균형(expected size od imbalance)이다. 불균형의 크기가 기대값을 벗어날 때마다 샘플링이 될 것이기 때문에 정보 기반 거래자가 있을 경우 더 빈번히 발생하게 된다. 따라서, 각 하나의 바들은 비슷한 정보의 양을 담은 거래의 버킷으로 이해할 수 있다.

다음은 tick imbalance bar를 구현하는 코드의 예시이다

def tick_imbalance_bars(
	file_path_or_df: Union[str, Iterable[str], pd.DataFrame], 
    expected_imbalance_window: int = 10000,
    exp_num_ticks_init: int = 20000,
    batch_size: int = 2e7, 
    analyse_thresholds: bool = False,
    verbose: bool = True):
    
    bars = ImbalanceBars(metric='tick_imbalance',
                         expected_imbalance_window=expected_imbalance_window,
                         exp_num_ticks_init=exp_num_ticks_init,
                         batch_size=batch_size, 
                         analyse_thresholds=analyse_thresholds)
    imbalance_bars = bars.batch_run(file_path_or_df=file_path_or_df, verbose=verbose)

    return imbalance_bars, pd.DataFrame(bars.bars_thresholds)

아래는 이전 포스팅에서 사용한 데이터를 가지고 동일하게 추정한 틱 불균형 바이다. 시장이 불황에서 호황으로 국면 전환이 되는 시기에 샘플링이 더 자주 일어나는 것을 알 수 있다.

Volume Imbalance Bar

Volume imbalance bar는 Tick imbalance bar의 아이디어를 확장하는 것이다. 즉, 거래량의 불균형이 기대값을 벗어날 경우에 샘플링을 하는 것이다. Tick imbalance bar에서 논의한 규칙과 경계 조건 b0b_0와 동일한 개념하에 다음 샘플의 인덱스 TT를 결정하는 절차를 정의해 보자

첫째, 우선 시점 TT에서의 불균형을 다음과 같이 정의한다

θT=t=1Tbtνt\theta_T = \sum_{t=1}^T b_t \nu_t

여기서 νt\nu_t는 거래된 증권 수를 나타낸다. 둘째로, 바의 시작에서 θT\theta_T의 기대값을 계산한다.

E0[θT]=E0[tbt=1Tνt]E0[tbt=1Tνt]=E0[T](P[bt=1]E0[νtbt=1]P[bt=1]E0[νtbt=1])\begin{matrix} E_0[\theta_T] &=& E_0 \left[ \sum_{t|b_t = 1}^T \nu_t\right] - E_0 \left[ \sum_{t|b_t = -1}^T \nu_t\right] \\ &=& E_0[T](P[b_t = 1]E_0[\nu_t|b_t = 1] - P[b_t = -1]E_0[\nu_t|b_t = -1]) \end{matrix}

ν+=P[bt=1]E0[vtbt=1],ν=P[bt=1]E0[vtbt=1]\nu^{+} = P[b_t = 1]E_0[v_t|b_t = 1], \nu^- = P[b_t = -1]E_0[v_t|b_t = -1]로 표기하면, E0[T]1E0[Σtνt]=E0[νt]=ν++νE_0[T]^{-1}E_0[\Sigma_t \nu_t]=E_0[\nu_t] = \nu^+ + \nu^-가 된다. ν+\nu^+ν\nu^-는 초기 기대값 νt\nu_t를 각각 매수와 매도 성분으로 분해한 것으로 생각할 수 있다. 그렇다면 다음이 성립한다.

E0[θT]=E0[T](ν+ν)=E0[T](2ν+E0[νt])E_0[\theta_T] = E_0[T](\nu^+ - \nu^-) = E_0[T](2\nu^+ - E_0[\nu_t])

여기서 E0[T]E_0[T]는 이전 샘플로부터의 TT값의 지수 가중 이동 평균(EWMA)으로 계산할 수 있고, (2ν+E0[νt])(2\nu^+ - E_0[\nu_t])는 이전 바에서 btνtb_t\nu_t값의 지수가중 이동평균으로 계산할 수 있다.

셋째, Volume imbalance bar를 다음 조건을 만족하는 TT^*연접 부분집합으로 정의할 수 있다.

T=arg minT{θTE0[T]2ν+E0[νt]}T^* = \argmin_T \left\{ |\theta_T| \geq E_0[T]|2 \nu^+ - E_0[\nu_t]\right\}

마찬가지로 2P[bt=1]1|2P[b_t = 1] - 1|는 추정된 기대 불균형(expected size od imbalance)이다. θT\theta_T가 예상보다 더 불균형 상태가 된다면 작은 TT가 이 조건을 만족할 것이다. 이는 정보 기반 거래자의 거래량 바로 생각할 수 있다.

다음은 volume imbalance bar를 구현하는 코드의 예시이다

def volume_imbalance_bars(
	file_path_or_df: Union[str, Iterable[str], pd.DataFrame],
    expected_imbalance_window: int = 10000,
    exp_num_ticks_init: int = 20000,
    batch_size: int = 2e7, 
    analyse_thresholds: bool = False,
    verbose: bool = True):
    
    bars = ImbalanceBars(metric='volume_imbalance',
                         expected_imbalance_window=expected_imbalance_window,
                         exp_num_ticks_init=exp_num_ticks_init,
                         batch_size=batch_size, analyse_thresholds=analyse_thresholds)
                         
    imbalance_bars = bars.batch_run(file_path_or_df=file_path_or_df, verbose = verbose)

    return imbalance_bars, pd.DataFrame(bars.bars_thresholds)

아래는 volume imbalance bar를 동일 데이터셋에 대해 샘플링한 결과이다. 기대값 산출을 위한 틱의 개수는 100, 가중평균을 위한 look back 기간은 300으로 지정하였다.

Dollar Imbalance Bar

Dollar imbalance bar의 구조는 volume imbalance bar의 구조와 같다. 단지 νt\nu_t가 거래량에 대한 변수가 아닌 달러 가치(ptqt)(p_t \cdot q_t)에 대한 변수라는 점이 다르다.시점 TT에서의 불균형을 다음과 같이 정의한다.

θT=t=1Tbtνt\theta_T = \sum_{t=1}^T b_t \nu_t

여기서 νt\nu_t는 달러 가치에 대한 바를 의미한다. 마찬가지로 Dollar imbalance bar를 다음 조건을 만족하는 TT^*연접 부분집합으로 정의할 수 있다.

T=arg minT{θTE0[T]2ν+E0[νt]}T^* = \argmin_T \left\{ |\theta_T| \geq E_0[T]|2 \nu^+ - E_0[\nu_t]\right\}

2P[bt=1]1|2P[b_t = 1] - 1|는 추정된 기대 불균형(expected size od imbalance)이다.

dollar imbalance bar는 다음과 같이 코드로 구현이 가능하다. 아래는 DIB의 예시 코드이다.

def dollar_imbalance_bars(
	file_path_or_df: Union[str, Iterable[str], pd.DataFrame],
    expected_imbalance_window: int = 10000,
    exp_num_ticks_init: int = 20000,
    batch_size: int = 2e7, 
    analyse_thresholds: bool = False,
    verbose: bool = True):
    
    bars = ImbalanceBars(metric='dollar_imbalance',
                         expected_imbalance_window=expected_imbalance_window,
                         exp_num_ticks_init=exp_num_ticks_init,
                         batch_size=batch_size,
                         analyse_thresholds=analyse_thresholds)
    imbalance_bars = bars.batch_run(file_path_or_df=file_path_or_df, verbose=verbose)

    return imbalance_bars, pd.DataFrame(bars.bars_thresholds)

아래는 volume imbalance bar를 동일 데이터셋에 대해 샘플링한 결과이다. 기대값 산출을 위한 틱의 개수는 100, 가중평균을 위한 look back 기간은 300으로 지정하였다.

Statistical Characteristics

표준화된 수익률 계열에 대해 다음과 같이 표현된다

kde distribution에 적합화한 결과 다음과 같은 차이가 난다. dollar imbalance bar의 첨도가 가장 낮은 것을 알 수 있다.

Time bar

Tick imbalance bar

Volume imbalance bar

Dollar imbalance bar

profile
자택경비원 1일차

0개의 댓글

관련 채용 정보