An open API service indexing awesome lists of open source software.

https://github.com/cvxgrp/cptopt

Portfolio Optimization with Cumulative Prospect Theory Utility via Convex Optimization
https://github.com/cvxgrp/cptopt

convex-optimization cumulative-prospect-theory portfolio-optimization

Last synced: 3 months ago
JSON representation

Portfolio Optimization with Cumulative Prospect Theory Utility via Convex Optimization

Awesome Lists containing this project

README

          

# Portfolio Optimization with Cumulative Prospect Theory Utility via Convex Optimization

This repo accompanies our [paper](https://arxiv.org/abs/2209.03461).

## Installation

The `cptopt` package can be installed using `pip` as follows

```python
pip install git+https://github.com/cvxgrp/cptopt.git
```

## Minimum working example
We are unable to provide the full data set used in the paper for licensing reasons. We, therefore, give a minimum working example using simulated data below.
```python
import numpy as np
from scipy.stats import multivariate_normal as normal

from cptopt.optimizer import MinorizationMaximizationOptimizer, ConvexConcaveOptimizer, \
MeanVarianceFrontierOptimizer, GradientOptimizer
from cptopt.utility import CPTUtility

# Generate returns
corr = np.array([
[1, -.2, -.4],
[-.2, 1, .5],
[-.4, .5, 1]
])
sd = np.array([.01, .1, .2])
Sigma = np.diag(sd) @ corr @ np.diag(sd)

np.random.seed(0)
r = normal.rvs([.03, .1, .193], Sigma, size=100)

# Define utility function
utility = CPTUtility(
gamma_pos=8.4, gamma_neg=11.4,
delta_pos=.77, delta_neg=.79
)

initial_weights = np.array([1/3, 1/3, 1/3])

# Optimize
mv = MeanVarianceFrontierOptimizer(utility)
mv.optimize(r, verbose=True)

mm = MinorizationMaximizationOptimizer(utility)
mm.optimize(r, initial_weights=initial_weights, verbose=True)

cc = ConvexConcaveOptimizer(utility)
cc.optimize(r, initial_weights=initial_weights, verbose=True)

ga = GradientOptimizer(utility)
ga.optimize(r, initial_weights=initial_weights, verbose=True)
```
The optimal weights can then be accessed via the `weights` property.
```py
mv.weights
mm.weights
cc.weights
ga.weights
```

## Citing
If you want to reference our paper in your research, please consider citing us by using the following BibTeX:

```BibTeX
@article{luxenberg2024cptopt,
title={Portfolio Optimization with Cumulative Prospect Theory Utility via Convex Optimization},
author={Luxenberg, Eric and Schiele, Philipp and Boyd, Stephen},
journal={Computational Economics},
pages={1--21},
year={2024},
doi = {https://doi.org/10.1007/s10614-024-10556-x},
publisher={Springer},
url = {https://web.stanford.edu/\%7Eboyd/papers/pdf/cpt_opt.pdf},
}
```