Skip to main content

Wickra Shazam — match an asset's current microstructure fingerprint against its entire history

Built on Wickra Status CI CodeQL codecov GitHub release crates.io PyPI npm NuGet Maven Central Go module R-universe License: MIT OR Apache-2.0 OpenSSF Scorecard OpenSSF Best Practices Build provenance Docs Verified across 10 languages Live demo


Point at live data → "that's the May-2021 crash setup". Match the current microstructure fingerprint of an asset against its entire history.

▶ Live demos: the backtester compiled to WebAssembly, an equity curve building bar by bar — backtest-live.wickra.org; one StrategySpec side by side in Python, Rust, JS and Go — playground.wickra.org; all 514 indicators of the core over a real Binance feed — live.wickra.org. Zero backend, all of them.

Part of the Wickra ecosystem: the same data-driven core and ten-language binding surface also power wickra-exchange, wickra-backtest, wickra-terminal and 20 more — see the full list.

Wickra Shazam turns an asset's whole history into a rolling index of fixed-dimension microstructure fingerprints — a vector built from the full Wickra feature space (indicators, price, and microstructure: order-book imbalance, funding, open interest, liquidations, footprint) — and matches the current fingerprint against that entire index to name the regime. It is pattern/regime recognition over the full feature space, not price alone.

  • The fingerprint is data — a serde FingerprintSpec (an ordered feature list + window + normalize + metric), not Rust closures, so it crosses the C ABI and WASM unchanged. A fixed dimension N is what makes it deterministic.
  • Deterministic core — indexing and matching are byte-identical across all ten languages and between the parallel (rayon) and sequential (WASM) builds.
  • Three operations, one core — index(history, spec) builds the rolling index, match_current(index, current, k) finds the k most similar historical fingerprints, and a label attaches a human name ("may_2021_crash") to a match.

The core is one library (wickra-shazam-core), usable from Rust, Python, Node.js, WASM, C, C++, C#, Go, Java and R over a JSON-over-C-ABI boundary, plus a reference CLI.

# Index a history and match the current state, human-readable table:
cargo run -p wickra-shazam -- --spec golden/specs/crash_setup.json \
  --history golden/data/history/sym-01.csv --current golden/data/current/sym-01.csv

# Raw MatchReport JSON (the same bytes every binding returns), top 5 matches:
cargo run -p wickra-shazam -- --spec golden/specs/price_euclid.json \
  --history golden/data/history/sym-01.csv --k 5 --format json

Status

0.2.0 — the current release. The core, the CLI, all ten language bindings, the byte-exact golden corpus, property + fuzz tests, benchmarks and one runnable example per language are in place and green across the full CI matrix (10 languages × 3 OS); What comes next is in ROADMAP.md.

Documentation

Quickstart

# Index a history and match the current state, human-readable table:
cargo run -p wickra-shazam -- --spec golden/specs/crash_setup.json \
  --history golden/data/history/sym-01.csv --current golden/data/current/sym-01.csv

# Raw MatchReport JSON (the same bytes every binding returns), top 5 matches:
cargo run -p wickra-shazam -- --spec golden/specs/price_euclid.json \
  --history golden/data/history/sym-01.csv --k 5 --format json

--current defaults to the last window bars of --history. Attach a label to a historical bar with --label <ts>=<name> (repeatable) and it comes back on any match at that timestamp.

FingerprintSpec / features

A spec is a JSON (or TOML) document: an ordered features list, a window, a normalize mode and a metric. The feature order is the vector's axis order and never changes within an index, so the dimension N = features.len() * window is fixed and the fingerprint is fully deterministic.

{
  "features": [
    { "kind": "indicator", "name": "Rsi", "params": [14] },
    { "kind": "indicator", "name": "Sma", "params": [20] },
    { "kind": "indicator", "name": "Atr", "params": [14] },
    { "kind": "price", "field": "close" },
    { "kind": "price", "field": "volume" }
  ],
  "window": 1,
  "normalize": "z_score",
  "metric": "cosine"
}
  • indicator — any PascalCase Wickra indicator resolved from the registry by name + params (Rsi, Sma, Atr, Macd, …), with an optional field to pick a sub-output of a multi-output indicator.
  • price — a raw OHLCV field (open/high/low/close/volume).
  • microstructure — an order-book / flow feature (imbalance, funding, open interest, liquidations, footprint), resolved from the same registry.
  • window — how many consecutive bars are stacked into one fingerprint (1 = the current bar only; > 1 = a short shape).

Similarity & metrics

The metric decides how two fingerprints are compared. Similarity is always mapped to [0, 1] (1 = identical) and rounded deterministically:

  • cosine — cosine of the angle between the flat vectors, mapped from [-1, 1] to [0, 1] via (cos + 1) / 2. Scale-insensitive; good with z_score normalization.
  • euclid — 1 / (1 + d) where d is the L2 distance. Scale-sensitive; pair with min_max or z_score to weight features evenly.
  • dtw — dynamic time warping over the per-bar feature vectors of a window > 1 spec, tolerant of small time shifts between two shapes. With window == 1 it is identical to euclid.

normalize (none · z_score · min_max) is fitted once over the whole index and reused for the current fingerprint, so history and query live on the same axes.

Labels

A label attaches a human-readable name to a historical timestamp; when a match lands on that bar the name rides along in the report:

{ "cmd": "label", "ts": 1700216000, "label": "may_2021_crash" }
// → a later match at ts 1700216000 comes back as
//   { "ts": 1700216000, "similarity": 0.98, "label": "may_2021_crash" }

Use in any language

The same Shazam handle — construct from a JSON spec, drive with command(json) -> json, read version — is reachable from every binding. The commands are set_spec, index, match, label, reset and version; index returns {"indexed":N} and match returns a MatchReport that is byte-identical to the CLI's --format json.

from wickra_shazam import Shazam
s = Shazam('{"features":[{"kind":"price","field":"close"}],'
           '"window":1,"metric":"euclid"}')
s.command('{"cmd":"index","history":[/* candles */]}')
report = s.command('{"cmd":"match","current":[/* candles */],"k":5}')  # JSON MatchReport

The C ABI hub (bindings/c) backs C, C++, C#, Go, Java and R; Rust, Python, Node.js and WASM are native. See each bindings/<lang>/README.md and the runnable examples/.

Project layout

crates/shazam-core     the deterministic core (FingerprintSpec, index, match_current, labels)
crates/shazam-cli      the CLI (bin: wickra-shazam)
crates/shazam-bench    criterion benchmarks
bindings/{python,node,wasm,c,go,csharp,java,r}   the ten-language surface
golden/                CSV histories, current windows, specs, and byte-exact expected reports
fuzz/                  cargo-fuzz targets (spec_parse, build_index, match_index, normalize_metric)
examples/              one runnable "index a history and match the current state" example per language

Building everything from source

cargo build --workspace
cargo test  --workspace --all-features
cargo test  --workspace --no-default-features   # sequential (WASM) index/match path
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo run -p wickra-shazam -- --spec golden/specs/crash_setup.json \
  --history golden/data/history/sym-01.csv

Each binding builds from its own directory — see the per-binding READMEs under bindings/.

Testing

Run the suites with the commands in Building everything from source.

  • wickra-shazam-core — unit tests per feature axis, normalisation and metric, the index and search path, the parallel-versus-sequential parity, property tests over histories and the command envelope, and the operating-mode check (a label sent before index and one sent after yield the same match report; re-indexing keeps it). The golden fixtures in golden/ are the anchor: the same (spec, history, current) triple must match to the same report bytes here as in every binding.
  • Every binding asserts the same golden bytes and the same operating-mode equivalence. That is the whole cross-language claim, so it is checked the same way in each one rather than approximated per language: Python with pytest (and a plain runner on 3.9), Node with node --test, WASM through the nodejs build, C and C++ through ctest, C# with dotnet test, Go with go test, Java with JUnit, and R with the shipped tests/smoke.R plus the repository's run_tests.R.
  • Examples — every example under examples/ runs in CI and is held to the version and the matches it prints.
  • Fuzz — fuzz/ holds libFuzzer targets over spec parsing, metric normalisation, the index build and the match; CI runs each for a short smoke.

Requirements

  • Rust 1.86+ — the workspace MSRV; the Node binding needs Rust 1.88.
  • Python 3.9+ — the Python binding.
  • Node 22+ — the Node binding.
  • Go 1.23+ — the Go binding.
  • Java 22+ — the Java binding.
  • R 4.1+ — the R package.
  • .NET 8+ — the C# binding.
  • A C11 / C++17 compiler with CMake 3.15+ for the C and C++ examples.

See each bindings/<lang>/README.md for the per-language build and install.

Benchmarks

crates/shazam-bench measures build_index scaling by history length and feature count, and match_index by index size and metric (cosine / euclid / dtw), parallel vs sequential. See BENCHMARKS.md.

Ecosystem

Part of the Wickra family — each one a data-driven core with a CLI and the same ten-language binding surface:

  • wickra — main library (Rust core + Python / Node.js / WASM bindings + a C ABI for C / C++ / C# / Go / Java / R)
  • wickra-playground — a polyglot strategy playground: one StrategySpec live side by side in Python, Rust, JS and Go, entirely in the browser
  • wickra-exchange — unified market-data + execution across ten crypto exchanges
  • wickra-backtest — event-driven backtester over the Wickra core
  • wickra-terminal — the trading terminal: a TUI and a browser renderer over the stack
  • wickra-screener — parallel multi-symbol screening over 514 streaming indicators
  • wickra-xray — market-microstructure explorer: footprint, order-book heatmap, liquidation map, funding/OI divergence
  • wickra-radar — perp-universe alert radar: OI delta, funding flip, book imbalance, liquidation clusters, OI/price divergence
  • wickra-copilot — local market copilot grounded in real order-book, liquidation and funding microstructure
  • wickra-benchmark — reproducible, golden-verified benchmark suite — recompute any (strategy, dataset, report) in ten languages and confirm it byte-for-byte
  • wickra-strategy-ci — Jest for trading strategies: golden-pin the report, catch regressions in CI, property-test against fuzzed data
  • wickra-verify — confirm or refute a claimed backtest report against its strategy and data, in ten languages
  • wickra-proof — Proof-of-Backtest: deterministic (spec, data) → report + blake3 hash, recomputable byte-for-byte in ten languages
  • wickra-zk — prove a backtest zero-knowledge — on-chain-verifiable performance without revealing the data or the strategy
  • wickra-impact — the backtester that knows you would have moved the market: agent-based fills on the real historical L2 order book
  • wickra-darwin — evolutionary strategy search at millions of backtests per second, mutating and crossing JSON specs across the 514-indicator space
  • wickra-gym — a Gymnasium-compatible, microstructure-aware backtest environment with O(1) steps for deterministic RL rollouts
  • wickra-feature-store — OHLCV and microstructure streams into ML-ready feature matrices over 514 O(1) streaming indicators
  • wickra-genome — a vector database of the whole market: every asset a 514-dim live vector, for similarity search, clustering and anomaly detection
  • wickra-timemachine — scrub the whole market like a video — every symbol, full order book, rewound to any moment via deterministic re-fold
  • wickra-synth — deterministic synthetic market microstructure: OHLCV, order book, trades and funding from a single seed
  • wickra-compile — compile a strategy spec into a standalone deployable: a WASM module, a self-contained binary, or a no_std artifact
  • wickra-embed — allocation-free, no_std streaming indicators for bare-metal and HFT, byte-for-byte identical to the core
  • wickra-pico — the O(1) indicator core running bare-metal on a $5 Raspberry Pi Pico — the LED blinks on the EMA cross

Docs at docs.wickra.org; the marketing site and in-browser demo at wickra.org.

Contributing

See CONTRIBUTING.md and CODE_OF_CONDUCT.md. Commits are signed and in English; open a PR against main.

Security

See SECURITY.md and THREAT_MODEL.md. Report vulnerabilities privately — never in a public issue.

License

Licensed under either of

at your option. Use it, fork it, modify it, redistribute it — commercially or not — file issues, send pull requests; all welcome.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Disclaimer

Wickra Shazam is analysis software: it computes similarity between market states. A historical match is a statistical resemblance, not a prediction and not financial advice — the past setup did not have to repeat, and neither does this one. It places no orders. Trading carries risk of loss; review the code and use at your own discretion.


GitHub stars GitHub forks GitHub issues

Built on Wickra. If it saved you time, the cheapest way to say thanks is to ⭐ the repo.

wickra-shazam star history

Metadata

Release files for wickra-shazam 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wickra-shazam 0.2.0
File Size Uploaded
wickra_shazam-0.2.0.tar.gz 83.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for wickra-shazam 0.2.0
File
wickra_shazam-0.2.0-cp39-abi3-win_arm64.whl CPython 3.9 abi3 Windows ARM64 Details
wickra_shazam-0.2.0-cp39-abi3-win_amd64.whl CPython 3.9 abi3 Windows x86-64 Details
wickra_shazam-0.2.0-cp39-abi3-musllinux_1_2_x86_64.whl CPython 3.9 abi3 Linux musl 1.2+ x86-64 Details
wickra_shazam-0.2.0-cp39-abi3-musllinux_1_2_aarch64.whl CPython 3.9 abi3 Linux musl 1.2+ ARM64 Details
wickra_shazam-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.9 abi3 Linux glibc 2.17+ x86-64 Details
wickra_shazam-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.9 abi3 Linux glibc 2.17+ ARM64 Details
wickra_shazam-0.2.0-cp39-abi3-macosx_11_0_arm64.whl CPython 3.9 abi3 macOS 11.0+ ARM64 Details
wickra_shazam-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl CPython 3.9 abi3 macOS 10.12+ x86-64 Details

Total release size: 5.6 MB

Release files / wickra_shazam-0.2.0.tar.gz

Download URL wickra_shazam-0.2.0.tar.gz
Size 83.1 kB
Tags Source
SHA-256 checksum
How to use checksums
bc7ced68c3afe418e628ce972d2c6f4f0a2dbbe0b2e268d0123f42b1d1d4bc04
BLAKE2b-256 checksum
How to use checksums
e5c137380774cf91dbb56e0c1a9a13b7f3fcfac273a31a280abe6945fb4ea72a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-win_arm64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-win_arm64.whl
Size 527.9 kB
Tags CPython 3.9 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
49935a4e1beb519b14341860e1f3af9a33b585092441f0f48515a7ba87a3930d
BLAKE2b-256 checksum
How to use checksums
4d614f96205611410b278c2685a0d253cb12f0f45bb1ba69912888c86aea512f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-win_amd64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-win_amd64.whl
Size 600.7 kB
Tags CPython 3.9 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
fbb1f42e266aa14e654c8922c40746234f262a2cfd5541b43e9c605d1b36ce62
BLAKE2b-256 checksum
How to use checksums
05211287e11b2b7aa60079bc6cc237650789b9099fea67e1540dd2aab282b763
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-musllinux_1_2_x86_64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-musllinux_1_2_x86_64.whl
Size 942.3 kB
Tags CPython 3.9 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
53674a165e10f314ed522283a6ea219217ea8efe6f8f071a81f5590a1e3f948e
BLAKE2b-256 checksum
How to use checksums
387c8b979831641dd08c9f7d7876682acd9d6b9b74846a3c88669a475f8bfdd1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-musllinux_1_2_aarch64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-musllinux_1_2_aarch64.whl
Size 831.2 kB
Tags CPython 3.9 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
9ee5a48425f69245b5158d3cdd7fc23b607fe54d28953204033d786f1ac7bacd
BLAKE2b-256 checksum
How to use checksums
4e8f4c33a96f9e9be96c9e2fd8e8efdf517e7bd45367c23420b5e94f08af117e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 725.5 kB
Tags CPython 3.9 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
c3156816d01cc67a391b615295a43029b123bf42b79d5e9f6ce9091bdbbb1ecf
BLAKE2b-256 checksum
How to use checksums
e0903120408e2c30697fefe0329cb7d86e49894a78ef08e460ad233b262cc89b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 652.9 kB
Tags CPython 3.9 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
7f844b2f777a29cd805a6d4950f20384838ccd8b83f26fc70dad47540989843d
BLAKE2b-256 checksum
How to use checksums
b26c926450ed079ca2458a4d55910f3d7309dce3929d60f681d0536aad339062
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-macosx_11_0_arm64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-macosx_11_0_arm64.whl
Size 595.7 kB
Tags CPython 3.9 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
fe344a54027a2e9b13e0ee71504d49930f9f6ac70cb17c94eee9e49a837d2c09
BLAKE2b-256 checksum
How to use checksums
63e40036c1239142c97cffc2532bd4d971af8016d873bbd1933763f18a5d8c84
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release files / wickra_shazam-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl

Download URL wickra_shazam-0.2.0-cp39-abi3-macosx_10_12_x86_64.whl
Size 684.5 kB
Tags CPython 3.9 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
7703da8a7f1264a4a96736a88af30512b16ed4ebb245e0d1a2c0ff126cbf279c
BLAKE2b-256 checksum
How to use checksums
1b65e18c25d8daf7b01df63d2eec9a6bc6eb7a38346c10eab328bb48afbac1bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via maturin/1.15.0

Release history Release notifications | RSS feed

This release

0.2.0 This release

9 release files

0.1.4

9 release files

0.1.3

9 release files

0.1.2

9 release files

0.1.1

9 release files

0.1.0

9 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page