Implements the efficient estimator of bid-ask spreads from open, high, low, and close prices described in Ardia, Guidotti, & Kroencke (JFE, 2024): https://doi.org/10.1016/j.jfineco.2024.103916
install.packages("bidask")
This package implements the following functions. The function
edge
computes a single bid-ask spread estimate from vectors
of open, high, low, and close prices. The functions
edge_rolling
and edge_expanding
are optimized
for fast calculations over rolling and expanding windows, respectively.
The function spread
provides additional functionalities for
xts
objects and implements additional estimators. The
function sim
simulates a time series of open, high, low,
and close prices. The main functions are presented below. The full documentation
is available on CRAN and a vignette
is also available.
library("bidask")
edge
The input prices must be sorted in ascending order of the timestamp. The output value is the spread estimate. A value of 0.01 corresponds to a spread of 1%.
edge(open, high, low, close, sign=FALSE)
field | description |
---|---|
open |
Numeric vector of open prices. |
high |
Numeric vector of high prices. |
low |
Numeric vector of low prices. |
close |
Numeric vector of close prices. |
sign |
Whether to return signed estimates. |
edge_rolling
Implements a rolling window calculation of edge
. The
output is a vector of rolling spread estimates. A value of 0.01
corresponds to a spread of 1%. This function always returns a result of
the same length as the input prices.
edge_rolling(open, high, low, close, width, sign=FALSE, na.rm=FALSE)
field | description |
---|---|
open |
Numeric vector of open prices. |
high |
Numeric vector of high prices. |
low |
Numeric vector of low prices. |
close |
Numeric vector of close prices. |
width |
If an integer, the width of the rolling window. If a vector with the same length of the input prices, the width of the window corresponding to each observation. Otherwise, a vector of endpoints. See examples. |
sign |
Whether to return signed estimates. |
na.rm |
Whether to ignore missing values. |
edge_expanding
Implements an expanding window calculation of edge
. The
output is a vector of expanding spread estimates. A value of 0.01
corresponds to a spread of 1%. This function always returns a result of
the same length as the input prices.
edge_expanding(open, high, low, close, sign=FALSE, na.rm=TRUE)
field | description |
---|---|
open |
Numeric vector of open prices. |
high |
Numeric vector of high prices. |
low |
Numeric vector of low prices. |
close |
Numeric vector of close prices. |
sign |
Whether to return signed estimates. |
na.rm |
Whether to ignore missing values. |
Load the test data.
library("bidask")
= read.csv("https://raw.githubusercontent.com/eguidotti/bidask/main/pseudocode/ohlc.csv") x
Compute the spread estimate using all the observations.
edge(x$Open, x$High, x$Low, x$Close)
Compute rolling estimates using a window of 21 observations.
edge_rolling(x$Open, x$High, x$Low, x$Close, width = 21)
Estimate the spread using custom endpoints.
edge_rolling(x$Open, x$High, x$Low, x$Close, width = c(3, 35, 100))
Estimate the spread using an expanding window
edge_expanding(x$Open, x$High, x$Low, x$Close, na.rm = FALSE)
Ardia, D., Guidotti, E., Kroencke, T.A. (2024). Efficient Estimation of Bid-Ask Spreads from Open, High, Low, and Close Prices. Journal of Financial Economics, 161, 103916. doi: 10.1016/j.jfineco.2024.103916
A BibTex entry for LaTeX users is:
@article{edge,
title = {Efficient estimation of bid–ask spreads from open, high, low, and close prices},
journal = {Journal of Financial Economics},
volume = {161},
pages = {103916},
year = {2024},
doi = {https://doi.org/10.1016/j.jfineco.2024.103916},
author = {David Ardia and Emanuele Guidotti and Tim A. Kroencke},
}