Commit Graph
21 Commits
Author SHA1 Message Date
Jimmy7892 f2e2508198 bench: publish the run's start time, read from the run itself
publish.py records GITHUB_RUN_STARTED_AT, a variable Actions never sets,
so every published result had an empty run_started_at. The publish job
now asks `gh run view` for the run's startedAt, with actions: read to be
allowed to, and passes it through `date` so that only a date can reach
$GITHUB_ENV. A failed lookup leaves the field empty, as before.
2026-10-23 23:06:13 +02:00
Jimmy7892 1105240617 bench: pin plotly, the hole in the lock
plotly 7.0.0 landed on PyPI and removed the mapbox trace types that
vectorbt 0.28.4's template still references, so 'import vectorbt' died
before a single bar ran. plotly was the one transitive dependency the
lock did not cover; it does now, on 6.9.0, the last 6.x line. The
version printout includes it so the results stay comparable.
2026-10-23 23:06:12 +02:00
Jimmy7892 1e747b133a docs: drop the em dash 2026-10-23 23:06:12 +02:00
Jimmy7892 f4fdd81c90 examples: 25 runs without the Pro diagnostic 2026-10-23 23:06:12 +02:00
Jimmy7892 292d879d6a examples: 13 runs on the free tier 2026-10-23 23:06:12 +02:00
Jimmy7892 71b542fe4b release: v0.21.0 2026-10-23 23:06:12 +02:00
Jimmy7892 65910ba388 bench: print the measured size of every documented divergence
render() wrote the size of the first documented point and stopped, so a
run with three bracket_sl_tp timings published one measured line for
three rows. A divergence can grow with the number of bars, so each point
now gets its own line, as a list item, and the cause follows once.

test_report.py renders hand-built payloads and imports no engine.
2026-10-23 23:03:30 +02:00
Jimmy7892 a5f51e2fde docs: put Discord on its own line, and stop shipping a badge that says "missing"
Seven badges on one wrapped line buried the only one meant to be clicked. Discord
now sits alone above the rest, in the large style, and the second line keeps four
informational ones: PyPI, Python, Rust, benchmarks. Dropped the licence badge,
which repeated the LICENSE link already in the footer.

The pyversions badge was rendering "missing" in red, and it was right to. Every
published wheel carries NO `Programming Language :: Python :: 3.x` classifier:
crates/bt-python/pyproject.toml, the file maturin actually builds from, has no
`classifiers` field at all. The public pyproject.toml has one, but it does not
build anything, so its list never reached PyPI. `requires-python = ">=3.9"` is a
separate field and does not populate classifiers.

Replaced with a static "python 3.9+" badge, since PyPI cannot answer the question
for 0.18.0 whatever we ask it. The engine-side fix travels separately; once a
wheel ships with classifiers, PyPI's sidebar will list the versions too and this
can go back to being dynamic.
2026-08-22 05:05:00 +02:00
Jimmy7892 873524dae6 docs: normalise the speed figures on the published benchmark, document tf().apply and choice
The performance table was still quoting run #11 (manifoldbt 0.17.3), while the
site publishes run #13 (0.18.0) from the same workflow. Same shape, different
numbers, and the headline claim disagreed with the site by a few percent:
10M bars with the metric suite is 329 ms against 102.38 s, a factor of 311,
not 317 ms / 97.46 s / 308. Every row now comes from run 32469701489, the one
data/benchmark.json is synced from.

Added the stop-loss/take-profit bracket row, where raptorbt is level with us
(x1.0). It belongs next to the five-asset row for the same reason that one is
there: deciding which of the stop and the target triggers first is a sequential
intra-bar walk in both engines, so there is nothing left to vectorise. Publishing
only the workloads we win looks better and reads worse.

Qualified the backtrader figure. It is measured on a developer machine with a
different script, not on the CI runner, so quoting it beside a CI table implied a
comparability it does not have. It also no longer appears in the headline bullet:
the site makes no numeric backtrader claim, and the two engines are not doing the
same work.

Documented the two additions that were reachable but undocumented:
- tf("1h").apply(expr) evaluates on that timeframe's own grid, so periods count
  in ITS bars. The note warns about sma(tf("1h").close, 20), which looks
  equivalent and is not: it counts simulation bars over a step-held series, so
  on a 1m run it is a 20-minute smoothing of an hourly staircase.
- choice(name, {branch: expr}) makes a selector a grid axis.

Every snippet in these two sections was executed verbatim against the 0.19.0rc1
wheel before committing, including the warning, which was checked to actually
differ rather than asserted.

Header badges: PyPI version and Python versions (both live), Rust core, CUDA,
benchmarks-in-CI linking the workflow, and the licence.
2026-08-22 04:53:20 +02:00
Jimmy7892 4ad1c0d284 bench: attendre que PyPI serve la version au lieu d'echouer sur sa propagation
PyPI accepte un televersement bien avant que son index le serve. Mesure sur la
publication de 0.18.0: le televersement s'est termine a 01:48:18 et ce workflow
a demande la version a 01:48:50, trente-deux secondes plus tard, pour se faire
repondre "from versions: ..., 0.17.3".

Ce n'est pas un hasard de timing. Le workflow est declenche par
`release: published`, et cette release est creee juste apres le televersement:
la course est donc GARANTIE a chaque publication. Elle n'avait jamais pu se voir
parce que ce chemin n'avait jamais tourne sur une vraie release, seulement sur
des declenchements manuels ou la version existait depuis longtemps.

Les deux jobs attendent desormais que l'index serve la version, jusqu'a dix
minutes, contre soixante de budget. `--no-cache-dir` parce que pip met en cache
la reponse de l'index, y compris celle qui ne connait pas encore la version: sans
cela les tentatives suivantes reliraient la meme reponse perimee.

Logique verifiee sur quatre cas avant de pousser (disponible tout de suite,
disponible apres trois echecs, jamais disponible donc echec franc, et pas de
version imposee), plutot que de la decouvrir a la prochaine release.
2026-08-21 03:59:32 +02:00
Jimmy7892 48c1067bd0 docs: remove an outdated README section 2026-08-20 16:05:08 +02:00
Jimmy7892 72223ecad4 docs: add Bybit to the connector lists 2026-06-22 20:18:44 +02:00
Jimmy7892 8bfccbfd69 docs: document CSV import (loading-data section + example 18, examples 12-18) 2026-06-22 20:01:52 +02:00
Jimmy7892 e35d54875c chore: relicense from MIT to Apache 2.0 + Commons Clause
Source-available rather than fully OSI open-source. Use, modify and
self-host remain free. Reselling the software or running it as a paid
hosted service is now explicitly disallowed by the Commons Clause.
2026-04-29 04:07:32 +02:00
Jimmy7892 6ba4691a02 release: v0.4.6
- Cross-exchange backtesting (Pro)
- Dict universe format (provider-based symbol resolution)
- Exogenous data support (register_exo + exo() expressions)
- Provider-based data layout (binance/1h/TICKER.arrow)
- Preload fix for provider layout
- Exo column resampling for multi-resolution
- Pro gate for cross-exchange (clean exit)
- ATR/ADX rolling SMA fix
- Precise mode hybrid fills
2026-04-01 01:18:20 +02:00
Jimmy7892 4ee3431463 docs: update Community vs Pro table to match pricing 2026-03-18 03:43:41 +01:00
Jimmy7892 1fc9e8a382 sync: update Python package, examples, add CLI entry point 2026-03-18 03:03:40 +01:00
Jimmy7892 b917d7975d feat: add bt.ingest() and manifoldbt CLI for data ingestion
- Add ingest() function for downloading bar data from providers
- Add manifoldbt CLI entry point (manifoldbt ingest ...)
- Supported providers: binance, hyperliquid (free), databento, massive (Pro)
- Update type stubs for py_ingest
2026-03-18 02:53:28 +01:00
Jimmy7892 b71461c9a7 docs: improve README with real benchmarks, docs link, community vs pro table 2026-03-17 16:35:09 +01:00
Jimmy7892 c4e7e9abb4 fix: benchmark timestamp ns, vectorbt trade count x2, remove fake perf numbers from README 2026-03-17 16:23:22 +01:00
Jimmy7892 67ab17280b Initial commit: manifoldbt public repo
Python DSL, examples, docs, benchmarks, and tests.
Rust engine distributed as pre-compiled wheel via PyPI.
2026-03-17 16:15:40 +01:00