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.5.0.tar.gz (307.3 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.5.0-cp310-abi3-win_amd64.whl (633.6 kB view details)

Uploaded CPython 3.10+Windows x86-64

fundcloud-0.5.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (717.0 kB view details)

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

fundcloud-0.5.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (695.1 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

fundcloud-0.5.0-cp310-abi3-macosx_11_0_arm64.whl (668.7 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

fundcloud-0.5.0-cp310-abi3-macosx_10_12_x86_64.whl (687.1 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: fundcloud-0.5.0.tar.gz
  • Upload date:
  • Size: 307.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","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.5.0.tar.gz
Algorithm Hash digest
SHA256 eaf694efd99cf375aec2981a2f59cf49dd67d3603a438aa849dc9bf89dd27315
MD5 3842088d87dadd19cecb0a93c2e5d875
BLAKE2b-256 e1dbfe7bdace87d42154646e1ae3b4c1404600aa1160554abeae9dfb67e3553a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fundcloud-0.5.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 633.6 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","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.5.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 ad4ce0c4b423ed9cb0ef5736a62517018d54b0fa71455f931714ddda876f0c2d
MD5 9df7587442d984fd943cfad801bac9e7
BLAKE2b-256 e41a2af1232f89d028f24dfd6de938b3d9bc6684a00c9c22a4cbe54ccfe5de75

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fundcloud-0.5.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 717.0 kB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","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.5.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ee3755886bc494f413c9e8ddda225f653b5ee0e3d9f8185b032b5459695bc28c
MD5 21628c9923319bf436c3ee9e5e9caed4
BLAKE2b-256 d24df583b2c7adecb6a0224929be553fd81818b7a5a494bfd512c945be89cf2f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fundcloud-0.5.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 695.1 kB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","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.5.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1d3d4bb993c8add3e825488d2c5c09c66da0ddfae04b088941317652b226e411
MD5 07753e3319bfd24e3068d787923f7040
BLAKE2b-256 4b9ae1fd3efbca4467792f619ccc030167d407beacde2c44907bfc3aa09cb9bd

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fundcloud-0.5.0-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 668.7 kB
  • Tags: CPython 3.10+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","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.5.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b70c1c2f7ed4d7ec1a4b142cb0fb8a679a7f7a5ddaa585ea224f3bfca815998c
MD5 5f9fcf1b1e9307760906b6e295d8f08d
BLAKE2b-256 405bc9429bf05d475fc1cc12eaabc4ab35d16289d9f7413fdcfbb0db67cb027f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fundcloud-0.5.0-cp310-abi3-macosx_10_12_x86_64.whl
  • Upload date:
  • Size: 687.1 kB
  • Tags: CPython 3.10+, macOS 10.12+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","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.5.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 86b58ca4a74c2cb30869792720a935f9e6df0ffd7aa4ec1b920ac259d5b38d91
MD5 18f745681a208b3eed79f647362212b1
BLAKE2b-256 5f2eab20ddabe849b3d1677c17289b16613eaea452f0a6f58bf5870d60a62208

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