All Projects → wardbradt → Peregrine

wardbradt / Peregrine

Licence: mit
Detects arbitrage opportunities across 131 cryptocurrency exchanges in 50 countries

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Peregrine

Roq Api
API for algorithmic and high-frequency trading
Stars: ✭ 132 (-79.31%)
Mutual labels:  trading-bot, cryptocurrency, algorithmic-trading, trading-algorithms, arbitrage
Algotrading
Algorithmic trading framework for cryptocurrencies.
Stars: ✭ 249 (-60.97%)
Mutual labels:  trading-bot, cryptocurrency, algorithmic-trading, trading-algorithms, algotrading
Jesse
An advanced crypto trading bot written in Python
Stars: ✭ 1,038 (+62.7%)
Mutual labels:  trading-bot, cryptocurrency, algorithmic-trading, trading-algorithms
roq-samples
How to use the Roq C++20 API for Live Cryptocurrency Algorithmic and High-Frequency Trading as well as for Back-Testing and Historical Simulation
Stars: ✭ 119 (-81.35%)
Mutual labels:  trading-bot, trading-algorithms, algorithmic-trading, arbitrage
Hummingbot chinese
hummingbot中文资源
Stars: ✭ 114 (-82.13%)
Mutual labels:  trading-bot, cryptocurrency, algorithmic-trading, trading-algorithms
Socktrader
🚀 Websocket based trading bot for 💰cryptocurrencies 📈
Stars: ✭ 152 (-76.18%)
Mutual labels:  trading-bot, cryptocurrency, algorithmic-trading, trading-algorithms
Quantitative Notebooks
Educational notebooks on quantitative finance, algorithmic trading, financial modelling and investment strategy
Stars: ✭ 356 (-44.2%)
Mutual labels:  algorithmic-trading, trading-algorithms, algotrading
quick trade
convenient script for trading with python.
Stars: ✭ 63 (-90.13%)
Mutual labels:  trading-bot, trading-algorithms, algorithmic-trading
api-version-2
Executium API Version 2 - A comprehensive trading system API which connects traders with dozens of exchanges. Currently in closed beta
Stars: ✭ 82 (-87.15%)
Mutual labels:  trading-bot, trading-algorithms, arbitrage
Cointrader
Coin Trader is a Java-based backend for algorithmically trading cryptocurrencies. It provides data collection and export, complex event processing and triggering, and backtesting - paper trading - live trading.
Stars: ✭ 332 (-47.96%)
Mutual labels:  trading-bot, cryptocurrency, trading-algorithms
wolfinch
Wolfinch is your friendly trader Bot written in Python
Stars: ✭ 246 (-61.44%)
Mutual labels:  trading-bot, algotrading, trading-algorithms
volatile
Volatile: your day-to-day trading companion.
Stars: ✭ 53 (-91.69%)
Mutual labels:  algotrading, trading-algorithms, algorithmic-trading
Kelp
Kelp is a free and open-source trading bot for the Stellar DEX and 100+ centralized exchanges
Stars: ✭ 580 (-9.09%)
Mutual labels:  trading-bot, cryptocurrency, trading-algorithms
Wolfbot
Crypto currency trading bot written in TypeScript for NodeJS
Stars: ✭ 335 (-47.49%)
Mutual labels:  trading-bot, cryptocurrency, trading-algorithms
algotrading-example
algorithmic trading backtest and optimization examples using order book imbalances. (bitcoin, cryptocurrency, bitmex, binance futures, market making)
Stars: ✭ 169 (-73.51%)
Mutual labels:  trading-bot, algotrading, trading-algorithms
QuantResearch
Quantitative analysis, strategies and backtests
Stars: ✭ 1,013 (+58.78%)
Mutual labels:  algotrading, trading-algorithms, algorithmic-trading
AutoTrader
A Python-based development platform for automated trading systems - from backtesting to optimisation to livetrading.
Stars: ✭ 227 (-64.42%)
Mutual labels:  trading-bot, trading-algorithms, algorithmic-trading
Tai
A composable, real time, market data and trade execution toolkit. Built with Elixir, runs on the Erlang virtual machine
Stars: ✭ 264 (-58.62%)
Mutual labels:  trading-bot, cryptocurrency, algorithmic-trading
quanttrader
Backtest and live trading in Python
Stars: ✭ 139 (-78.21%)
Mutual labels:  algotrading, trading-algorithms, algorithmic-trading
Example Scalping
A working example algorithm for scalping strategy trading multiple stocks concurrently using python asyncio
Stars: ✭ 267 (-58.15%)
Mutual labels:  trading-bot, algorithmic-trading, algotrading

Peregrine

A Python library which provides several algorithms to detect arbitrage opportunities across over 120 cryptocurrency exchanges in 48 countries on over 38,000 trading pairs

Install · Usage · Upcoming Changes

Install

  1. Ensure you have installed pip.

  2. Run the following in your command line:

    pip install git+https://github.com/wardbradt/peregrine
    

Usage

This section provides a brief overview of Peregrine's functionality. Examples demonstrating many more features are available in peregrine/examples.

Multiples Exchange/ One Currency

from peregrinearb import get_opportunity_for_market
import asyncio
collections_dir = '/Users/wardbradt/cs/peregrine/'
opportunity = asyncio.get_event_loop().run_until_complete(get_opportunity_for_market("BTC/USD", collections_dir))
print(opportunity)

At the time of writing, this prints the following in less than one second.

{'highest_bid': {'exchange': <ccxt.async.lakebtc.lakebtc object at 0x10ea50518>, 'price': 11750.59},
'lowest_ask': {'exchange': <ccxt.async.gdax.gdax object at 0x10ea50400>, 'price': 8450.01}}

If you want to specify which exchanges to find opportunities on:

from peregrinearb import get_opportunity_for_market
import asyncio

collections_dir = '/Users/wardbradt/cs/peregrine/'
opportunity = asyncio.get_event_loop().run_until_complete(get_opportunity_for_market("BTC/USD", collections_dir, exchanges=["anxpro", "bitbay", "coinfloor", "gemini", "livecoin"]))
print(opportunity)

If you want to find opportunities on the exchanges of only a certain country1, you can do it like so:

from peregrinearb import build_specific_collections, get_opportunity_for_market

us_eth_btc_exchanges = build_specific_collections(countries=['US'])
collections_dir = '/Users/wardbradt/cs/peregrine/'
opportunity = get_opportunity_for_market("ETH/BTC", collections_dir, us_eth_btc_exchanges["ETH/BTC"])
print(opportunity)

1Accepted arguments in place of 'US' in this example are 'PA', 'AU', 'CA', 'JP', 'SG', 'HK', 'NZ', 'IE', 'CN', 'KR', 'IL', 'MT', 'EU', 'VG', 'GB', 'RU', 'PL', 'SC', 'MX', 'NL', 'BR', 'PH', 'UA', 'TR', 'IS', 'TH', 'DE', 'CY', 'CL', 'TW', 'ID', 'UK', 'IN', 'VN', 'BG', 'CZ', 'ES', 'SE', 'VC', 'ZA', 'CH', 'TZ', 'FR', 'AR', 'VE', 'PK', and 'AT'.

One Exchange/ Multiple Currencies

import asyncio
from peregrinearb import load_exchange_graph, print_profit_opportunity_for_path, bellman_ford
graph = asyncio.get_event_loop().run_until_complete(load_exchange_graph('hitbtc'))

paths = bellman_ford(graph)
for path in paths:
    print_profit_opportunity_for_path(graph, path)

This prints all of the arbitrage opportunities on the given exchange (in this case, HitBTC). At the time of writing, the first opportunity printed out is:

Starting with 100 in BTC
BTC to USDT at 7955.100000 = 795510.000000
USDT to NEO at 0.016173 = 12866.084425
NEO to ETH at 0.110995 = 1428.071041
ETH to XLM at 2709.292875 = 3869062.695088
XLM to BTC at 0.000026 = 100.208724

If you would like to account for transaction fees, set fees=True when calling load_exchange_graph.

import asyncio
from peregrinearb import load_exchange_graph, print_profit_opportunity_for_path, bellman_ford

graph = asyncio.get_event_loop().run_until_complete(load_exchange_graph('gdax', fees=True))

paths = bellman_ford(graph)
for path in paths:
    print_profit_opportunity_for_path(graph, path)

To find the maximum volume that can be used to execute the opportunity, set depth=True when calling bellman_ford. To my knowledge, the only exchange which offers the functionality of simultaneously fetching the volumes of the top price levels for all markets is Binance.

import asyncio
from peregrinearb import load_exchange_graph, print_profit_opportunity_for_path, bellman_ford

graph = asyncio.get_event_loop().run_until_complete(load_exchange_graph('binance'))

paths = bellman_ford(graph, depth=True)
for path, starting_amount in paths:
    # Note that depth=True and starting_amount are set in this example
    print_profit_opportunity_for_path(graph, path, depth=True, starting_amount=starting_amount)

This would output:

Starting with 0.25 in BTC
BTC to USDT at 7955.100000 = 1988.775
USDT to NEO at 0.016173 = 32.1652110625
NEO to ETH at 0.110995 = 3.5701776025
ETH to XLM at 2709.292875 = 9,672.65673772
XLM to BTC at 0.000026 = 0.25052181

Multiple Exchanges/ Multiple Currencies

from peregrinearb import create_weighted_multi_exchange_digraph, bellman_ford_multi, print_profit_opportunity_for_path_multi


graph = create_weighted_multi_exchange_digraph(['kraken', 'bittrex', 'gemini'], log=True)
graph, paths = bellman_ford_multi(graph, 'ETH')
for path in paths:
    print_profit_opportunity_for_path_multi(graph, path)

This prints all of the arbitrage opportunities on the given exchanges. At the time of writing, the first opportunity printed out is:

Starting with 100 in ETH
ETH to ANT at 204.26088199848851 = 20426.08819984885 on bittrex for ANT/ETH
ANT to BTC at 0.00034417000000000003 = 7.03004677574198 on bittrex for ANT/BTC
BTC to MLN at 136.57526594618665 = 960.1305080110928 on bittrex for MLN/BTC
MLN to BTC at 0.0073799999999999985 = 7.085763149121863 on kraken for MLN/BTC
BTC to GNO at 98.03921568627446 = 694.6826616786137 on bittrex for GNO/BTC
GNO to BTC at 0.010300000000000002 = 7.155231415289722 on kraken for GNO/BTC
BTC to GNO at 98.03921568627446 = 701.493276008796 on bittrex for GNO/BTC
GNO to BTC at 0.010300000000000002 = 7.2253807428906 on kraken for GNO/BTC
BTC to MLN at 136.57526594618665 = 986.8082965227394 on bittrex for MLN/BTC
MLN to BTC at 0.0073799999999999985 = 7.282645228337815 on kraken for MLN/BTC
BTC to USD at 7964.809999999999 = 58004.8855411173 on gemini for BTC/USD
USD to ETH at 0.0017965900720432618 = 104.21100149317708 on kraken for ETH/USD

Should you like to account for transaction fees. In the example above, simply set fees to True when calling create_weighted_multi_exchange_digraph. For example, the following code prints out all of the opportunities found on the given exchanges while accounting for fees:

from peregrinearb import create_weighted_multi_exchange_digraph, bellman_ford_multi, print_profit_opportunity_for_path_multi


graph = create_weighted_multi_exchange_digraph(['exmo', 'binance', 'bitmex', 'bittrex', 'gemini', 'kraken'], log=True)


graph, paths = bellman_ford_multi(graph, 'ETH', unique_paths=True)
for path in paths:
    print_profit_opportunity_for_path_multi(graph, path)

The most profitable of the two printed out is:

Starting with 100 in ETH
ETH to LTC at 3.2955444239388347 = 329.55444239388345 on binance for LTC/ETH
LTC to USD at 173.00829999999996 = 57015.65383601369 on exmo for LTC/USD
USD to XRP at 1.4110342881332016 = 80451.04252294863 on kraken for XRP/USD
XRP to USD at 0.739201 = 59469.49108400615 on exmo for XRP/USD
USD to BTC at 0.00011205737337516807 = 6.663994966831705 on bitmex for BTC/USD
BTC to XRP at 12599.218848431392 = 83961.13099195795 on bittrex for XRP/BTC
XRP to USD at 0.739201 = 62064.15199038631 on exmo for XRP/USD
USD to BTC at 0.00011205737337516807 = 6.954745852799899 on bitmex for BTC/USD
BTC to XRP at 12599.218848431392 = 87624.36503464654 on bittrex for XRP/BTC
XRP to RUB at 39.120000000000005 = 3427865.160155373 on exmo for XRP/RUB
RUB to USD at 0.018667164457718873 = 63988.522683505194 on exmo for USD/RUB
USD to XRP at 1.4110342881332016 = 90289.99955341498 on kraken for XRP/USD
XRP to RUB at 39.120000000000005 = 3532144.7825295944 on exmo for XRP/RUB
RUB to USD at 0.018667164457718873 = 65935.1275439536 on exmo for USD/RUB
USD to BCH at 0.000949667616334283 = 62.61645540736334 on kraken for BCH/USD
BCH to ETH at 1.8874401 = 118.18480885571941 on bittrex for BCH/ETH

Upcoming Changes

In Development

The following changes are in progress on the dev branch or will be soon.

General
  • Adding logging
  • Upgrade from Python 3.6 -> Python 3.7 to enable compatibility with new ccxt releases. Done
  • Improving modularity to enable usage of the library for user-provided price data such as data from non-integrated exchanges or data received via WebSocket.
  • Changing the module structure to separate features and dependencies
  • Deprecating certain features
  • General restructuring and changes to improve usability and performance
Bellman Ford
  • Adding the functionality of average price (best_bid + best_ask / 2) instead of best price for triangular arbitrage (Requested here)
  • Ensuring all graphs have a "k-core" of 2 to improve performance
  • Adding the functionality to exclude or exclusively include certain currencies (Requested Here)
  • Fixing functionality of depth

Planned

These are subject to change. I currently intend to implement them after those listed above are complete.

Bellman Ford
  • Using scipy sparse matrices instead of networkx graphs to increase Bellman Ford performance

    This is more of an upgrade to scipy than this project. This is because scipy's Bellman Ford implementation currently raises an error if a negative cycle is found--there is no mechanism for retracing the negative cycle.

  • Implementing Yen's improvements to Bellman Ford

    This will likely be done only after/ while upgrading to scipy so that it isn't done twice.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].