pub struct AvellanedaGueant {
pub gamma: f64,
pub sigma: f64,
pub kappa: f64,
pub a: f64,
pub q_max: usize,
}Expand description
The asymptotic approximation (infinite horizon) for the Avellaneda-Stoikov model. Based on the Gueant-Lehalle-Tapia closed-form solution.
Reference: Guéant, O., Lehalle, C. A., & Tapia, J. (2013). Dealing with the inventory risk: a solution to the market making problem.
Fields§
§gamma: f64§sigma: f64§kappa: f64§a: f64§q_max: usizeInventory truncation used when evaluating the value reference.
Implementations§
Source§impl AvellanedaGueant
impl AvellanedaGueant
pub fn new(gamma: f64, sigma: f64, kappa: f64, a: f64) -> Self
Sourcepub fn with_q_max(self, q_max: usize) -> Self
pub fn with_q_max(self, q_max: usize) -> Self
Sets the inventory truncation used for the value reference.
Sourcepub fn approximate_spreads(&self, q: f64) -> (f64, f64)
pub fn approximate_spreads(&self, q: f64) -> (f64, f64)
Guéant-Lehalle-Tapia closed-form approximation for optimal spreads.
This approximation assumes infinite time horizon ($T \to \infty$) and small spreads, providing a stationary strategy that depends on inventory $q$ but not time $t$.
The spreads are symmetric around the mid-price, shifted by inventory: $\delta^\pm(q) \approx \text{RiskNeutral} \pm \text{InventorySkew} \cdot q$
Reference: Guéant, O., Lehalle, C. A., & Tapia, J. (2013). Dealing with the inventory risk.
Sourcepub fn stationary_theta(&self, q_max: usize, q: i32) -> f64
pub fn stationary_theta(&self, q_max: usize, q: i32) -> f64
Stationary value function theta(q) for the reduced Avellaneda model.
The exact stationary solution of the GLT linearized HJB is the principal
eigenvector v(q) of the symmetric tridiagonal operator with diagonal
-alpha q^2 and off-diagonal eta, where
alpha = (kappa / 2) gamma sigma^2
eta = a (1 + gamma/kappa)^{-(1 + kappa/gamma)}The reduced solver works directly in theta space, with
v(q) = exp(kappa theta(q)). The value is normalized so theta(0) = 0,
which removes the one-parameter translation invariance of the stationary
HJB. Only differences theta(q) - theta(q') are invariant under the
normalization and therefore meaningful.
§Panics
Panics if q is outside [-q_max, q_max].
Sourcepub fn stationary_spreads(&self, q_max: usize, q: i32) -> (f64, f64)
pub fn stationary_spreads(&self, q_max: usize, q: i32) -> (f64, f64)
Stationary bid/ask spreads implied by the principal-eigenvector value.
The bid spread is base + (theta(q) - theta(q+1)) / 2 adjusted for the
half-inventory convention, and the ask spread is the mirror around the
base spread. This matches the approximate_spreads small-gamma limit.
Trait Implementations§
Source§impl AnalyticalSolution<2> for AvellanedaGueant
impl AnalyticalSolution<2> for AvellanedaGueant
Source§fn value_function(&self, _t: f64, state: &[f64; 2]) -> f64
fn value_function(&self, _t: f64, state: &[f64; 2]) -> f64
Source§fn optimal_controls(&self, _t: f64, state: &[f64; 2]) -> MarketMakingControl
fn optimal_controls(&self, _t: f64, state: &[f64; 2]) -> MarketMakingControl
Auto Trait Implementations§
impl Freeze for AvellanedaGueant
impl RefUnwindSafe for AvellanedaGueant
impl Send for AvellanedaGueant
impl Sync for AvellanedaGueant
impl Unpin for AvellanedaGueant
impl UnsafeUnpin for AvellanedaGueant
impl UnwindSafe for AvellanedaGueant
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more