Sistem arbitrasi untuk pemula, bagian 1

Sekitar 7 tahun yang lalu, saya memiliki pengalaman menulis terminal untuk Moscow Exchange. Bagian dari tim menyukai perdagangan algoritmik, termasuk saya. Namun, ia tidak pernah menganggap bisnis ini sebagai sumber pendapatan nyata, meskipun ada sedikit keberhasilan dalam hal ini. Jelas bahwa untuk bersaing dengan bank dan berbagai dana, dengan tim matematikawan dan pemrogram mereka, sulit dan lebih mudah untuk diterapkan di bidang lain.

Sekarang cryptocurrency terdengar, sejumlah besar pertukaran telah muncul. Berdasarkan asumsi bahwa dimungkinkan untuk mendapatkan uang dari perbedaan nilai tukar pada pertukaran yang berbeda, saya memutuskan untuk mempelajari kemungkinan membuat robot arbitrase. Tetapi pada dasarnya, untuk mulai belajar python dengan contoh nyata. Jadi mari kita mulai.

Pertama-tama, diperlukan untuk mendeteksi pasangan mata uang yang memungkinkan perdagangan arbitrage. Kita membutuhkan pasangan yang, dalam perkiraan pertama, aktif berdagang, dan harga di berbagai bursa berbeda dan menyatu.

Begitu saja, rencana kerjanya harus seperti ini:

  • Pembuatan database tempat harga pasangan mata uang akan disimpan.
  • Server yang akan menyimpan data ke database.
  • Analisis primer.

Sumber tersedia di arb_analysis .

Pembuatan basis data


Untuk menyimpan data, Anda membutuhkan 3 tabel.

Tabel ini akan menyimpan daftar pertukaran.

CREATE TABLE `exchange` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM; 

Daftar pasangan cryptocurrency.

 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); 

Tabel dengan transaksi, informasi juga akan disimpan di sini, menurut data dari bursa kaca.

 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); 

Mendapatkan data dari bursa


Untuk akses mudah ke bursa ada proyek open source ccxt. Dengan bantuan yang dimungkinkan untuk diterapkan ke bursa yang berbeda dalam satu gaya. Namun, ternyata tidak semuanya semarak itu, untuk sejumlah pertukaran, informasi tidak dapat diperoleh, dan beberapa metode tidak berhasil.

Dalam file create_markets.py, inisialisasi terjadi, kami mendapatkan daftar pasangan cryptocurrency, dengan pertukaran. Dalam kasus ini, metode load_markets () digunakan, yang mengembalikan daftar pasangan untuk pertukaran.

 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) 

Selanjutnya, dalam file ex_data_saver.py, kami mulai menyimpan perubahan harga untuk pasangan:

 def save(): markets = db_helper.get_data_exch() exchanges = {} for id in name_exchange: exchange = getattr(ccxt, id) #isHas = exchange.hasFetchTickers #if isHas: exchanges[id] = exchange({ 'enableRateLimit': True, # or .enableRateLimit = True later }) cnx = db_helper.CreateConnection() cursor = cnx.cursor() loop = asyncio.get_event_loop() while True: start_time = time.time() input_coroutines = [fetch_ticker(exchanges, name) for name in exchanges] exch_tickers = loop.run_until_complete(asyncio.gather(*input_coroutines, return_exceptions=True)) count_exchange = 0 delta = time.time() - start_time for tickers in exch_tickers: if tickers is not None: count_exchange+=1 inserted_start = time.time() db_helper.insert_tick(markets,exch_tickers,cnx,cursor) inserted_time = time.time() print(count_exchange," ", delta, ' ', inserted_start - inserted_time) 

Penerimaan kutu yang tidak sinkron untuk pasangan tertentu terjadi menggunakan metode ccxt fetchTickers ().

 async def fetch_ticker(exchanges, name): item = exchanges[name] try: ticker = await item.fetchTickers() return {name:ticker} 

Analisis data awal


Pertama-tama, ini menarik pada bursa mana dan pada pasangan mana perdagangan paling aktif berlangsung, kami tertarik pada pasangan likuid. Untuk melakukan ini, Anda perlu menghitung jumlah transaksi yang dikelompokkan berdasarkan pertukaran dan pasangan tertentu. Akibatnya, kami mendapatkan pasangan yang aktif berdagang.

 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; 

Menggunakan kueri SQL, Anda dapat menemukan berbagai pola dan memfilter data, namun, untuk analisis terperinci, Anda perlu membuat robot uji yang berfungsi pada data yang terakumulasi dari berbagai pertukaran.

Artikel selanjutnya akan dikhususkan untuk pembuatan robot ini. Dan server uji - meniru pekerjaan pertukaran nyata. Saya ingin meletakkan poin berikut di server uji:

  • Keterlambatan.
  • Selip.
  • Komisi.

Source: https://habr.com/ru/post/id436062/


All Articles