brasa
Extract finance market data from brazillian financial institutions: B3, ANBIMA, Tesouro Direto, CVM.
Installation
Install from PyPI (published as brasa-marketdata; the import name is still brasa):
pip install brasa-marketdata
Or directly from GitHub (latest main):
pip install git+https://github.com/wilsonfreitas/brasa.git
With uv:
uv add brasa-marketdata
uv add git+https://github.com/wilsonfreitas/brasa.git
Data directory (brasa init / BRASA_DATA_PATH)
brasa stores everything — raw downloads, parsed parquet, and the metadata DB — under a single brasa home. On a fresh install, configure it once:
brasa init
This suggests a platform default (e.g. ~/.local/share/brasa on Linux),
lets you confirm or type another path, and persists the choice in
~/.config/brasa/config.toml. Non-interactive variants:
brasa init --data-path /data/brasa # explicit path, no prompt
brasa init --yes # accept the default, no prompt
The BRASA_DATA_PATH environment variable, when set, always takes
precedence over the config file — useful for CI, containers, tests, and
one-off overrides. Commands that read or write data fail with a clear
error until one of the two is configured; template introspection commands
(list-templates, deps, graph) work without any configuration.
Changelog
Deterministic Download Status Codes
Every download attempt is now classified with a single, unambiguous status code
persisted in the download_trials table:
| Symbol | Name | Trigger |
|---|---|---|
. |
PASSED | Successful download |
F |
FAILED | Expected failure (DownloadException) |
E |
ERROR | Unexpected exception |
S |
SKIPPED | Skipped (cache hit / invalid / duplicated) |
D |
DUPLICATED | Raw folder already exists |
I |
INVALID | Content validation failure |
W |
WARNING | Success with warnings |
DB migration: Existing caches are upgraded automatically on startup.
Legacy downloaded=1 rows become PASSED; downloaded=0 become FAILED.
(The standalone migration script has been removed after being applied; it is
recoverable from git history if ever needed.)
See docs/USER_GUIDE.md for full details.
Import Local Files (import_marketdata / brasa import)
Files with no download URL — a one-off vendor file, a manually-provided upload,
or a corrected file for backfill — can now be imported using the same
validate → gzip → checksum-dedup → parse → store engine as download. Only
the acquisition step changes: bytes are read from disk instead of HTTP.
# Backfill a single date into a template that normally downloads via HTTP
brasa import b3-cotahist-daily --path /data/backfill/COTAHIST_D02012024.TXT --arg refdate=2024-01-02
# Bulk import one file per business day using a date pattern
brasa import my-daily-template --path '/data/prices/%Y-%m-%d.csv' --arg refdate=@2026-06-01:2026-06-30
from brasa import import_marketdata
import_marketdata("b3-cotahist-daily", path="/data/backfill/COTAHIST_D02012024.TXT", refdate="2024-01-02")
See docs/CLI.md, docs/API_REFERENCE.md, and docs/TEMPLATES.md for full details.
Publishing to PyPI
brasa is built with hatchling and published manually
under the distribution name brasa-marketdata (the PyPI name brasa was
already taken by an unrelated project; import brasa is unaffected).
Templates and SQL DDL are bundled inside the package (brasa/files/), so the
built wheel is self-contained.
-
Bump
versioninpyproject.toml. -
Build the wheel and sdist:
uv buildDistributions are written to
dist/. -
(Optional) Verify the wheel bundles the data files:
BRASA_BUILD_TEST=1 uv run pytest tests/test_packaging_wheel.py -v
-
(Optional) Smoke-test in a clean environment:
python -m venv /tmp/brasa-smoke /tmp/brasa-smoke/bin/pip install dist/brasa_marketdata-*.whl /tmp/brasa-smoke/bin/python -c "import brasa; from brasa.engine.template import list_templates; print(len(list_templates()))"
-
Publish:
# TestPyPI dry-run first (recommended) uv publish --publish-url https://test.pypi.org/legacy/ --token "$TEST_PYPI_TOKEN" # Production uv publish --token "$UV_PUBLISH_TOKEN"
A PyPI API token can be supplied via
--token, theUV_PUBLISH_TOKENenvironment variable, or~/.pypirc.
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 brasa_marketdata-0.3.0.tar.gz.
File metadata
- Download URL: brasa_marketdata-0.3.0.tar.gz
- Upload date:
- Size: 197.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3ea9c58a6a916f54a0f6709b918c913f69181ec116b90e76fc27339d3830dcf9
|
|
| MD5 |
5dd71cf9e9d21e7a2c8cadf78d6c9d0e
|
|
| BLAKE2b-256 |
6f9072d1e7903f91acb33a69ed0c8b7bb22569289262f7ae0be06e94fd8f6a6b
|
File details
Details for the file brasa_marketdata-0.3.0-py3-none-any.whl.
File metadata
- Download URL: brasa_marketdata-0.3.0-py3-none-any.whl
- Upload date:
- Size: 275.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
50cf9025d5891f6e11c1179fbce5d35adaf1ca4366bc88283c55dcad9b19fd02
|
|
| MD5 |
eae6741f98a149ffd19bd6be74db4636
|
|
| BLAKE2b-256 |
186d79d660e1003ab4df4ee9bddc0f693f50d33410cff26ee80ecdffbd7dc57c
|