Instrument Registry
Resolve and maintain canonical financial instrument records.
instrument-reg maps ISINs, provider symbols, names, and other identifiers to a
consistent local registry for Beancount and other financial workflows.
Why Use It
- resolve an instrument from a flexible query like an ISIN, symbol, name, conid, or FX pair
- keep a local instrument registry with explicit, predictable write paths
- validate bundled and user-defined instrument data
- fetch provider-backed details without giving up local registry precedence
Concepts
- Canonical Name: The unique identifier used in Beancount ledgers (e.g.,
AAPL,CSPX). - ISIN: International Securities Identification Number (e.g.,
US0378331005). Primary identifier for many instruments. - FIGI: Financial Instrument Global Identifier.
- Query: User input to
resolveoradd, such as an ISIN, provider symbol, name, conid, or FX pair. - Provider Symbol: Provider-specific market symbol (e.g.,
AAPLon Yahoo,CSPX.Lon Yahoo).
Installation
Requires Python 3.14 or newer.
uv tool install instrument-registry
Install optional live-data providers when you want external resolution and verification:
uv tool install 'instrument-registry[providers]'
Configuration
The registry loads data from two sources:
- Bundled Data: Built-in instruments (ETFs, Stocks).
- User Data: Custom YAML files located at
INSTRUMENT_REGISTRY_PATH.
Set the environment variable to point to your custom registry:
export INSTRUMENT_REGISTRY_PATH=~/path/to/my/registry
The registry recursively scans this directory for .yaml and .yml files.
Read precedence for CLI commands is:
- user-defined registry paths first
- bundled registry second
Write behavior for add is strict:
instrument-reg addwrites only whenINSTRUMENT_REGISTRY_PATHis set or--registry-pathis passed--registry-pathis a command option, so pass it after the subcommand, for exampleinstrument-reg add --registry-path ~/registry ...- if neither is set, the command fails instead of guessing a write location
Network lookup caching uses the platform cache directory by default. For sandboxed
development or CI runs, you can override it with INSTRUMENT_REGISTRY_CACHE_DIR:
export INSTRUMENT_REGISTRY_CACHE_DIR=.cache/instrument-registry
Usage
Resolve a Query
Resolve a query from local registries first, then external providers if needed. Queries can be ISINs, provider symbols, names, IBKR conids, or common FX pairs.
instrument-reg resolve US0378331005
# Output: Resolved: Apple Inc. -> AAPL (yahoo)
Automatic Currency Resolution
The resolver can derive common FX provider symbols when they are not already in your registry:
resolve EUR->EURUSD=Xresolve EUR/JPY->EURJPY=Xresolve USD/JPY->JPY=X
This eliminates the need to manually define standard Forex pairs in your registry files.
With price verification (checks if price matches historical data):
instrument-reg resolve US0378331005 --date 2024-01-01 --price 185.00
Add an Instrument
Add a new instrument to your local registry.
add requires an explicit write target. Set INSTRUMENT_REGISTRY_PATH or pass --registry-path.
# Auto-fetch metadata — instrument type and asset class are inferred from the provider
instrument-reg add --registry-path ~/registry US0378331005 --fetch
# Manually specify all details (instrument-type and asset-class are required without --fetch)
INSTRUMENT_REGISTRY_PATH=~/registry instrument-reg add \
--name AAPL \
--isin US0378331005 \
--symbol AAPL \
--instrument-type Stock \
--asset-class Stock \
--currency USD
Linting
Validate registry files and check for duplicates.
instrument-reg lint
Verify against live market data (checks if tickers are valid):
instrument-reg lint --verify
Fetch Metadata
Fetch details using local registries first, then provider lookup when needed.
instrument-reg fetch --isin US0378331005
instrument-reg fetch --symbol AAPL --price
fetch runs on treaty: piped output is a JSON envelope ({"ok", "data", "error", "warnings", "meta"}) with the result under data, and a terminal gets plain text. Failures have their own exit codes: 2 bad arguments, 5 no match, 79 a live-data provider is not installed. instrument-reg manifest and instrument-reg fetch --schema describe the command for agents.
Command Summary
resolve: resolve a query from local registries first, then external providersadd: add or update an instrument in an explicit user registry pathfetch: inspect provider details using local registry precedence firstlint: validate registry files and optionally verify live provider data
Programmatic Usage
You can use the registry in your Python scripts:
from pydantic_market_data.models import SecurityCriteria
from instrument_registry.registry import get_registry
# Initialize registry (loads bundled data + user data from env var)
reg = get_registry()
# 1. Resolve by ISIN
instrument = reg.find_by_isin("US0378331005")
if instrument:
print(f"Name: {instrument.name}, Currency: {instrument.currency}")
# 2. Search by identifier fields
criteria = SecurityCriteria(symbol="AAPL")
candidates = reg.find_candidates(criteria)
for c in candidates:
print(f"Found: {c.name} ({c.isin})")
# 3. Look up by provider symbol
# Note: Provider-symbol lookup requires the provider name
instrument = reg.find_by_ticker("yahoo", "AAPL")
Data Format (YAML)
instruments:
- name: AAPL
isin: US0378331005
instrument_type: Stock
asset_class: Stock
currency: USD
tickers:
yahoo: AAPL
validation_points:
- date: "2024-01-01"
price: 185.64
Contributing
- Bundled Data: Submit a PR to add common instruments to
src/instrument_registry/data/instruments/. - Providers: Implement new data sources in
src/instrument_registry/finder.pyby adding a class that implements theDataProviderprotocol.
Metadata
Release files for instrument-registry 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| instrument_registry-0.3.0.tar.gz | 29.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| instrument_registry-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 64.9 kB
Release files / instrument_registry-0.3.0.tar.gz
| Download URL | instrument_registry-0.3.0.tar.gz |
|---|---|
| Size | 29.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9f3d391bf48867aae591f09797e0f8d89d2a18b042158fd3263f21f540b401d5
|
|
BLAKE2b-256 checksum How to use checksums |
f04fbfc047810d6bb1f255ffbc41bf09460bfa62a568fc22ff22e84913b1572c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / instrument_registry-0.3.0-py3-none-any.whl
| Download URL | instrument_registry-0.3.0-py3-none-any.whl |
|---|---|
| Size | 35.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
07cd603b3c787fcd3fbcb8e439a22df20a7188a38b333303c6822dc25c243d4a
|
|
BLAKE2b-256 checksum How to use checksums |
1d0812dea88d5bc6ba3439daef298d106e4c6091063f6ee714b719d5e6d56b1b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|