Skip to main content

CVXportfolio on PyPI linting: pylint Coverage Status Documentation Status GPLv3 Anaconda-Server Badge

Cvxportfolio is an object-oriented library for portfolio optimization and back-testing. It implements models described in the accompanying paper.

The documentation of the library is at www.cvxportfolio.com.

News:

Since end of 2023 we’re running daily example strategies using the development (master) branch.; each day we commit target weights and initial holdings to the repository. All the code that runs them, including the cron script, is in the repository.

Installation

Cvxportolio is written in Python and can be installed in any Python environment by simple:

pip install -U cvxportfolio

You can see how this works on our Installation and Hello World Youtube video. Anaconda installs are also supported.

Cvxportfolio’s main dependencies are CVXPY for interfacing with numerical solvers and Pandas for interfacing with databases. We don’t require any specific version of our dependencies and test against all recent ones (up to a few years ago).

Advanced: install development version

You can also install the development version (pre-release) from the current state of the master branch of the repository. It is tested daily by the example strategies.

pip install --upgrade --force-reinstall git+https://github.com/cvxgrp/cvxportfolio@master

Test

After installing you can run our unit test suite in you local environment by

python -m cvxportfolio.tests

We test against recent Python versions (3.8, 3.9, 3.10, 3.11, 3.12) and recent versions of the main dependencies (from Pandas 1.4, CVXPY 1.1, …, up to the current versions) on all major operating systems. You can see the automated testing code.

If you use Cvxportfolio in an environment without internet access you can run the test suite ignoring the cvx.errors.DownloadError thrown by the few unit tests that use the internet:

python -m cvxportfolio.tests --ignore-download-errors

Simple example

In the following example market data is downloaded by a public source (Yahoo finance) and the forecasts are computed iteratively, at each point in the backtest, from past data.

import cvxportfolio as cvx

gamma = 3       # risk aversion parameter (Chapter 4.2)
kappa = 0.05    # covariance forecast error risk parameter (Chapter 4.3)
objective = cvx.ReturnsForecast() - gamma * (
    cvx.FullCovariance() + kappa * cvx.RiskForecastError()
) - cvx.StocksTransactionCost()
constraints = [cvx.LeverageLimit(3)]

policy = cvx.MultiPeriodOptimization(objective, constraints, planning_horizon=2)

simulator = cvx.StockMarketSimulator(['AAPL', 'AMZN', 'TSLA', 'GM', 'CVX', 'NKE'])

result = simulator.backtest(policy, start_time='2020-01-01')

# print back-test result statistics
print(result)

# plot back-test results
result.plot()

At each point in the back-test, the policy object only operates on past data, and thus the result you get is a realistic simulation of what the strategy would have performed in the market. Returns are forecasted as the historical mean returns and covariances as historical covariances (both ignoring np.nan’s). The simulator by default includes holding and transaction costs, using the models described in the paper, and default parameters that are typical for the US stock market.

Other examples

Many examples are shown in the documentation website, along with their output and comments.

Even more example scripts are available in the code repository.

We show in the example on user-provided forecasters how the user can define custom classes to forecast the expected returns and covariances. These provide callbacks that are executed at each point in time during the back-test. The system enforces causality and safety against numerical errors. We recommend to always include the default forecasters that we provide in any analysis you may do, since they are very robust and well-tested.

We show in the examples on DOW30 components and wide assets-classes ETFs how a simple sweep over hyper-parameters, taking advantage of our sophisticated parallel backtest machinery, quickly provides results on the best strategy to apply to any given selection of assets.

Similar projects

There are many software projects for portfolio optimization and back-testing. Some notable ones in the Python ecosystem are Zipline, which implements a call-back model for back-testing very similar to the one we provide, Riskfolio-Lib which implements (many!) portfolio optimization models and also follows a modular approach like ours, VectorBT, a back-testing library well-suited for high frequency applications, PyPortfolioOpt, a simple yet powerful library for portfolio optimization that uses well-known models, YFinance, which is not a portfolio optimization library (it only provides a data interface to Yahoo Finance), but used to be one of our dependencies, and also CVXPY by itself, which is used by some of the above and has an extensive set of examples devoted to portfolio optimization (indeed, Cvxportfolio was born out of those).

Contributions

We welcome contributions and you don’t need to sign a CLA.

Bug fixes, improvements in the documentations and examples, new constraints, new cost objects, …, are good contributions and can be done even if you’re not familiar with the low-level details on the library.

Development

To set up a development environment locally you should clone the repository (or, fork on Github and then clone your fork)

git clone https://github.com/cvxgrp/cvxportfolio.git
cd cvxportfolio

Then, you should have a look at our Makefile and possibly change the PYTHON variable to match your system’s python interpreter. Once you have done that,

make env
make test

This will replicate our development environment and run our test suite.

You activate the shell environment with one of scripts in env/bin (or env\Scripts on Windows), for example if you use bash on POSIX

source env/bin/activate

and from the environment you can run any of the scripts in the examples (the cvxportfolio package is installed in editable mode). Or, if you don’t want to activate the environment, you can just run scripts directly using env/bin/python (or env\Scripts\python on Windows) like we do in the Makefile.

Additionally, to match our CI/CD pipeline, you may set the following git hooks

echo "make lint" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
echo "make test" > .git/hooks/pre-push
chmod +x .git/hooks/pre-push

Code style and quality

Cvxportfolio follows the PEP8 specification for code style. This is enforced by the Pylint automated linter, with options in the Pyproject configuration file. Pylint is also used to enforce code quality standards, along with some of its optional plugins. Docstrings are written in the Sphinx style, are also checked by Pylint, and are used to generate the documentation.

Versions and releases

Cvxportfolio follows the semantic versioning specification. No breaking change in its public API will be introduced until the next major version (2.0.0), which won’t happen for some time. New features in the public API are introduced with minor versions (1.1.0, 1.2.0, …), and only bug fixes at each revision.

The history of our releases (source distributions and wheels) is visible on our PyPI page.

Releases are also tagged in our git repository and include a short summary of changes in their commit messages.

Citing

If you use Cvxportfolio in work that leads to publication, you can cite the following:

@misc{busseti2017cvx,
    author    = "Busseti, Enzo and Diamond, Steven and Boyd, Stephen",
    title     = "Cvxportfolio",
    month    = "January",
    year     = "2017",
    note     = "Portfolio Optimization and Back--{T}esting",
    howpublished = {\url{https://github.com/cvxgrp/cvxportfolio}},
}

@article{boyd2017multi,
  author  = "Boyd, Stephen and Busseti, Enzo and Diamond, Steven and Kahn, Ron and Nystrup, Peter and Speth, Jan",
  journal = "Foundations and Trends in Optimization",
  title   = "Multi--{P}eriod Trading via Convex Optimization",
  month   = "August",
  year    = "2017",
  number  = "1",
  pages   = "1--76",
  volume  = "3",
  url     = {\url{https://stanford.edu/~boyd/papers/pdf/cvx_portfolio.pdf}},
}

The latter is also the first chapter of this PhD thesis:

@phdthesis{busseti2018portfolio,
    author    = "Busseti, Enzo",
    title     = "Portfolio Management and Optimal Execution via Convex Optimization",
    school    = "Stanford University",
    address   = "Stanford, California, USA",
    month    = "May",
    year     = "2018",
    url     = {\url{https://stacks.stanford.edu/file/druid:wm743bj5020/thesis-augmented.pdf}},
}

Release files for cvxportfolio 1.5.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 cvxportfolio 1.5.1
File Size Uploaded
cvxportfolio-1.5.1.tar.gz 30.8 MB Details

Built distribution (wheel)

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

Total release size: 31.2 MB

Release files / cvxportfolio-1.5.1.tar.gz

Download URL cvxportfolio-1.5.1.tar.gz
Size 30.8 MB
Tags Source
SHA-256 checksum
How to use checksums
d62b3663da9634d92fdfbe78f31bbfbdd6313237d7600d6a86adf4862d1a9378
BLAKE2b-256 checksum
How to use checksums
da8149c0d504526a0634fe661f18b8630d175576f802de4dadeae23ab916e402
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 6, 2025.

Transparency log

Release files / cvxportfolio-1.5.1-py3-none-any.whl

Download URL cvxportfolio-1.5.1-py3-none-any.whl
Size 378.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9c02954c23c095b59a97959eff8b757f164f78e159a5d630ce43ea36c14d0619
BLAKE2b-256 checksum
How to use checksums
36e920d445ad18215748045e11f06394b7343ecd718c054436d728b86220a051
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 6, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

1.5.1 This release

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.4.10

2 release files

0.4.9

2 release files

0.4.8

2 release files

0.4.7

2 release files

0.4.6

2 release files

0.4.5

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.12

1 release file

0.0.11

1 release file

0.0.10

1 release file

0.0.9

1 release file

0.0.8.1

1 release file

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

2 release files

0.0.3

2 release files

0.0.2

3 release files

0.0.0

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