Resolve and maintain canonical financial instrument records from ISINs, symbols, and names
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file instrument_registry-0.2.6.tar.gz.
File metadata
- Download URL: instrument_registry-0.2.6.tar.gz
- Upload date:
- Size: 24.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
36320deeaa486dc17912eabdbb6c813708796bfbdb149089bb5a512886ea68e7
|
|
| MD5 |
47f36a321554becc3b47e6ebe5b4ac06
|
|
| BLAKE2b-256 |
c32d221b1a85c5bf4b925ce0e2ba4c86b41f6de297f126b1f83cbc3bff36382a
|
File details
Details for the file instrument_registry-0.2.6-py3-none-any.whl.
File metadata
- Download URL: instrument_registry-0.2.6-py3-none-any.whl
- Upload date:
- Size: 31.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b48d5444fd9cdc0a30ccedbbaf8425a6d3dbdca56b77e27bf692b8942bb88381
|
|
| MD5 |
704fb8649f80316bcaa50fcbdc737089
|
|
| BLAKE2b-256 |
968ad85ae628a76532cca1d1fccaf069a815e62264f16ccd37eabdce28fcf165
|