Skip to main content

Portfolio research, end-to-end, with a Rust core.

Project description

Fundcloud

Portfolio research, end-to-end, with a Rust core.

PyPI Python License: MIT CI Coverage Docs Ruff uv

Fundcloud library overview

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/Population objects. Install with uv 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fundcloud-0.8.0.tar.gz (314.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fundcloud-0.8.0-cp310-abi3-win_amd64.whl (635.1 kB view details)

Uploaded CPython 3.10+Windows x86-64

fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (718.1 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (695.8 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl (669.1 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl (687.9 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file fundcloud-0.8.0.tar.gz.

File metadata

  • Download URL: fundcloud-0.8.0.tar.gz
  • Upload date:
  • Size: 314.4 kB
  • Tags: Source
  • Uploaded using 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}

File hashes

Hashes for fundcloud-0.8.0.tar.gz
Algorithm Hash digest
SHA256 3cfb1d9c40c10c8490da63e28c523d9290e0589421c23c3e4385566975b0c141
MD5 84137da22c559c1d0dcab643a69e8446
BLAKE2b-256 10c8020743a8f4d011444e66c93bef7c22314485f87008df512dc573734aee5c

See more details on using hashes here.

File details

Details for the file fundcloud-0.8.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: fundcloud-0.8.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 635.1 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using 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}

File hashes

Hashes for fundcloud-0.8.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 3a051ad224bbe9db948ef10d4811ec3e33dcf5d2afa7bfdbe3daafd9986e5d6c
MD5 027d585f59030f123d9e005b0264a7c1
BLAKE2b-256 4927999e5d352638a0916a556283bae5c916f716f85fc4b991159bf46318283a

See more details on using hashes here.

File details

Details for the file fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 718.1 kB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
  • Uploaded using 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}

File hashes

Hashes for fundcloud-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9454c7a04fb4d3804b52f6d5f01bf297468e8af1a0a8e344b9cd61ce7cbcae3a
MD5 5ad8a5c9941bd713148bdae3f7aabdff
BLAKE2b-256 718ebf340482a67301a20ab38bf8bc1c8053480b4e9dab0daed9b44be81b42af

See more details on using hashes here.

File details

Details for the file fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 695.8 kB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
  • Uploaded using 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}

File hashes

Hashes for fundcloud-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 aa7f73a8310fb6a38d339be65c36ece3371b51651f184f2286058311df890a0c
MD5 c81a1c3825b91f855fbd8160b179a6fa
BLAKE2b-256 4ad7f62a09bc1f1d5139524a435afd0b1258c1bf9c7d42f50d615d4acd5cfa72

See more details on using hashes here.

File details

Details for the file fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 669.1 kB
  • Tags: CPython 3.10+, macOS 11.0+ ARM64
  • Uploaded using 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}

File hashes

Hashes for fundcloud-0.8.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 54ff6b3458ffca0c970ca65e12430626289911aef45612462116434fd1b1f7b8
MD5 3fbdcccd4cc65f457f649cfe3e558308
BLAKE2b-256 aa54893acad5e3dfd079aafe6bd441b1584b4bc50e53030810a42db4a16514ac

See more details on using hashes here.

File details

Details for the file fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

  • Download URL: fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl
  • Upload date:
  • Size: 687.9 kB
  • Tags: CPython 3.10+, macOS 10.12+ x86-64
  • Uploaded using 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}

File hashes

Hashes for fundcloud-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b8dffd221df3c87419826f1412bf50ad8205d593667b11441e53b9a5211e24f3
MD5 c9c9898d803ee0866a9824071f373413
BLAKE2b-256 0cce049d017add41166536cab8564eba739e8beb7e39f7b58bfaeae4af6538ab

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page