alchemist_lib 1.0
Automatic trading library for cryptocurrencies.
License: MIT

.. image:: https://i.imgur.com/9bC0YgB.png
    :target: https://github.com/Dodo33/alchemist-lib
    :width: 212px
    :align: center
    :alt: Alchemist

Alchemist_lib
*************


Description
===========
Alchemist_lib is an automatic trading library for cryptocurrencies that allow to personalize the portfolio based on a specific strategy.


Features
========

 - Easy to use: The interface is similar to `zipline <http://www.zipline.io/>`_, a popular backtesting software for stocks.
 - Portfolio personalization: You can choose the weight of every element on the portfolio.
 - Most common technical analysis indicators already integrated.
 - Execute orders on the most famous exchanges.
 - Possibility to visualize the asset allocation and the portfolio value charts for every strategy thanks to `alchemist-view <https://github.com/Dodo33/alchemist-view>`_.
 - Fully documented and hosted on `readthedocs <http://alchemist-lib.readthedocs.io/en/latest/index.html#>`_.
 

Supported Exchanges
===================
The following exchanges are available to trade on:

    - `Poloniex <https://poloniex.com/>`_
    - `Bittrex <https://bittrex.com/>`_

    
Requirements
============

 - Python3
 - Mysql
    

Installation
============

See the `installing documentation <http://alchemist-lib.readthedocs.io/en/latest/install.html>`_.


Code example
============

Strategy description:
*Hold a portfolio equally composed by Ethereum and BitcoinCash.*

::
    
    from alchemist_lib.portfolio import LongsOnlyPortfolio
    from alchemist_lib.broker import PoloniexBroker
    from alchemist_lib.tradingsystem import TradingSystem
    import alchemist_lib.exchange as exch
    import pandas as pd


    def set_weights(df):
        df["weight"] = 0.5 #Because there are just two assets.
        return df

    def select_universe(session):
        poloniex_assets = exch.get_assets(session = session, exchange_name = "poloniex")

        my_universe = []
        for asset in poloniex_assets:
            if asset.ticker == "ETH" or asset.ticker == "BCH":
                my_universe.append(asset)
        return my_universe

    def handle_data(session, universe):
        #The value of alpha is useless in this case.
        df = pd.DataFrame(data = {"asset" : universe, "alpha" : 0}, columns = ["asset", "alpha"]).set_index("asset")
        return df


    algo = TradingSystem(name = "BuyAndHold",
                         portfolio = LongsOnlyPortfolio(capital = 0.02),
                         set_weights = set_weights,
                         select_universe = select_universe,
                         handle_data = handle_data,
                         broker = PoloniexBroker(api_key = "APIKEY",
                                                 secret_key = "SECRETKEY"),
                         paper_trading = True)
    algo.run(delay = "15M", frequency = 1)


Screenshot
----------

.. image:: https://i.imgur.com/G3p1IeZ.png
    :target: https://github.com/Dodo33/alchemist-lib
    :width: 300px
    :height: 150px
    :align: center
    :alt: BuyAndHold example


Basic concepts
==============

Alchemist_lib works with three methods:

    - set_weights
    - select_universe
    - handle_data

*set_weights* is used to set the weight that an asset has respect the others within the portfolio. 
The sum of every weight must be close to 1. Must returns a pandas dataframe with two columns: "asset" and "alpha", where "asset" is the index.

*select_universe* filters the assets saved on the database and returns just the ones the strategy will take into consideration.

*handle_data* is the most importat one because it manages the trading logic. Must returns a pandas dataframe with two columns: "asset" and "alpha", where "asset" is the index.

You can find other examples in the ``examples`` directory.


Reporting bugs
==============

A `bug tracker <https://github.com/Dodo33/alchemist-lib/issues>`_ is provided by Github.