Portfolio research, end-to-end, with a Rust core.
Project description
Fundcloud
Portfolio research, end-to-end, with a Rust core.
Fundcloud is a beginner-friendly, headless-for-advanced portfolio research framework. One install replaces the usual stack of quantstats + pyportfolioopt + skfolio + vectorbt + xlsxwriter, with a coherent .fc pandas surface for beginners and a full sklearn-compatible estimator API for advanced users. Matrix-heavy math lives in a Rust core via PyO3 and ships as a single abi3 wheel per platform.
Install
uv add fundcloud # core
uv add "fundcloud[data]" # + all network data providers (yf, fmp, av, binance)
uv add "fundcloud[pf,ta,data]" # + skfolio + TA-Lib + data sources
uv add "fundcloud[all]" # everything
| Extra | Adds |
|---|---|
pf |
skfolio — portfolio optimisation |
ta |
TA-Lib — 170+ technical indicators |
data-yf / data-fmp / data-av / data-bn |
individual data providers |
data |
bundle of every data provider above |
viz |
matplotlib + kaleido (static plot export) |
reports |
WeasyPrint (PDF) + XlsxWriter (Excel) |
all |
everything above |
Exploratory data analysis (fundcloud.explore.{profile, compare, quickview}) ships in core — no extra needed.
Quickstart (60 seconds)
import pandas as pd
import fundcloud # registers the .fc accessor on pandas
# Any returns Series gets instant analytics
returns = pd.Series([0.012, -0.005, 0.008, -0.010, 0.015], name="strategy")
returns.fc.sharpe(periods=252) # annualised Sharpe
returns.fc.max_drawdown()
returns.fc.drawdown_series()
# Purged CV that plugs into sklearn out of the box
from fundcloud.validate import PurgedKFold
from sklearn.model_selection import cross_val_score
cv = PurgedKFold(n_splits=5, purge=3, embargo=1)
# cross_val_score(estimator, X, y, cv=cv) # drop-in
The library ships DCA/Hold strategies, a simulator, skfolio-backed optimisers, native EDA, and HTML/PDF/Excel tear sheets out of the box. Prefer one composed figure over a full report? fundcloud.plots.summary(returns) returns a multi-panel plotly.graph_objects.Figure (cumulative, drawdown, rolling Sharpe, distribution, monthly heatmap) with Plotly theme support via fc.set_theme("dark") (re-exported at the top level for import fundcloud as fc); every builder also accepts multi-asset DataFrames so comparisons stay one line.
sklearn & skfolio interop
Every Fundcloud estimator, transformer, and CV splitter passes sklearn.utils.estimator_checks.check_estimator and round-trips through skfolio. Example:
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from fundcloud.features import FeaturePipeline
from fundcloud.features.indicators import RSI, SMA
from fundcloud.optimize import MeanRisk, RiskMeasure
from fundcloud.validate import PurgedKFold
pipe = Pipeline([
("features", FeaturePipeline([("rsi", RSI(timeperiod=14)), ("sma", SMA(timeperiod=20))])),
("optim", MeanRisk(risk_measure=RiskMeasure.CVAR)),
])
search = GridSearchCV(pipe, param_grid={"optim__min_weights": [0.0, 0.02, 0.05]},
cv=PurgedKFold(n_splits=5, purge=3))
search.fit(returns_panel)
Architecture
┌────────────────────────────────────────────────────────────────────┐
│ End-user surfaces: fluent accessor .fc | estimator API │
├───────────────┬──────────────┬───────────────┬──────────────────────┤
│ reports │ explore │ plots │ datasets │
├───────────────┴──────────────┴───────────────┴──────────────────────┤
│ metrics │ validate │ optimize │
├──────────────────────────┬──────────────────────────────────────────┤
│ portfolio │ sim │
├──────────────────────────┼──────────────────────────────────────────┤
│ strategies │ features │
├──────────────────────────┴──────────────────────────────────────────┤
│ data │
│ Backends (YF, FMP, …, Parquet, DuckDB, Memory, CSV) ─ Catalog │
├─────────────────────────────────────────────────────────────────────┤
│ kernels (Rust, PyO3, abi3) │
└─────────────────────────────────────────────────────────────────────┘
Python compatibility
Supported on Python 3.10, 3.11, 3.12, 3.13, 3.14. Wheels are built with PyO3's abi3-py310 feature, so one wheel per platform works across every supported version.
Acknowledgments
Fundcloud stands on the shoulders of excellent open-source work:
- scikit-learn (BSD-3-Clause) — estimator, transformer, and CV-splitter contracts used throughout.
- skfolio (BSD-3-Clause) — portfolio optimisation algorithms;
Portfolio/Populationobjects. Install withuv add 'fundcloud[pf]'. - quantstats (Apache-2.0) — inspiration for our tear-sheet and pandas-accessor design.
- vectorbt (Apache-2.0) and vectorbt.pro — inspiration for the vectorised simulation model.
- TA-Lib / ta-lib-python (BSD-2-Clause) — all 170+ technical indicators in
fundcloud.features.indicators. - PyO3, rust-numpy, maturin, uv — the build-and-ship story.
See NOTICE for the full attribution.
Contributing
Read CONTRIBUTING.md. TL;DR: uv sync, uv run pytest, cargo test --workspace, add a test, open a PR.
License
MIT.
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 Distributions
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 fundcloud-0.3.0.tar.gz.
File metadata
- Download URL: fundcloud-0.3.0.tar.gz
- Upload date:
- Size: 197.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
21d7dcd465ad185c0242d1f768688012353bec758b7c7d794ff449c0258eafb0
|
|
| MD5 |
be8c4b66a467100f5f9ed0b801435e47
|
|
| BLAKE2b-256 |
d776a87f7b5849e7bdeb1585cd5c54b02a99367a6e9530a0b237eb7bb65e10ad
|
File details
Details for the file fundcloud-0.3.0-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: fundcloud-0.3.0-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 473.7 kB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
8bfd6f46457469ad8373393599adcd531f328626747861a992d5548e2a8f46cc
|
|
| MD5 |
153583c44a72e1a16ee2f59360f0b61b
|
|
| BLAKE2b-256 |
00c19869683bb914993d9971adc3c3e479adc1bd69fc1813e4902ec77697db0e
|
File details
Details for the file fundcloud-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: fundcloud-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 558.8 kB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
aad8e274dc1d43c0a8c1089b254ef428751db81a6d756b32e8765c047191d6ea
|
|
| MD5 |
e651f664e3fe97c1a059643e1c524b63
|
|
| BLAKE2b-256 |
38ee71ed5d7e1efb703f29eb1034a9eeddbf67e2e53d3ef38a773fb28b9e4ecd
|
File details
Details for the file fundcloud-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: fundcloud-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 546.1 kB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
7ef2036aaa09cbd076e20a4c9f9a6ce995a35243157f2cdbf04a33f091ebe967
|
|
| MD5 |
e8fe2975b6d6fc74cf0e3def5c8bca97
|
|
| BLAKE2b-256 |
44b959c51a039e6c1d93717fe6f76c446ed0eac5d92bca72b774ce32497c33ed
|
File details
Details for the file fundcloud-0.3.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: fundcloud-0.3.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 519.8 kB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
a28a1120bd059483fd41b8e480da7c79997ace5f999b0382ce64d0866bf65184
|
|
| MD5 |
01a746e71a968310d746d4967195e155
|
|
| BLAKE2b-256 |
32eae55960e8866bb9468c3bf7d7c17799b5183203d5f6a1b665072468293e70
|
File details
Details for the file fundcloud-0.3.0-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: fundcloud-0.3.0-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 529.0 kB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
f8f3def233ed15af3ecfcb5139bf3e8a101fe1377b70a7621576f27deedb5494
|
|
| MD5 |
9c69ff603ab2bdb968bec27a5ab7174a
|
|
| BLAKE2b-256 |
0145ccbeea92ed6f5cf8c9e81b2c5b4de88973342a5c33fb59eb357ff02a3b41
|