News & Events
[알고리즘 트레이딩/전략편] 40. API를 통한 실시간 VPIN 측정
- 2019년 1월 11일
- Posted by: 인사이트캠퍼스
- Category: 금융/AI/IT 기사
알고리즘 트레이딩 (Algorithmic Trading) – 전략 (40)
API를 통한 실시간 VPIN 측정
API에서 실시간으로 체결 틱을 받으면 실시간 VPIN을 측정할 수 있고 전략에 활용할 수 있다. VPIN은 독성 주문 (Flow Toxicity and Liquidity)에 대한 분석으로 마켓메이킹 전략에서 재고 위험을 관리하는데 사용될 수 있다.
VPIN을 측정하기 위해서는 동일 거래량을 갖는 Volume Bucket (거래량 캔들)를 만들고, 각 Bucket에서 매수 체결 강도와 매도 체결 강도의 불균형을 관찰해야한다. 아래 그림은 체결 틱의 체결 수량을 이용해서 300 거래량 마다 Volume Bucket을 만들고, 20개 Bucket 씩 이동하면서 VPIN을 측정하는 과정을 그린 것이다. 어느 종목의 일일 거래량이 100,000개라면 300 거래량짜리 Bucket이 약 330개 정도 만들어지므로, 각 Bucket은 약 1분봉에 해당한다.
아래 그림은 2015년 08월 20일 코스피200 지수 선물의 체결 틱 데이터로 실시간 VPIN을 측정한 결과이다. 각 Bucket에는 시가, 고가, 저가, 종가 (OHLC)와 매수 체결량, 매도 체결량 등이 들어있다. 새로운 Bucket이 만들어질 때마다 최근 20개 Bucket을 이용하여 OHLC와 VPIN을 측정하여 주가와 VPIN의 변화를 관찰하였다.
측정된 VPIN은 약 21% ~ 54% 사이에 분포해 있고, 평균은 34%, 표준편차는 7% 정도였다. 사적 정보를 가진 정보기반 거래자의 참여 비중이 약 34% 이고, 장중에 7% 정도 참여율이 변화하는 것을 볼 수 있다. 09:53:00 부근에서 VPIN이 크게 측정되었고 (+1.5σ 상한선을 벗어남), 주가는 크게 하락하였다. VPIN이 증가 추세에 있으면 대체적으로 주가는 크게 변하고 (변동성이 크고), VPIN이 감소하면 주가는 안정적인 (횡보하는) 것을 볼 수 있다. 10:17:00 부근에서는 주가가 크게 변했지만 VPIN은 상한선을 벗어나지 않았다. 이것은 주가가 급락할 때는 변동성이 급등하지만, 주가가 급상승할 때는 변동성이 덜 상승하는 것과 같은 원리이기 때문이다 (VPIN과 변동성은 속성이 유사함). 따라서 VPIN은 절대적인 수준보다는 방향을 관찰하는 것이 중요하다. VPIN의 절대적인 수준이 낮아도 상승 추세에 있으면 주가는 크게 변할 가능성이 있는 것이다 (이동 평균의 원리).
마켓메이킹 전략은 주가가 크게 변할 때 악성 재고가 증가하므로 손실이 발생한다. 장중에 VPIN의 변화를 관찰하면 VPIN 방향에 따라 제출 호가를 변경할 수 있다. (의무적인) 유동성 공급자 (LP)라면 VPIN이 증가할 때 제출 호가를 크게 벌리고 (재고 위험 비용을 추가로 요구함), 자발적 마켓메이커 (수익 창출형)라면 VPIN이 증가할 때 잠시 공격적 전략으로 전환하였다가, VPIN이 감소하면 다시 마켓메이킹 전략 (수동적 전략)으로 전환할 수도 있다.
위의 VPIN 측정치에 기술적분석 기법 등을 적용하여 오실레이터 같은 신호 (Signal)로 변환하면 전략에 적용하기 편할 것이다. 어떤 형태로 신호를 만들어서 마켓메이킹 전략에 응용할지에 대해서는 좀 더 고민해 볼 필요가 있다.
참고로, 아래 스크립트는 XingAPI로 만든 XingScript 프로그램에서 체결 틱 데이터를 분석해서 위의 결과를 얻은 스크립트 내용이다.
// 수집된 Volume Bucket을 이용하여 moving VPIN을 측정한다.
// VPIN : Volume-Syncronized Probability of Informed Trades (by David Easley, 2012)
// ————————————————————————————————
V = 300 // 1개의 Volume Bucket에 수집된 거래량 (300 거래량 당 1개의 Bucket)
K = 20 // 최근 20개의 Volume Bucket으로 VPIN을 측정함 (moving VPIN)
fd = OpenFile(“vpin.csv”, “w”) // 결과를 출력할 파일을 오픈한다
For loop = 1 to 2 step 0
// 현재 Volume Bucket이 완성될 때까지 대기한다
Wait(_volumefull, _lob)
// 수집된 Volume Bucket의 번호 (n)를 조회한다
n = BucketInfo(_lob, _vtime, _count)
// K-moving VPIN을 측정한다
If (n >= K) Then
sum = 0
For vCnt = n – K + 1 to n step 1
B = BucketInfo(_lob, _vtime, _buy, vCnt)
S = BucketInfo(_lob, _vtime, _sell, vCnt)
sum = sum + abs(S – B)
Next
// VPIN을 계산한다
vpin = sum / (K * V)
// VPIN 결과와 비교하기 Volume Candle (시가, 고가, 저가, 종가)을 조회한다
open = BucketInfo(_lob, _vtime, _open, n) // 현재 Volume Bucket의 시가 (open price)
high = BucketInfo(_lob, _vtime, _high, n) // 현재 Volume Bucket의 고가 (high price)
low = BucketInfo(_lob, _vtime, _low, n) // 현재 Volume Bucket의 저가 (low price)
close = BucketInfo(_lob, _vtime, _close, n) // 현재 Volume Bucket의 종가 (close price)
// 결과를 화면과 파일에 출력한다
Print GetTime(_krx, _time), ” “, n, ” “, open, ” “, high, ” “, low, ” “, close, ” “, vpin * 100
Fprint fd, GetTime(_krx, _time), “,”, n, “,”, open, “,”, high, “,”, low, “,”, close, “,”, vpin * 100
Else Endif
Next
CloseFile(fd) // 스크립트가 여기에는 도달하지 않음. 메인 화면에서 스크립트를 종료하면 파일이 닫힘.
End
[출처]40. API를 통한 실시간 VPIN 측정|작성자아마퀀트