Skip to main content

An Open Source Portfolio Management Framework for Everyone 投资组合管理

Project description

By Investors, For Investors.






Open In Colab


Want to read this in Mandarin 🇨🇳? Click here

EigenLedger (prev. "Empyrial") is a Python-based open-source quantitative investment library dedicated to financial institutions and retail investors, officially released in March 2021. Already used by thousands of people working in the finance industry, EigenLedger aims to become an all-in-one platform for portfolio management, analysis, and optimization.

EigenLedger empowers portfolio management by bringing the best of performance and risk analysis in an easy-to-understand, flexible and powerful framework.

With EigenLedger, you can easily analyze security or a portfolio in order to get the best insights from it. This is mainly a wrapper of financial analysis libraries such as Quantstats and PyPortfolioOpt.



Installation

You can install EigenLedger using pip:

pip install empyrial

For a better experience, we advise you to use EigenLedger on a notebook (e.g., Jupyter, Google Colab)

Note: macOS users will need to install Xcode Command Line Tools.

Note: Windows users will need to install C++. (download, install instructions)

Features

Feature 📰 Status
Engine (backtesting + performance analysis) :star: Released on May 30, 2021
Optimizer :star: Released on Jun 7, 2021
Rebalancing :star: Released on Jun 27, 2021
Risk manager :star: Released on Jul 5, 2021
Sandbox :star: Released on Jul 17, 2021
Support for custom data :star: Released on Aug 12, 2023

Documentation

Full documentation (website)

Usage

EigenLedger Engine

from empyrial import empyrial, Engine

portfolio = Engine(
    start_date = "2018-08-01", 
    portfolio = ["BABA", "PDD", "KO", "AMD","^IXIC"], 
    weights = [0.2, 0.2, 0.2, 0.2, 0.2],  # equal weighting is set by default
    benchmark = ["SPY"]  # SPY is set by default
)

empyrial(portfolio)

Use custom data

See doc here to learn how to do this.

Calendar Rebalancing

A portfolio can be rebalanced for either a specific time period or for specific dates using the rebalance option.

Rebalance for Time Period

Time periods available for rebalancing are 2y, 1y, 6mo, quarterly, monthly

from empyrial import empyrial, Engine

portfolio = Engine(
    start_date = "2018-08-01", 
    portfolio = ["BABA", "PDD", "KO", "AMD","^IXIC"], 
    weights = [0.2, 0.2, 0.2, 0.2, 0.2],  # equal weighting is set by default
    benchmark = ["SPY"],  # SPY is set by default
    rebalance = "1y"
)

empyrial(portfolio)

Rebalance for Custom Dates

You can rebalance a portfolio by specifying a list of custom dates.
⚠️ When using custom dates, the first date of the list must correspond with the start_date and the last element should correspond to the end_date which is today's date by default.

from empyrial import empyrial, Engine

portfolio = Engine(
    start_date = "2018-08-01", 
    portfolio = ["BABA", "PDD", "KO", "AMD","^IXIC"], 
    weights = [0.2, 0.2, 0.2, 0.2, 0.2],  # equal weighting is set by default
    benchmark = ["SPY"],  # SPY is set by default
    rebalance = ["2018-06-09", "2019-01-01", "2020-01-01", "2021-01-01"]
)

empyrial(portfolio)

Optimizer

The default optimizer is equal weighting. You can specify custom weights, if desired.

from empyrial import empyrial, Engine

portfolio = Engine(
    start_date = "2018-08-01",
    portfolio = ["BABA", "PDD", "KO", "AMD","^IXIC"], 
    weights = [0.1, 0.3, 0.15, 0.25, 0.2],   # custom weights
    rebalance = "1y"  # rebalance every year
)

empyrial(portfolio)

You can also use the built-in optimizers. There are 4 optimizers available:

  • "EF": Global Efficient Frontier Example
  • "MEANVAR": Mean-Variance Example
  • "HRP": Hierarchical Risk Parity Example
  • "MINVAR": Minimum-Variance Example
from empyrial import empyrial, Engine

portfolio = Engine(
    start_date = "2018-08-01",
    portfolio = ["BABA", "PDD", "KO", "AMD","^IXIC"],
    optimizer = "EF",
    rebalance = "1y"  # rebalance every year
)

portfolio.weights

Output:

[0.0, 0.0, 0.0348, 0.9652, 0.0]

We can see that the allocation has been optimized.

Risk Manager

3 Risk Managers are available:

  • Max Drawdown: {"Max Drawdown" : -0.3} Example
  • Take Profit: {"Take Profit" : 0.4} Example
  • Stop Loss: {"Stop Loss" : -0.2} Example
from empyrial import empyrial, Engine

portfolio = Engine(
    start_date = "2018-08-01",
    portfolio= ["BABA", "PDD", "KO", "AMD","^IXIC"], 
    optimizer = "EF",
    rebalance = "1y",  # rebalance every year
    risk_manager = {"Max Drawdown" : -0.2}  # Stop the investment when the drawdown becomes superior to -20%
)

empyrial(portfolio)

EigenLedger Outputs

image image image image image image image image image image image

Download the Tearsheet

You can use the get_report() function of EigenLedger to generate a tearsheet, and then download this as a PDF document.

from empyrial import get_report, Engine

portfolio = Engine(
      start_date = "2018-08-01",
      portfolio = ["BABA", "PDD", "KO", "AMD","^IXIC"],
      optimizer = "EF",
      rebalance = "1y", #rebalance every year
      risk_manager = {"Stop Loss" : -0.2}
)

get_report(portfolio)

Output:

image

Stargazers over time

追星族的时间

Contribution and Issues

EigenLedger uses GitHub to host its source code. Learn more about the Github flow.

For larger changes (e.g., new feature request, large refactoring), please open an issue to discuss first.

Smaller improvements (e.g., document improvements, bugfixes) can be handled by the Pull Request process of GitHub: pull requests.

  • To contribute to the code, you will need to do the following:

  • Fork EigenLedger - Click the Fork button at the upper right corner of this page.

  • Clone your own fork. E.g., git clone https://github.com/ssantoshp/EigenLedger.git
    If your fork is out of date, then will you need to manually sync your fork: Synchronization method

  • Create a Pull Request using your fork as the compare head repository.

You contributions will be reviewed, potentially modified, and hopefully merged into EigenLedger.

Contributors

Thanks goes to these wonderful people (emoji key):

All Contributors


Brendan Glancy

💻 🐛

Renan Lopes

💻 🐛

Mark Thebault

💻

Diego Alvarez

💻🐛

Rakesh Bhat

💻

Anh Le

🐛

Tony Zhang

💻

Ikko Ashimine

✒️

QuantNomad

📹

Buckley

✒️💻

Adam Nelsson

💻

Ranjan Grover

🐛💻

This project follows the all-contributors specification. Contributions of any kind are welcome!

Credit

This library has also been made possible because of the work of these incredible people:

Contact

You are welcome to contact us by email at santoshpassoubady@gmail.com or in EigenLedger's discussion space

License

MIT

Project details


Download files

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

Source Distribution

eigenledger-2.1.5.tar.gz (40.3 kB view details)

Uploaded Source

Built Distribution

eigenledger-2.1.5-py3-none-any.whl (44.6 kB view details)

Uploaded Python 3

File details

Details for the file eigenledger-2.1.5.tar.gz.

File metadata

  • Download URL: eigenledger-2.1.5.tar.gz
  • Upload date:
  • Size: 40.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for eigenledger-2.1.5.tar.gz
Algorithm Hash digest
SHA256 0bb5423ab9750854e7cb5aaaf7b5d25c6190b8d15346153afc517db9b7da7f8a
MD5 52b3e51fc34a4c9e3a3ec09c2e0b9133
BLAKE2b-256 280bc7f5be6097c0009ab05cf3ac6661019daed7715b9a2d34ce174bc7716be9

See more details on using hashes here.

File details

Details for the file eigenledger-2.1.5-py3-none-any.whl.

File metadata

  • Download URL: eigenledger-2.1.5-py3-none-any.whl
  • Upload date:
  • Size: 44.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for eigenledger-2.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 738fd56c23b0504d134d59323b62c9760f990a280a4912ce1831e29a0aad4c8e
MD5 50f4b0c87fa94512a11c7fb126e8861b
BLAKE2b-256 9f0978e314b488491c7f603891a0f421b111950a94293dcc25bd5d5895f7ee9a

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