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
- Host: GitHub
- URL: https://github.com/cvxgrp/cptopt
- Owner: cvxgrp
- Created: 2022-08-28T23:04:57.000Z (almost 4 years ago)
- Default Branch: master
- Last Pushed: 2024-05-13T15:43:48.000Z (about 2 years ago)
- Last Synced: 2026-01-26T10:13:43.546Z (5 months ago)
- Topics: convex-optimization, cumulative-prospect-theory, portfolio-optimization
- Language: Python
- Homepage:
- Size: 26.4 KB
- Stars: 37
- Watchers: 3
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
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},
}
```