Vor ungefähr 7 Jahren hatte ich Erfahrung mit dem Schreiben eines Terminals für die Moskauer Börse. Ein Teil des Teams mochte den algorithmischen Handel, auch ich. Er hat dieses Geschäft jedoch nie als echte Einnahmequelle wahrgenommen, obwohl dies wenig Erfolg hatte. Es ist klar, dass es schwierig und einfacher ist, in anderen Bereichen mit Banken und verschiedenen Fonds mit ihren Teams aus Mathematikern und Programmierern zu konkurrieren.
Jetzt sind Kryptowährungen zu hören, eine große Anzahl von Börsen ist erschienen. Ausgehend von der Annahme, dass Sie mit den Wechselkursunterschieden an verschiedenen Börsen Geld verdienen können, habe ich mich entschlossen, die Möglichkeit der Schaffung eines Schiedsroboters zu untersuchen. Aber im Grunde genommen, um Python mit einem echten Beispiel zu lernen. Also fangen wir an.
Zunächst müssen Sie Währungspaare finden, für die Arbitrage-Handel möglich ist. Wir brauchen Paare, die in erster Näherung aktiv handeln und deren Preise an verschiedenen Börsen divergieren und konvergieren.
Auf Anhieb sollte der Arbeitsplan folgendermaßen aussehen:
- Erstellung einer Datenbank, in der die Preise von Währungspaaren gespeichert werden.
- Ein Server, der Daten in der Datenbank speichert.
- Primäranalyse.
Quellen finden Sie unter
arb_analysis .
Datenbankerstellung
Zum Speichern von Daten benötigen Sie 3 Tabellen.
In dieser Tabelle wird eine Liste der Börsen gespeichert.
CREATE TABLE `exchange` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM;
Liste der Kryptowährungspaare.
CREATE TABLE `market` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(50) NOT NULL, `id_exchange` int(11) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM; CREATE INDEX id_exchange ON market (id_exchange);
Hier wird auch eine Tabelle mit Transaktionen, Informationen nach Angaben aus dem Börsenglas gespeichert.
CREATE TABLE `ticker` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_market` int(5) NOT NULL, `local_time` int(9) NOT NULL, `timestamp` int(9) NOT NULL, `last` DECIMAL (11,11) NOT NULL, `low` DECIMAL (11,11), `high` DECIMAL (11,11), `bid` DECIMAL (11,11), `ask` DECIMAL (11,11), PRIMARY KEY (id) ) ENGINE=MyISAM; CREATE INDEX id_market ON ticker (id_market);
Daten aus dem Austausch abrufen
Für einen bequemen Zugang zu Börsen gibt es ein Open-Source-Projekt ccxt. Mit deren Hilfe es möglich ist, sich auf verschiedene Börsen in einem einzigen Stil zu bewerben. Es stellte sich jedoch heraus, dass nicht alles so rosig war, dass bei einer Reihe von Austauschen keine Informationen eingeholt werden konnten und einige Methoden nicht funktionierten.
In der Datei create_markets.py erfolgt die Initialisierung. Durch Austausch erhalten wir eine Liste der Kryptowährungspaare. In diesem Fall wird die Methode load_markets () verwendet, die eine Liste von Paaren für den Austausch zurückgibt.
name_exchange = ["acx", "binance", "bitfinex", "bitfinex2", "wex"] def create_exchange_and_market_in_db(): exchanges = {} for id in name_exchange: exchange = getattr(ccxt, id) exchanges[id] = exchange() id_exchage = db_helper.insert_exchage_to_db(exchanges[id],cnx,cursor) markets = exchanges[id].load_markets() for mark in markets: id_market = db_helper.insert_market_to_db( id_exchage, mark, cnx,cursor)
Führen Sie als Nächstes in der Datei ex_data_saver.py die Änderung zum Speichern des Preises für Paare aus:
def save(): markets = db_helper.get_data_exch() exchanges = {} for id in name_exchange: exchange = getattr(ccxt, id)
Der asynchrone Empfang von Ticks für ein bestimmtes Paar erfolgt mit der Methode ccxt fetchTickers ().
async def fetch_ticker(exchanges, name): item = exchanges[name] try: ticker = await item.fetchTickers() return {name:ticker}
Vorläufige Datenanalyse
Zunächst ist es interessant, an welchen Börsen und an welchen Paaren der aktivste Handel stattfindet. Wir sind an liquiden Paaren interessiert. Dazu müssen Sie die Anzahl der Transaktionen berechnen, die nach Börsen und bestimmten Paaren gruppiert sind. Als Ergebnis erhalten wir Paare, die aktiv handeln.
SELECT ex.name as exchange_name, m.name as market_name, count(*) as count_deals FROM exchange ex LEFT JOIN market m ON m.id_exchange = ex.id LEFT JOIN ticker t ON t.id_market =m.id GROUP BY ex.id, t.id_market ORDER BY m.name HAVING count_deals > 10000;
Mithilfe von SQL-Abfragen können Sie verschiedene Muster finden und Daten herausfiltern. Für eine detaillierte Analyse müssen Sie jedoch einen Testroboter erstellen, der die aus verschiedenen Austauschen gesammelten Daten verarbeitet.
Der nächste Artikel ist der Entwicklung dieses Roboters gewidmet. Und der Testserver - emuliert die Arbeit eines echten Austauschs. Ich möchte die folgenden Punkte auf den Testserver legen:
- Verzögerungen.
- Schlupf.
- Provisionen.