Fundcloud
Portfolio research, end-to-end, with a Rust core.
Fundcloud is a beginner-friendly, headless-for-advanced portfolio research framework. One install covers returns and risk analytics, drawdown analysis, portfolio optimisation, vectorised backtesting, technical indicators, purged cross-validation, multi-source market data loading, exploratory analysis, and HTML/PDF/Excel tear sheets — through 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.
Release files for fundcloud 0.8.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fundcloud-0.8.0.tar.gz | 314.4 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| fundcloud-0.8.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 3.7 MB
Release files / fundcloud-0.8.0.tar.gz
| Download URL | fundcloud-0.8.0.tar.gz |
|---|---|
| Size | 314.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3cfb1d9c40c10c8490da63e28c523d9290e0589421c23c3e4385566975b0c141
|
|
BLAKE2b-256 checksum How to use checksums |
10c8020743a8f4d011444e66c93bef7c22314485f87008df512dc573734aee5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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}
|
Release files / fundcloud-0.8.0-cp310-abi3-win_amd64.whl
| Download URL | fundcloud-0.8.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 635.1 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
3a051ad224bbe9db948ef10d4811ec3e33dcf5d2afa7bfdbe3daafd9986e5d6c
|
|
BLAKE2b-256 checksum How to use checksums |
4927999e5d352638a0916a556283bae5c916f716f85fc4b991159bf46318283a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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}
|
Release files / fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 718.1 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
9454c7a04fb4d3804b52f6d5f01bf297468e8af1a0a8e344b9cd61ce7cbcae3a
|
|
BLAKE2b-256 checksum How to use checksums |
718ebf340482a67301a20ab38bf8bc1c8053480b4e9dab0daed9b44be81b42af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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}
|
Release files / fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 695.8 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
aa7f73a8310fb6a38d339be65c36ece3371b51651f184f2286058311df890a0c
|
|
BLAKE2b-256 checksum How to use checksums |
4ad7f62a09bc1f1d5139524a435afd0b1258c1bf9c7d42f50d615d4acd5cfa72
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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}
|
Release files / fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 669.1 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
54ff6b3458ffca0c970ca65e12430626289911aef45612462116434fd1b1f7b8
|
|
BLAKE2b-256 checksum How to use checksums |
aa54893acad5e3dfd079aafe6bd441b1584b4bc50e53030810a42db4a16514ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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}
|
Release files / fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 687.9 kB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
b8dffd221df3c87419826f1412bf50ad8205d593667b11441e53b9a5211e24f3
|
|
BLAKE2b-256 checksum How to use checksums |
0cce049d017add41166536cab8564eba739e8beb7e39f7b58bfaeae4af6538ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.18 {"installer":{"name":"uv","version":"0.11.18","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}
|