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
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
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.2.14
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.2.14.tar.gz | 27.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| instrument_registry-0.2.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 60.8 kB
Release files / instrument_registry-0.2.14.tar.gz
| Download URL | instrument_registry-0.2.14.tar.gz |
|---|---|
| Size | 27.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7d54ef1045f354785b73b7c422b77ad31ae55528dc245955cf9f3a2ee068deec
|
|
BLAKE2b-256 checksum How to use checksums |
7ef01ef39de646e485cf0b7c051d5c990913788c16484ca54aa8ef5f9feada92
|
| 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.2.14-py3-none-any.whl
| Download URL | instrument_registry-0.2.14-py3-none-any.whl |
|---|---|
| Size | 33.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
06b2bb5d5e68573c58d97c1e54398c082feff807f9bc2ee955acf406f10c9779
|
|
BLAKE2b-256 checksum How to use checksums |
32a3fe11fbcc3879b13477e0f38ce294b122c7cc11c26bf2adabb531849014bd
|
| 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}
|