Roll(1984)은 증권이 거래되는 effective bid-ask spread를 설명하는 첫 번째 모델 중 하나다. 증권의 liquidity를 계량화하려는 초창기 시도로 알려져 있으며, 시장미시구조(Market Microstructure) 분야를 개척한 모형 중 가장 유명한 모델이다.
시간 에서 거래되는 가격 를 가정하자. 여기서 시간 인덱스 는 한 시간 간격이 될 수 있고, 일 분이 될 수도 있으며, 하루가 될 수도 있다. 이 시간을 앞으로 캘린터 타임(calander time)이라고 부르도록 한다. random walk를 따르는 가격 계열 p_t는 다음을 따른다고 가정한다.
여기서 인 white noise 계열이고 iid 프로세스를 따르는 random variable이다. 직관적으로 보자면, 새로운 정보가 시장에 도달하면 가격은 변화한다. 는 시장의 기대 가격 변화 수준이다 . 만약 시장의 기대가 가격이 상승하거나 하락하지 않는 횡보장 혹은 정적인 상태라면 이 될 것이다. 이 상황에서 가격 이기 때문에 확률보행 과정을 따른다. 따라서 이 경우, 가격의 예측은 전혀 불가능하다(이 과정을 martingale 과정이라고 부른다).
그러나, 현실적으로 가격이 확률보행 과정을 완벽히 따르는 것은 보기 힘들다. 당장에 증권 시장에서는 판매자와 구매자 뿐만 아니라 정보 기반 거래자와 유동성 공급자, 브로커가 존재하며 중간 매개자들은 거래 유동성을 원활히 하고 매칭을 해 주는 대신 수수료를 취한다. 따라서, bid price, ask price가 동시에 존재하는 시장이다.
Roll은 bid price와 ask price 사이의 중간 가격 계열 를 고려하였다. 추세가 없는 random walk process 를 다음과 같이 가정해 보자.
중간 가격의 변화분 은 정규 분포로부터 독립적이고 동일하게 추출된다.
관측된 가격 는 중간 가격 계열 에 스프레드가 더해진 순차적 거래에 대한 결과이다.
여기서 는 bid-ask spread의 절반이고 은 공격적인 거래자의 거래 방향(side)이다. Roll Model은 매수와 매도가 발생할 확률이 동일하고(각각 ), 계열 독립 이며, 으로 가정한다. 이런 가정들 하에서 와 의 값은 다음과 같이 도출할 수 있다.
위 식을 풀어 보면 spread추정량 과 변동성 추정량 의 결과를 얻을 수 있다. 즉, bid-ask spread는 가격 변화량 계열의 공분산에 대한 함수이고, 시장 미시구조적 잡음을 제거한 관측되지 않은 가격의 잡음은 관측된 잡음과 가격변화량 계열의 공분산의 함수이다.
Roll Model에서 추정된 spread 는 다음과 같은 의미를 가진다.
Roll Model이 강력한 또 한가지 이유는 주식시장 뿐만이 아닌 거래가 적은 Asset based Security market 혹은 real estate 거래에서도 시장 불균형의 척도로써 사용이 가능하기 때문이다. 다만, Roll Model에서도 약점은 존재하는데 거래 비용 외의 가격 변동 원인 무시, 시장의 모든 참여자가 같은 스프레드를 경험한다는 가정이 현실과 동떨어져 있다는 점이다. 또한, mid price series 가 iid 계열이라는 점도 비현실적인 가정인 것도 고려해야 한다.
class RollModel:
def __init__(self, close_prices : pd.Series, window : int = 20) -> None:
self.close_prices = close_prices
self.window = window
def roll_measure(self) -> pd.Series :
price_diff = self.close_prices.diff()
price_diff_lag = price_diff.shift(1)
return 2 * np.sqrt(abs(price_diff.rolling(window = self.window).cov(price_diff_lag)))
def roll_impact(self, dollar_volume : pd.Series) -> pd.Series :
roll_measure = self.roll_measure()
return roll_measure / dollar_volume
class RollModel
은 roll_measure()
과 roll_impact()
로 두 개의 method를 가진다. roll_measure()
은 Roll Spread 추정치를 계산하고, roll_impact()
는 Roll spread 추정량에 기반하여 거래하는 달러 가치 대비 시장에 미치는 영향을 계량화한다.
다음은 S&P500 일별 데이터에 대한 Roll Spread 추정치와 impact이다.
재미있는 점은, Roll Measure과 GARCH모형의 추정치가 거의 비슷한 양상을 보인다는 것이다.
Constant Mean - GARCH Model Results
==============================================================================
Dep. Variable: Close R-squared: 0.000
Mean Model: Constant Mean Adj. R-squared: 0.000
Vol Model: GARCH Log-Likelihood: 11556.2
Distribution: Normal AIC: -23100.4
Method: Maximum Likelihood BIC: -23063.3
No. Observations: 3542
Date: Tue, Feb 13 2024 Df Residuals: 3541
Time: 21:57:43 Df Model: 1
Mean Model
===============================================================================
coef std err t P>|t| 95.0% Conf. Int.
-------------------------------------------------------------------------------
mu -6.9697e-04 7.257e-06 -96.041 0.000 [-7.112e-04,-6.827e-04]
Volatility Model
============================================================================
coef std err t P>|t| 95.0% Conf. Int.
----------------------------------------------------------------------------
omega 2.0679e-06 1.533e-11 1.349e+05 0.000 [2.068e-06,2.068e-06]
alpha[1] 0.3242 2.594e-02 12.495 7.957e-36 [ 0.273, 0.375]
beta[1] 0.2196 4.449e-02 4.936 7.978e-07 [ 0.132, 0.307]
beta[2] 0.2196 6.326e-02 3.472 5.173e-04 [9.563e-02, 0.344]
beta[3] 0.2196 5.651e-02 3.886 1.018e-04 [ 0.109, 0.330]
============================================================================
Covariance estimator: robust
y축이 log scale인 roll measure과 conditional volaility model의 추정치는 다음과 같은 선형 관계를 가진다.