The project expects local credentials in:
private/config.toml
This file is gitignored and should never be committed.
[eodhd]
api_key = "YOUR_EOD_TOKEN"
fundamentals_requests_per_minute = 950
fundamentals_daily_buffer_calls = 5000
market_data_requests_per_minute = 950
market_data_daily_buffer_calls = 5000Use this for:
refresh-supported-exchanges --provider EODHDrefresh-supported-tickers --provider EODHDingest-fundamentals --provider EODHDreport-fundamentals-progress --provider EODHDupdate-market-data --provider EODHDreport-market-data-progress --provider EODHD- EODHD exchange-scoped and all-supported workflows
Optional EODHD throttling and quota settings:
fundamentals_requests_per_minute: default950, capped at the EODHD limit of1000; used byingest-fundamentals --provider EODHDwhen the scope spans many symbolsfundamentals_daily_buffer_calls: default5000, reserved from the shared daily call budget so fundamentals ingestion stops early instead of consuming the full allowancemarket_data_requests_per_minute: default950, capped at the EODHD limit of1000; used byupdate-market-data --provider EODHDacross both exchange-bulk and per-symbol market-data requestsmarket_data_daily_buffer_calls: default5000, reserved from the shared daily call budget so market-data refresh stops early instead of consuming the full allowance
FX behavior is configured under an optional [fx] section:
[fx]
provider = "EODHD"
pivot_currencies = "USD, EUR, GBP"
stale_warning_days = 7Settings:
provider: defaultEODHD(the only supported FX provider)pivot_currencies: ordered, comma-separated triangulation pivots tried after the direct/inverse lookup path, defaultUSD, EUR, GBP. Order encodes preference: when triangulated candidates tie on rate date, the earlier pivot wins. GBP is included by default because several frontier currencies (e.g. PGK) have deep GBP crosses but little or no USD/EUR history. An absent or empty option falls back to the default list.stale_warning_days: warn when the selected on-or-before rate is older than this many days
FX semantics:
refresh-fx-ratesis the only FX command that talks to a remote provider- stored rates are always
1 base_currency = rate quote_currency - configured subunit currencies are normalized before lookup:
GBX/GBP0.01->GBP,ZAC->ZAR,ILA->ILS - lookups use latest available rate on or before the requested date
- direct provider rows are persisted; inverse and triangulated cross-rates are computed at lookup time, not stored
- euro legacy currencies (ATS, BEF, DEM, ESP, FIM, FRF, IEP, ITL, LUF, NLG,
PTE, GRD, SIT, CYP, MTL, SKK, EEK, LVL, LTL, HRK) convert through their
irrevocable statutory rates (Council Regulation (EC) No 2866/98 and
successors), served from code (
EURO_LEGACY_FIXED_RATES) for any date on or after each currency's euro adoption -- exact by law, never stored, and refused before the adoption date. KeepEURamongpivot_currencies: legacy-to-non-EUR crosses (e.g.IEP -> GBP,FRF -> DEM) compose the statutory leg with market legs through the EUR pivot normalize-fundamentalsuses only stored FX data and never performs runtime FX fetches
Most commands accept:
--database <path>
If omitted, the default is:
data/pyvalue.db
Use a separate database path when you want to:
- test workflows without touching your main dataset
- compare providers or exchanges independently
- keep one database per region or strategy
- Keep secrets in
private/config.tomlor environment variables only. - Do not commit tokens or personal
User-Agentstrings. - Prefer EODHD for most workflows because market data always comes from EODHD anyway.