Skip to main content

Pipefolio: A Pipeline-Oriented Portfolio Optimization Framework

logo

About the project

Pipefolio is a Python-based portfolio optimization framework designed with a pipeline-oriented approach. While several excellent Python libraries for portfolio optimization already exist—such as PyPortfolioOpt, Riskfolio-Lib, and skfolio—Pipefolio takes a different direction.

Built on top of scikit-learn, Pipefolio leverages existing optimization algorithms while minimizing boilerplate code through the use of the pipe (|) operator, enabling a streamlined and efficient workflow.

The framework provides the following types of models, each serving a specific purpose in the portfolio optimization process:

  • Selector
    Screens assets to narrow down the investment universe.

  • Transformer
    Transforms and preprocesses data to ensure compatibility with optimization models.

  • Optimizer
    Implements portfolio optimization algorithms to generate optimal allocations.

  • Adaptor
    Extracts and formats the optimized weights for further analysis or implementation.

Getting started

Installation

pip install pipefolio

Documentation

Usages

This example download stock data using yfinance.

import yfinance as yf
from pipefolio.adaptor import WeightMappingAdaptor, WeightArrayAdaptor
from pipefolio.data import DataPlaceHolder
from pipefolio.enums import RiskMetric, SelectMode
from pipefolio.optimizer import (
    EqualWeightOptimizer,
    InverseVolatilityOptimizer,
    RiskAverseOptimizer,
)
from pipefolio.selector import (
    AnnualVolatilitySelector,
    AverageTradeValueSelector,
    TotalReturnSelector,
)
from pipefolio.transformer import PriceToReturnTransformer

# download data via yfinance
data = yf.download(
    ["AAPL", "AMZN", "NVDA", "BRK-B", "KO", "JNJ", "TSLA", "GS", "WMT", "MCD"],
    period="1y",
    interval="1d",
)

# data must be wrapped by DataPlaceHolder
data = DataPlaceHolder.from_dataframe(data)

# pipeline -> return optimized weights
(
    data
    | AverageTradeValueSelector(5)  # selector
    | PriceToReturnTransformer()  # transformer
    | InverseVolatilityOptimizer()  # optimizer
    | WeightMappingAdaptor()  # adaptor
)
# {'NVDA': np.float64(0.10316247719888795),
#  'TSLA': np.float64(0.08487498757904818),
#  'AAPL': np.float64(0.24167068511508258),
#  'AMZN': np.float64(0.19489272842965072),
#  'BRK-B': np.float64(0.3753991216773305)}


# chaining multiple selectors
(
    data
    | AverageTradeValueSelector(8, SelectMode.LARGEST)
    | TotalReturnSelector(5, SelectMode.LARGEST)
    | AnnualVolatilitySelector(3, SelectMode.SMALLEST)
    | PriceToReturnTransformer()
    | EqualWeightOptimizer()
    | WeightMappingAdaptor()
)
# {'WMT': np.float64(0.3333333333333333),
#  'GS': np.float64(0.3333333333333333),
#  'AMZN': np.float64(0.3333333333333333)}


# with different adaptor
(
    data
    | PriceToReturnTransformer()
    | RiskAverseOptimizer(RiskMetric.STANDARD_DEVIATION, risk_aversion=2)
    | WeightArrayAdaptor()
)
# array([6.38077192e-02, 1.94597392e-02, 1.59637665e-01, 9.15442233e-03,
#        1.94553086e-01, 2.87905182e-01, 3.25055500e-02, 6.43214713e-02,
#        2.21196278e-09, 1.68655163e-01])

Supported Models

  • Selector
    • AnnualVolatilitySelector
    • AverageTradeValueSelector
    • TotalReturnSelector
  • Transformer
    • PriceToReturnTransformer
  • Optimizer
    • EqualWeightOptimizer
    • InverseVolatilityOptimizer
    • MaxRatioOptimizer
    • MaxReturnOptimizer
    • MinRiskOptimizer
    • RiskAverseOptimizer
  • Adaptor
    • WeightArrayAdaptor
    • WeightMappingAdaptor

License

Distributed under the MIT License. See LICENSE for more information.

Maintainers

pipefolio is currently maintained by kfuangsung (kachain.f@outlook.com).

Acknowledgments

  • skfolio: Python library for portfolio optimization built on top of scikit-learn.
  • PyPortfolioOpt: Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity.
  • Riskfolio-Lib: Portfolio Optimization and Quantitative Strategic Asset Allocation in Python.

Metadata

Release files for pipefolio 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pipefolio 0.0.1
File Size Uploaded
pipefolio-0.0.1.tar.gz 322.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pipefolio 0.0.1
File Interpreter ABI Platform
pipefolio-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 342.6 kB

Release files / pipefolio-0.0.1.tar.gz

Download URL pipefolio-0.0.1.tar.gz
Size 322.0 kB
Tags Source
SHA-256 checksum
How to use checksums
7bdeac1432aebf9d458b2dde4228c09b9519348141d6fc5d0cb8fff9be3a915d
BLAKE2b-256 checksum
How to use checksums
c4e7e6d388f3bdf3a06c484c83cbea9cfbe960b74e4bfb964839d10fc71f73b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.8

Release files / pipefolio-0.0.1-py3-none-any.whl

Download URL pipefolio-0.0.1-py3-none-any.whl
Size 20.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
54c2476d225d2efd4a3b2aa9738c8a5e16b554bbf24f34336e92530749a635f9
BLAKE2b-256 checksum
How to use checksums
3e9047c604fc2ad82fd9dc090e43e2abd2831e90f2d86d08659cbfc8e83afbbf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.0.1 CPython/3.12.8

Release history Release notifications | RSS feed

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page