Bagaimana dengan harga Bitcoin? Apakah sebab harga mata wang digital meningkat dan menurun? Adakah harga pasaran Altcoin yang berbeza saling berkaitan atau sebahagian besarnya bebas? Bagaimana kita boleh meramalkan apa yang akan berlaku seterusnya?
Artikel mengenai mata wang digital, seperti Bitcoin dan Ethereum, kini penuh dengan spekulasi. Beratus-ratus pakar yang mengisytiharkan diri mereka menyokong trend yang mereka harapkan. Apa yang banyak analisis ini kekurangan adalah asas yang kukuh untuk data asas dan model statistik.
Tujuan artikel ini adalah untuk memberikan pengenalan ringkas mengenai analisis mata wang digital dengan menggunakan Python. Kami akan menggunakan skrip Python yang mudah untuk mendapatkan, menganalisis dan memvisualisasikan data mata wang digital yang berbeza. Dalam proses ini, kami akan menemui trend yang menarik dalam tingkah laku pasaran turun naik ini dan bagaimana mereka berkembang.
Ini bukan artikel yang menerangkan mata wang digital, juga bukan pendapat mengenai mata wang tertentu yang akan meningkat dan yang akan menurun. Sebaliknya, apa yang kami fokuskan dalam tutorial ini adalah untuk mendapatkan data asal dan mencari cerita yang tersembunyi dalam nombor.
Tutorial ini bertujuan untuk peminat, jurutera dan saintis data pada semua tahap kemahiran. Sama ada anda seorang pemimpin industri atau pemula pengaturcaraan, satu-satunya kemahiran yang anda perlukan adalah pemahaman asas bahasa pengaturcaraan Python dan pengetahuan yang mencukupi mengenai operasi baris arahan (mampu menubuhkan projek sains data sudah mencukupi).
Semua ciri-ciri yang disebutkan di atas dikemas dalam sistem seperti Docker. Apa yang perlu kita lakukan adalah untuk membeli atau menyewa perkhidmatan pengkomputeran awan kita sendiri dan menggunakan sistem Docker.
Dalam nama rasmi platform FMZ Quant, sistem Docker ini dipanggil sistem Docker.
Sila rujuk artikel saya sebelum ini mengenai cara menggunakan docker dan robot:https://www.fmz.com/bbs-topic/9864.
Pembaca yang ingin membeli pelayan pengkomputeran awan mereka sendiri untuk menggunakan pelabuhan boleh merujuk artikel ini:https://www.fmz.com/digest-topic/5711.
Selepas menyebarkan pelayan pengkomputeran awan dan sistem docker dengan berjaya, seterusnya kita akan memasang artifak terbesar sekarang Python: Anaconda
Untuk merealisasikan semua persekitaran program yang relevan (bibliotek ketergantungan, pengurusan versi, dan lain-lain) yang diperlukan dalam artikel ini, cara yang paling mudah adalah menggunakan Anaconda.
Oleh kerana kami memasang Anaconda pada perkhidmatan awan, kami mengesyorkan bahawa pelayan awan memasang sistem Linux ditambah versi baris arahan Anaconda.
Untuk kaedah pemasangan Anaconda, sila rujuk panduan rasmi Anaconda:https://www.anaconda.com/distribution/.
Jika anda seorang pengaturcara Python yang berpengalaman dan jika anda merasakan bahawa anda tidak perlu menggunakan Anaconda, ia tidak ada masalah sama sekali. Saya akan menganggap bahawa anda tidak memerlukan bantuan semasa memasang persekitaran bergantung yang diperlukan. Anda boleh melangkau bahagian ini secara langsung.
Setelah Anaconda dipasang, kita perlu membuat persekitaran baru untuk menguruskan pakej bergantung kita.
conda create --name cryptocurrency-analysis python=3
untuk mencipta persekitaran Anaconda baru untuk projek kami.
Seterusnya, input:
source activate cryptocurrency-analysis (linux/MacOS operating system)
or
activate cryptocurrency-analysis (windows operating system)
untuk mengaktifkan persekitaran.
Seterusnya, input:
conda install numpy pandas nb_conda jupyter plotly
untuk memasang pelbagai pakej bergantung yang diperlukan untuk projek ini.
Nota: Mengapa menggunakan persekitaran Anaconda? Jika anda merancang untuk menjalankan banyak projek Python di komputer anda, adalah berguna untuk memisahkan pakej bergantung (bilik perisian dan pakej) dari projek yang berbeza untuk mengelakkan konflik. Ananconda akan membuat direktori persekitaran khas untuk pakej bergantung setiap projek, supaya semua pakej dapat dikendalikan dengan betul dan dibezakan.
Selepas persekitaran dan pakej bergantung dipasang, jalankan:
jupyter notebook
untuk memulakan kernel iPython, kemudian lawatihttp://localhost:8888/dengan penyemak imbas anda, buat buku nota Python baru, pastikan ia menggunakan:
Python [conda env:cryptocurrency-analysis]
kernel
Buat buku nota Jupyter kosong, dan perkara pertama yang perlu kita lakukan adalah mengimport pakej bergantung yang diperlukan.
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
Kita juga perlu mengimport Plotly dan mengaktifkan mod luar talian:
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
Penyediaan telah selesai, dan sekarang kita boleh mula mendapatkan data yang akan dianalisis. Pertama, kita akan menggunakan antara muka API platform FMZ Quant untuk mendapatkan data harga Bitcoin.
Untuk penggunaan kedua-dua fungsi ini, sila rujuk:https://www.fmz.com/api.
Untuk memudahkan pemerolehan data, kita perlu menulis fungsi untuk memuat turun dan menyegerakkan data dari Quandl (quandl.comIni adalah antara muka data kewangan percuma, yang menikmati reputasi yang tinggi di luar negara. Platform FMZ Quant juga menyediakan antara muka data yang serupa, yang terutamanya digunakan untuk transaksi bot sebenar.
Semasa transaksi bot sebenar, anda boleh memanggil fungsi GetTicker dan GetRecords di Python secara langsung untuk mendapatkan data harga.https://www.fmz.com/api.
def get_quandl_data(quandl_id):
# Download and cache data columns from Quandl
cache_path = '{}.pkl'.format(quandl_id).replace('/','-')
try:
f = open(cache_path, 'rb')
df = pickle.load(f)
print('Loaded {} from cache'.format(quandl_id))
except (OSError, IOError) as e:
print('Downloading {} from Quandl'.format(quandl_id))
df = quandl.get(quandl_id, returns="pandas")
df.to_pickle(cache_path)
print('Cached {} at {}'.format(quandl_id, cache_path))
return df
Di sini, perpustakaan acar digunakan untuk mengurutkan data dan menyimpan data yang dimuat turun sebagai fail, supaya program tidak akan memuat turun data yang sama setiap kali dijalankan. Fungsi ini akan mengembalikan data dalam format Pandas Dataframe.
Mari kita ambil Bursa Bitcoin Kraken sebagai contoh, bermula dari mendapatkan harga Bitcoin.
# Get prices on the Kraken Bitcoin exchange
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
Gunakan kaedah kepala untuk melihat lima baris pertama kotak data.
btc_usd_price_kraken.head()
Hasilnya ialah:
Seterusnya, kita akan membuat jadual mudah untuk mengesahkan ketepatan data dengan visualisasi.
# Make a table of BTC prices
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])
Di sini, kita menggunakan Plotly untuk melengkapkan bahagian visualisasi. Berbanding dengan menggunakan beberapa perpustakaan visualisasi data Python yang lebih matang, seperti Matplotlib, Plotly adalah pilihan yang kurang biasa, tetapi ia benar-benar pilihan yang baik, kerana ia boleh memanggil carta D3.js
Petua: Carta yang dihasilkan boleh dibandingkan dengan carta harga Bitcoin bursa arus perdana (seperti carta di OKX, Binance atau Huobi) sebagai pemeriksaan integriti cepat untuk mengesahkan sama ada data yang dimuat turun secara amnya konsisten.
Pembaca yang teliti mungkin telah melihat bahawa terdapat data yang hilang dalam data di atas, terutamanya pada akhir tahun 2014 dan awal tahun 2016.
Ciri pertukaran mata wang digital adalah bahawa hubungan bekalan dan permintaan menentukan harga mata wang. Oleh itu, tiada harga transaksi boleh menjadi
Mari kita mulakan dengan memuat turun data setiap pertukaran ke bingkai data yang terdiri daripada jenis kamus.
# Download price data from COINBASE, BITSTAMP and ITBIT
exchanges = ['COINBASE','BITSTAMP','ITBIT']
exchange_data = {}
exchange_data['KRAKEN'] = btc_usd_price_kraken
for exchange in exchanges:
exchange_code = 'BCHARTS/{}USD'.format(exchange)
btc_exchange_df = get_quandl_data(exchange_code)
exchange_data[exchange] = btc_exchange_df
Seterusnya, kita akan menentukan fungsi khas untuk menggabungkan lajur yang biasa bagi setiap bingkai data ke dalam bingkai data baru.
def merge_dfs_on_column(dataframes, labels, col):
'''Merge a single column of each dataframe into a new combined dataframe'''
series_dict = {}
for index in range(len(dataframes)):
series_dict[labels[index]] = dataframes[index][col]
return pd.DataFrame(series_dict)
Sekarang, semua bingkai data disatukan berdasarkan lajur
# Integrate all data frames
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
Akhirnya, kita menggunakan
btc_usd_datasets.tail()
Hasilnya ditunjukkan sebagai berikut:
Dari jadual di atas, kita dapat melihat bahawa data ini selaras dengan jangkaan kita, dengan julat data yang sama, tetapi sedikit berbeza berdasarkan kelewatan atau ciri setiap pertukaran.
Dari perspektif logik analisis, langkah seterusnya adalah untuk membandingkan data ini melalui visualisasi. Untuk melakukan ini, kita perlu menentukan fungsi tambahan terlebih dahulu. Dengan menyediakan perintah satu baris untuk menggunakan data untuk membuat carta, kita memanggilnya fungsi df_scatter.
def df_scatter(df, title, seperate_y_axis=False, y_axis_label='', scale='linear', initial_hide=False):
'''Generate a scatter plot of the entire dataframe'''
label_arr = list(df)
series_arr = list(map(lambda col: df[col], label_arr))
layout = go.Layout(
title=title,
legend=dict(orientation="h"),
xaxis=dict(type='date'),
yaxis=dict(
title=y_axis_label,
showticklabels= not seperate_y_axis,
type=scale
)
)
y_axis_config = dict(
overlaying='y',
showticklabels=False,
type=scale )
visibility = 'visible'
if initial_hide:
visibility = 'legendonly'
# Table tracking for each series
trace_arr = []
for index, series in enumerate(series_arr):
trace = go.Scatter(
x=series.index,
y=series,
name=label_arr[index],
visible=visibility
)
# Add a separate axis to the series
if seperate_y_axis:
trace['yaxis'] = 'y{}'.format(index + 1)
layout['yaxis{}'.format(index + 1)] = y_axis_config
trace_arr.append(trace)
fig = go.Figure(data=trace_arr, layout=layout)
py.iplot(fig)
Untuk pemahaman anda yang mudah, artikel ini tidak akan membincangkan prinsip logik fungsi tambahan ini terlalu banyak.
Sekarang, kita boleh membuat carta data harga Bitcoin dengan mudah!
# Plot all BTC transaction prices
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
Seperti yang dapat dilihat dari carta di atas, walaupun empat siri data mengikuti laluan yang sama, masih ada beberapa perubahan yang tidak teratur.
Dalam tempoh 2012-2017, kita tahu bahawa harga Bitcoin tidak pernah sama dengan sifar, jadi kita membuang semua nilai sifar dalam bingkai data terlebih dahulu.
# Clear the "0" value
btc_usd_datasets.replace(0, np.nan, inplace=True)
Selepas membina semula bingkai data, kita dapat melihat carta yang lebih jelas tanpa data yang hilang lagi.
# Plot the revised data frame
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
Kita boleh mengira lajur baru sekarang: purata harga Bitcoin harian semua bursa.
# Calculate the average BTC price as a new column
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)
Kolom baru adalah indeks harga Bitcoin! Mari kita lukis lagi untuk memeriksa sama ada data kelihatan salah.
# Plot the average BTC price
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])
Nampaknya tidak ada masalah. kemudiannya, kita akan terus menggunakan data siri harga agregat ini untuk menentukan kadar pertukaran antara mata wang digital lain dan USD.
Setakat ini, kita mempunyai data siri masa harga Bitcoin. Seterusnya, mari kita lihat beberapa data mata wang digital bukan Bitcoin, iaitu, Altcoins. Sudah tentu, istilah
Pertama, kami menggunakan API bursa Poloniex untuk mendapatkan maklumat data transaksi mata wang digital. Kami menentukan dua fungsi tambahan untuk mendapatkan data yang berkaitan dengan Altcoins. Kedua-dua fungsi ini terutamanya memuat turun dan menyimpan data JSON melalui API.
Pertama, kita tentukan fungsi get_json_data, yang akan memuat turun dan cache data JSON dari URL yang diberikan.
def get_json_data(json_url, cache_path):
'''Download and cache JSON data, return as a dataframe.'''
try:
f = open(cache_path, 'rb')
df = pickle.load(f)
print('Loaded {} from cache'.format(json_url))
except (OSError, IOError) as e:
print('Downloading {}'.format(json_url))
df = pd.read_json(json_url)
df.to_pickle(cache_path)
print('Cached {} at {}'.format(json_url, cache_path))
return df
Seterusnya, kita menentukan fungsi baru yang akan menjana permintaan HTTP API Poloniex dan memanggil fungsi get_ json_data yang baru ditakrifkan untuk menyimpan hasil data panggilan.
base_polo_url = 'https://poloniex.com/public?command=returnChartData¤cyPair={}&start={}&end={}&period={}'
start_date = datetime.strptime('2015-01-01', '%Y-%m-%d') # Data acquisition since 2015
end_date = datetime.now() # Until today
pediod = 86400 # pull daily data (86,400 seconds per day)
def get_crypto_data(poloniex_pair):
'''Retrieve cryptocurrency data from poloniex'''
json_url = base_polo_url.format(poloniex_pair, start_date.timestamp(), end_date.timestamp(), pediod)
data_df = get_json_data(json_url, poloniex_pair)
data_df = data_df.set_index('date')
return data_df
Fungsi di atas akan mengekstrak kod watak yang sepadan mata wang digital (seperti
Kebanyakan Altcoin tidak boleh dibeli dalam USD secara langsung. Untuk mendapatkan mata wang digital ini, individu biasanya perlu membeli Bitcoin terlebih dahulu, dan kemudian menukarnya menjadi Altcoin mengikut nisbah harga mereka. Oleh itu, kita perlu memuat turun kadar pertukaran setiap mata wang digital ke Bitcoin, dan kemudian menggunakan data harga Bitcoin yang ada untuk menukarnya ke USD. Kami akan memuat turun data kadar pertukaran untuk 9 mata wang digital teratas: Ethereum, Litecoin, Ripple, EthereumClassic, Stellar, Dash, Siacoin, Monero, dan NEM.
altcoins = ['ETH','LTC','XRP','ETC','STR','DASH','SC','XMR','XEM']
altcoin_data = {}
for altcoin in altcoins:
coinpair = 'BTC_{}'.format(altcoin)
crypto_price_df = get_crypto_data(coinpair)
altcoin_data[altcoin] = crypto_price_df
Sekarang, kita mempunyai kamus yang mengandungi 9 bingkai data, yang masing-masing mengandungi data purata harga harian antara Altcoin dan Bitcoin.
Kita boleh menentukan sama ada data itu betul melalui beberapa baris terakhir jadual harga Ethereum.
altcoin_data['ETH'].tail()
Sekarang, kita boleh menggabungkan data kadar pertukaran BTC dan Altcoins dengan indeks harga Bitcoin kita untuk mengira harga sejarah setiap Altcoin (dalam USD) secara langsung.
# Calculate USD Price as a new column in each altcoin data frame
for altcoin in altcoin_data.keys():
altcoin_data[altcoin]['price_usd'] = altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']
Di sini, kita menambah lajur baru untuk setiap bingkai data Altcoin untuk menyimpan harga USD yang sepadan.
Seterusnya, kita boleh menggunakan semula fungsi merge_dfs_on_column yang telah ditakrifkan sebelum ini untuk membuat bingkai data gabungan dan mengintegrasikan harga USD setiap mata wang digital.
# Combine the USD price of each Altcoin into a single data frame
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
Selesai!
Sekarang mari kita tambah harga Bitcoin sebagai lajur terakhir kepada bingkai data gabungan.
# Add BTC price to data frame
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
Sekarang kita mempunyai kerangka data yang unik, yang mengandungi harga harian USD daripada sepuluh mata wang digital yang kita semak.
Kami memanggil fungsi sebelumnya df_scatter lagi, menunjukkan harga yang sepadan dari semua Altcoin dalam bentuk carta.
Jadual ini menunjukkan kepada kita gambaran lengkap tentang perubahan harga pertukaran untuk setiap mata wang digital dalam beberapa tahun yang lalu.
Nota: di sini kita menggunakan paksi y spesifikasi logaritma untuk membandingkan semua mata wang digital pada carta yang sama.
Pembaca yang berhati-hati mungkin telah melihat bahawa harga mata wang digital nampaknya relevan, walaupun nilai mata wang mereka sangat berbeza dan sangat tidak menentu.
Sudah tentu, kesimpulan yang disokong oleh data lebih meyakinkan daripada intuisi berdasarkan gambar.
Kita boleh menggunakan fungsi Pandas corr() untuk mengesahkan hipotesis korelasi di atas. Kaedah ujian ini mengira pekali korelasi Pearson setiap lajur bingkai data yang sepadan dengan lajur lain.
Nota semakan pada 2017.8.22: Bahagian ini telah diubahsuai untuk menggunakan kadar pulangan harian dan bukannya nilai mutlak harga semasa mengira pekali korelasi.
Pengiraan langsung berdasarkan siri masa yang tidak kukuh (seperti data harga mentah) boleh menyebabkan penyimpangan pekali korelasi. Untuk menyelesaikan masalah ini, penyelesaian kami adalah menggunakan kaedah pct_change() untuk menukar nilai mutlak setiap harga dalam bingkai data ke kadar pulangan harian yang sepadan.
Sebagai contoh, mari kita mengira pekali korelasi pada tahun 2016.
# Calculating the Pearson correlation coefficient for digital currencies in 2016
combined_df_2016 = combined_df[combined_df.index.year == 2016]
combined_df_2016.pct_change().corr(method='pearson')
Jadual di atas menunjukkan pekali korelasi. Apabila pekali berdekatan dengan 1 atau - 1, ini bermakna siri ini berkorelasi positif atau negatif, masing-masing. Apabila pekali korelasi berdekatan dengan 0, ini bermakna objek yang sepadan tidak berkorelasi dan turun naiknya bebas antara satu sama lain.
Untuk memvisualisasikan hasilnya dengan lebih baik, kami mencipta fungsi bantuan visual baru.
def correlation_heatmap(df, title, absolute_bounds=True):
'''Plot a correlation heatmap for the entire dataframe'''
heatmap = go.Heatmap(
z=df.corr(method='pearson').as_matrix(),
x=df.columns,
y=df.columns,
colorbar=dict(title='Pearson Coefficient'),
)
layout = go.Layout(title=title)
if absolute_bounds:
heatmap['zmax'] = 1.0
heatmap['zmin'] = -1.0
fig = go.Figure(data=[heatmap], layout=layout)
py.iplot(fig)
correlation_heatmap(combined_df_2016.pct_change(), "Cryptocurrency Correlations in 2016")
Di sini, nilai merah gelap mewakili korelasi yang kuat (setiap mata wang jelas berkorelasi tinggi dengan dirinya sendiri), dan nilai biru gelap mewakili korelasi terbalik.
Pada asasnya, ia menunjukkan turun naik harga mata wang digital yang berbeza pada tahun 2016, dengan sedikit korelasi yang signifikan secara statistik.
Sekarang, untuk mengesahkan hipotesis kami bahawa
combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')
Adakah data di atas lebih relevan? Adakah mereka mencukupi untuk digunakan sebagai standard penilaian pelaburan? Jawapannya tidak.
Walau bagaimanapun, perlu diperhatikan bahawa hampir semua mata wang digital semakin saling berkaitan.
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")
Seperti yang kita lihat dari carta di atas, perkara-perkara menjadi lebih menarik.
Persoalan yang baik, tapi sebenarnya, saya tidak pasti...
Fungsi pertama saya adalah bahawa dana lindung nilai baru-baru ini mula berdagang secara terbuka di pasaran mata wang digital. Dana-dana ini memegang modal yang jauh lebih banyak daripada pedagang biasa. Apabila dana lindung nilai modal yang dilaburkan di antara pelbagai mata wang digital, ia menggunakan strategi perdagangan yang sama untuk setiap mata wang mengikut pembolehubah bebas (seperti pasaran saham). Dari perspektif ini, masuk akal bahawa trend peningkatan korelasi ini akan berlaku.
Pemahaman yang lebih mendalam tentang XRP dan STR
Sebagai contoh, jelas dari carta di atas bahawa XRP (token Ripple
Menariknya, Stellar dan Ripple adalah platform teknologi kewangan yang sangat serupa, yang kedua-duanya bertujuan untuk mengurangkan langkah-langkah yang membosankan pemindahan rentas sempadan antara bank. Adalah dapat dibayangkan bahawa beberapa pemain besar dan dana lindung nilai mungkin menggunakan strategi perdagangan yang sama untuk pelaburan mereka di Stellar dan Ripple, memandangkan persamaan token yang digunakan oleh perkhidmatan blockchain. Ini mungkin mengapa XRP lebih relevan dengan STR daripada mata wang digital lain.
Penjelasan di atas adalah sebahagian besarnya spekulatif, dan anda mungkin melakukan lebih baik. Berdasarkan asas yang telah kami letakkan, anda mempunyai beratus-ratus cara yang berbeza untuk terus meneroka cerita yang terkandung dalam data.
Berikut adalah beberapa cadangan saya.Pembaca boleh merujuk kepada penyelidikan dalam arah berikut:
Bahagian terbaik mengenai Bitcoin dan mata wang digital pada umumnya adalah sifatnya yang terdesentralisasi, yang menjadikannya lebih bebas dan demokratik daripada aset lain. Anda boleh berkongsi analisis anda sumber terbuka, menyertai komuniti, atau menulis blog! Saya harap anda telah menguasai kemahiran yang diperlukan untuk analisis diri dan keupayaan untuk berfikir secara dialektik ketika membaca mana-mana artikel mata wang digital spekulatif pada masa akan datang, terutamanya ramalan tanpa sokongan data. Terima kasih kerana membaca. Jika anda mempunyai sebarang komen, cadangan atau kritikan mengenai tutorial ini, sila tinggalkan mesej dihttps://www.fmz.com/bbs.