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.
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| fundcloud-0.8.0.tar.gz | 314.4 kB | Without provenance | Details for fundcloud-0.8.0.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| fundcloud-0.8.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details for fundcloud-0.8.0-cp310-abi3-win_amd64.whl |
| 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 for fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
| fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details for fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
| fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details for fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl |
| fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details for fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl |
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}
|
Security for fundcloud 0.8.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.