Skip to main content

Tool to test the out-of-sample performance of portfolio optimization models

Project description

Portfolio Performance

Tool to test the out-of-sample performance of portfolio optimization models. Based on the paper: Optimal Versus Naive Diversification:

I have also developed a playground website for this package so you can easily run these models on your own data. Link to website

Usage

Installation

pip install portfolioperformance

Models

# Each model takes a name parameter
ew = EqualWeight("Equal Weight")
minVar = MinVar("Minimum Variance")
JagannathanMa = JagannathanMa("Jagannathan Ma")
minVarShortSellCon = MinVarShortSellCon("Minimum Variance with Short Sell Constrains")
kanZhouEw = KanZhouEw("Kan Zhou EW")

meanVar = MeanVar("Mean Variance (Markowitz)")
meanVarShortSellCon = MeanVarShortSellCon("Mean Variance with Short Sell Constrains")
kanZhou = KanZhou("Kan Zhou Three Fund")
bayesStein = BayesStein("Bayes Stein")
bayesSteinShortSellCon = BayesSteinShortSellCon("Bayes Stein with Short Sell Constrains")
macKinlayPastor = MacKinlayPastor("MacKinlay and Pastor")

Example

import numpy as np
from portfolioperformance import *

# Risk aversion levels
GAMMAS = [1, 2, 3, 4, 5, 10]

# Time horizons
TIME_HORIZON = [60, 120]

benchmark = <benchmark model>

# List of models
models = [
    benchmark,
    # <add other list of models>
]

app = App(<data path>, GAMMAS, TIME_HORIZON, models, dateFormat=<pandas datetime format>,
            dateRange=["01011990", "01012010"], delim=<"," or "\\s+">,
            riskFactorPositions=[positions for risk factor column],
            riskFreePosition=<risk free asset column>)

sr = app.getSharpeRatios()
sig = app.getStatisticalSignificanceWRTBenchmark(benchmark)

API

App Class

Parameters

  • path (str): Path to a csv file
  • gammas (list[int]): List of gammas values
  • timeHorizon (list[int]): List of time horizons
  • models (list[Model]): List of Model classes
  • dateFormat (str): Pandas date time format, default = "%Y-%m-%d"
  • dateRange ([str, str]): Start and end date, default = []
  • delim (str): Delimitation type, either "," or "\s+" (whitespace), default = ","
  • logScale (bool): Whether or not data is in log-scale, default = False
  • riskFactorPositions (list): Risk factor asset column positions (where position 1 is the date column), default = []
  • riskFreePosition (int): Risk free asset column position, default = 1

Methods

getSharpeRatios() -> dict[str, float]

Get the sharpe ratios

  • Returns: - dict[str, float]: A dictionary with model name and sharpe ratio as a key-valued pair
getStatisticalSignificanceWRTBenchmark(benchmark) -> dict[str, float]

Get the statistical significance with respect to a benchmark model

  • Parameters:

    • benchmark (Model): Benchmark model
  • Returns:
    • dict[str, float]: A dictionary with model name and sharpe ratio as a key-valued pair

Development

Setup

  1. Clone project: git clone https://github.com/sidnand/portfolioperformance
  2. Install packages: pip install -r requirements.txt
  3. Make changes!

Folder Structure

.
|-- __init__.py # import /src/app.py and all models
|-- /src
    |-- app.py # code for running all the optimiation models
    |-- model.py # parent class to all the models
    |-- modelNoGamma.py # class for models that don't take extra parameters
    |-- modelGamma.py # class for models that take an extra gamma parameter; gamma is a list of constants for the investors risk-aversion level
    |-- ./models # all the models
    |-- ./utils
        |-- filter.py # includes a function that is used to filter the parameters passed to a function
        |-- quadprog.py # quadratic programming
        |-- sharedOptions.py # models options that are in common with >2 models
        |-- statistics.py # statistics functions

Create Pull-Request

Please create a pull-request to include your changes onto this repo. These changes will be reflected on the playground website linked above.

  1. Run pip install -e . to install the package locally.
  2. Make changes.
  3. Update version number in setup.py. Please use the Semantic Versioning 2.0.0 system. Click to learn more.
  4. Run python setup.py sdist bdist_wheel to create a python wheel.
  5. Create a pull-request!

Release History

  • 1.1.0

    • quadprog == 0.1.12 update
    • Update code for latest pandas version
  • 1.0.0

    • Initial release of the package
    • Python <= 3.9.9
    • quadprog <= 0.1.11

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

portfolioperformance-1.1.0-py3-none-any.whl (17.7 kB view details)

Uploaded Python 3

File details

Details for the file portfolioperformance-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for portfolioperformance-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2269c55ca9a34365b16da0003ce32ce22a728ff8b8835323ef3b2be931a2d199
MD5 f8d44b20607cb7f9c2987635ccd8bada
BLAKE2b-256 28f2c38cf2b4940ec57cbd1748d5c8bb0ee5cd9b2c72a7a9d93f90a2287d3bc1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page