santoshlite / Empyrial

An Open Source Portfolio Backtesting Engine for Everyone | ι’ε‘ζ‰€ζœ‰δΊΊηš„εΌ€ζΊζŠ•θ΅„η»„εˆε›žζ΅‹εΌ•ζ“Ž
https://empyrial.gitbook.io/empyrial/
MIT License
914 stars 124 forks source link
backtesting finance fintech futures investment investment-analysis investment-portfolio portfolio-analysis portfolio-management portfolio-optimization python quant quantitative-analysis quantitative-finance stock stock-data stock-market

By Investors, For Investors.











![](https://img.shields.io/badge/Downloads-101k-brightgreen) ![](https://img.shields.io/badge/license-MIT-orange) ![](https://img.shields.io/badge/version-2.1.3-blueviolet) ![](https://img.shields.io/badge/language-python🐍-blue) ![](https://img.shields.io/badge/activity-9.7/10-ff69b4) ![](https://img.shields.io/badge/Open%20source-πŸ’œ-white) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1NqTkkP2u1p1g8W8erU-Y-rSSVbPUDvq2?usp=sharing)


Want to read this in Mandarin πŸ‡¨πŸ‡³? Click here

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, Empyrial aims to become an all-in-one platform for portfolio management, analysis, and optimization.

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

With Empyrial, 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.



| Table of Contents πŸ“– | | -- | 1. [Installation](#installation) | | 2. [Features](#features) | | 3. [Documentation](#documentation) | | 4. [Usage example](#usage) | | 5. [Download the tearsheet](#download-the-tearsheet) | | 6. [Contribution and Issues](#contribution-and-issues) | | 7. [Contributors](#contributors) | | 8. [Contact](#contact) | | 9. [License](#license) |

Installation

You can install Empyrial using pip:

pip install empyrial

For a better experience, we advise you to use Empyrial 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](https://github.com/ssantoshp/Empyrial/releases/tag/1.2.4) on May 30, 2021 | | Optimizer | :star: [Released](https://github.com/ssantoshp/Empyrial/releases/tag/1.3.6) on Jun 7, 2021 | | Rebalancing | :star: [Released](https://github.com/ssantoshp/Empyrial/releases/tag/1.5.0) on Jun 27, 2021 | | Risk manager | :star: [Released](https://github.com/ssantoshp/Empyrial/releases/tag/v1.7.3) on Jul 5, 2021 | | Sandbox | :star: [Released](https://github.com/ssantoshp/Empyrial/releases/tag/v1.9.1) on Jul 17, 2021 | | Support for custom data | :star: [Released](https://github.com/ssantoshp/Empyrial/releases/tag/v2.1.3) on Aug 12, 2023 |

Documentation

Full documentation (website)

Usage

Empyrial 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:

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:

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)

Empyrial Outputs

![image](https://user-images.githubusercontent.com/61618641/126879140-ea03ff17-a7c6-481a-bb3e-61c055b31267.png) ![image](https://user-images.githubusercontent.com/61618641/126879203-4390813c-a4f2-41b9-916b-e03dd8bafffb.png) ![image](https://user-images.githubusercontent.com/61618641/128025087-04afed7e-96ab-4730-9bd8-98f5491b2b5d.png) ![image](https://user-images.githubusercontent.com/61618641/126879204-01fe1eca-00b8-438e-b489-0213535dd31b.png) ![image](https://user-images.githubusercontent.com/61618641/126879210-9fd61e2b-01ab-4bfd-b679-3b1867d9302d.png) ![image](https://user-images.githubusercontent.com/61618641/126879215-e24c929a-55be-4912-8e2c-043e31ff2a95.png) ![image](https://user-images.githubusercontent.com/61618641/126879221-455b8ffa-c958-4ac9-ae98-d15b4c5f0826.png) ![image](https://user-images.githubusercontent.com/61618641/126879222-08906643-16db-441e-a099-7ac3b00bdbd7.png) ![image](https://user-images.githubusercontent.com/61618641/126879223-f1116dc3-cceb-493c-93b3-2d3810cae789.png) ![image](https://user-images.githubusercontent.com/61618641/126879225-dc879b71-2070-46ed-a8ad-e90880050be8.png) ![image](https://user-images.githubusercontent.com/61618641/126879297-cb78743a-6d43-465b-8021-d4b62a659828.png)

Download the Tearsheet

You can use the get_report() function of Empyrial 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

![θΏ½ζ˜Ÿζ—ηš„ζ—Άι—΄](https://starchart.cc/ssantoshp/empyrial.svg)

Contribution and Issues

Empyrial 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.

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

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 Empyrial's discussion space

License

MIT