Whether each trade printed above, below or at the price of the trade before it.
Uptick and downtick count, volume, ratios and percentages based on price movement direction.
All 11,692 trades from 14:38 to 14:39 UTC on 11 June 2025, Binance BTC-USDT perpetual, from the free raw-trades preview.
Step 1
A trade above the previous trade price is an uptick, below it a downtick, at the same price unchanged. 58% of trades here were unchanged.
The first trade has no trade before it in the bar, so 11,691 of 11,692 trades are classified.
Step 2
Volumes are in BTC, not dollars.
Step 3
BTC-USDT perpetual on Binance, 5m bars, 1 to 31 May 2025, from the free preview.
Bars by tick tilt, most downticks to most upticks. Basis points.
That is the median share of zero-tick trades per bar in May. The balance of upticks against downticks correlated 0.73 with the bar's return. The most downtick-heavy tenth of bars fell 12.7 bps on average, the most uptick-heavy tenth rose 13.3 bps.
It describes the bar it is in and says nothing about the next one (correlation -0.001).
An uptick is a trade above the previous trade price, a downtick below it, and unchanged at the same price. _count fields count trades, _volume fields sum their size.
uptick_downtick_volume_ratio above 1 means more size traded on upticks. Read it with volume: a ratio of 3 on a quiet bar can be a handful of trades.
unchanged_volume_percentage is the share of volume that traded without moving the price, a rough measure of how much the book absorbed.
Before exchanges provided taker-side classification, researchers had only the sequence of transaction prices to infer trade direction. The tick test — classifying trades based on whether the price rose or fell — remains a surprisingly informative signal even when full trade-side data is available.
Lee & Ready (1991) formalized the tick test as part of their trade classification algorithm: a trade at a price above the previous trade (uptick) is classified as buyer-initiated; a trade below (downtick) is seller-initiated. For trades at the same price (zero tick), the previous non-zero tick determines classification.
While modern crypto exchanges directly report the aggressor side, making the tick test unnecessary for classification, the statistics of uptick/downtick sequences capture something distinct from the aggressor label: how many price levels a trade swept through.
A single large buy can result in multiple consecutive upticks as it walks through the order book — clearing the ask at one level, then the next, then the next. The aggressor-side label reports one buy. The uptick sequence reports three price-improving ticks. This difference captures depth penetration: how far into the book the aggressive order reached.
This is directly related to the market impact literature. Kyle (1985) modeled impact as proportional to signed volume, but Bouchaud et al. (2009) showed that the number of price levels crossed by a single metaorder is an independent predictor of permanent impact, beyond volume alone.
The volume-on-upticks ratio is a momentum quality metric. When most of an interval's volume occurred on price increases, the move was directionally endorsed by actual trading — not a thin-market drift. This distinction matters:
French & Roll (1986) showed that prices are more volatile during trading hours than non-trading hours, partly because of the information content of trades. The uptick/downtick decomposition helps identify which trades are carrying that information: those that move price (upticks/downticks) versus those that don't (zero ticks, volume at unchanged prices).
References:
# Install the Aperiodic CLI into ~/.local/bin
mkdir -p "$HOME/.local/bin"
curl -fsSL https://raw.githubusercontent.com/aperiodic-io/cli/main/install.sh | INSTALL_DIR="$HOME/.local/bin" bash
export PATH="$HOME/.local/bin:$PATH"
# Free preview — no API key required
aperiodic updownticks --preview \
--exchange binance-futures \
--symbol perpetual-BTC-USDT:USDT \
--interval 5m \
--timestamp exchange \
--start-date 2025-05-01 \
--end-date 2025-05-31 \
--output-dir ./data && echo "Saved to $PWD/data"