Bagaimana dengan harga Bitcoin? Apa alasan kenaikan dan penurunan harga mata uang digital? Apakah harga pasar Altcoin yang berbeda terkait erat atau sebagian besar independen? Bagaimana kita bisa memprediksi apa yang akan terjadi selanjutnya?
Artikel tentang mata uang digital, seperti Bitcoin dan Ethereum, sekarang penuh dengan spekulasi. Ratusan ahli yang mengaku diri mereka menganjurkan tren yang mereka harapkan. Apa yang kurang dari banyak analisis ini adalah dasar yang kuat untuk data dasar dan model statistik.
Tujuan dari artikel ini adalah untuk memberikan pengenalan singkat tentang analisis mata uang digital dengan menggunakan Python. Kami akan menggunakan skrip Python sederhana untuk mengambil, menganalisis dan memvisualisasikan data mata uang digital yang berbeda. Dalam proses ini, kami akan menemukan tren menarik dalam perilaku pasar fluktuasi ini dan bagaimana mereka berkembang.
Ini bukan artikel yang menjelaskan mata uang digital, juga bukan pendapat tentang mata uang tertentu yang akan meningkat dan yang akan menurun. Sebaliknya, apa yang kami fokuskan dalam tutorial ini adalah untuk mendapatkan data asli dan menemukan cerita yang tersembunyi dalam angka-angka.
Tutorial ini ditujukan untuk penggemar, insinyur dan ilmuwan data di semua tingkat keterampilan. Apakah Anda seorang pemimpin industri atau pemula pemrograman, satu-satunya keterampilan yang Anda butuhkan adalah pemahaman dasar bahasa pemrograman Python dan pengetahuan yang cukup tentang operasi baris perintah (mampu mengatur proyek ilmu data sudah cukup).
Semua fitur yang disebutkan di atas dikemas dalam sistem seperti Docker. Apa yang perlu kita lakukan adalah membeli atau menyewa layanan komputasi awan kita sendiri dan menyebarkan sistem Docker.
Dalam nama resmi platform FMZ Quant, sistem Docker ini disebut sistem Docker.
Silakan lihat artikel saya sebelumnya tentang cara mengimplementasikan docker dan robot:https://www.fmz.com/bbs-topic/9864.
Pembaca yang ingin membeli server komputasi awan mereka sendiri untuk menyebarkan dockers dapat merujuk pada artikel ini:https://www.fmz.com/digest-topic/5711.
Setelah menyebarkan server komputasi awan dan sistem docker dengan sukses, selanjutnya kita akan menginstal artefak terbesar saat ini Python: Anaconda
Untuk mewujudkan semua lingkungan program yang relevan (perpustakaan ketergantungan, manajemen versi, dll.) yang diperlukan dalam artikel ini, cara termudah adalah menggunakan Anaconda.
Karena kami menginstal Anaconda pada layanan cloud, kami merekomendasikan bahwa server cloud menginstal sistem Linux ditambah versi baris perintah Anaconda.
Untuk metode instalasi Anaconda, silakan lihat panduan resmi Anaconda:https://www.anaconda.com/distribution/.
Jika Anda seorang programmer Python yang berpengalaman dan jika Anda merasa bahwa Anda tidak perlu menggunakan Anaconda, itu tidak masalah sama sekali. Saya akan berasumsi bahwa Anda tidak memerlukan bantuan saat menginstal lingkungan dependen yang diperlukan. Anda dapat melewatkan bagian ini langsung.
Setelah Anaconda diinstal, kita perlu membuat lingkungan baru untuk mengelola paket tergantung kita.
conda create --name cryptocurrency-analysis python=3
untuk menciptakan lingkungan Anaconda baru untuk proyek kami.
Selanjutnya, input:
source activate cryptocurrency-analysis (linux/MacOS operating system)
or
activate cryptocurrency-analysis (windows operating system)
untuk mengaktifkan lingkungan.
Selanjutnya, input:
conda install numpy pandas nb_conda jupyter plotly
untuk menginstal berbagai paket tergantung yang diperlukan untuk proyek ini.
Catatan: Mengapa menggunakan lingkungan Anaconda? Jika Anda berencana untuk menjalankan banyak proyek Python di komputer Anda, sangat membantu untuk memisahkan paket dependen (perpustakaan perangkat lunak dan paket) dari proyek yang berbeda untuk menghindari konflik.
Setelah lingkungan dan paket tergantung diinstal, jalankan:
jupyter notebook
untuk memulai kernel iPython, lalu kunjungihttp://localhost:8888/dengan browser Anda, buat buku catatan Python baru, pastikan menggunakan:
Python [conda env:cryptocurrency-analysis]
kernel
Buat buku catatan Jupyter kosong, dan hal pertama yang perlu kita lakukan adalah mengimpor paket dependen yang diperlukan.
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
Kita juga perlu mengimpor Plotly dan mengaktifkan mode offline:
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
Persiapan selesai, dan sekarang kita bisa mulai mendapatkan data yang akan dianalisis. Pertama, kita akan menggunakan antarmuka API dari platform FMZ Quant untuk mendapatkan data harga Bitcoin.
Ini akan menggunakan fungsi GetTicker. Untuk penggunaan kedua fungsi ini, silakan lihat:https://www.fmz.com/api.
Untuk memfasilitasi akuisisi data, kita perlu menulis fungsi untuk men-download dan menyinkronkan data dari Quandl (quandl.comIni adalah antarmuka data keuangan gratis, yang menikmati reputasi tinggi di luar negeri. Platform FMZ Quant juga menyediakan antarmuka data serupa, yang terutama digunakan untuk transaksi bot nyata. Karena artikel ini terutama berfokus pada analisis data, kami masih menggunakan data Quandl di sini.
Selama transaksi bot nyata, Anda dapat 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 meringkas data dan menyimpan data yang diunduh sebagai file, sehingga program tidak akan mengunduh data yang sama setiap kali dijalankan. Fungsi ini akan mengembalikan data dalam format Pandas Dataframe.
Mari kita ambil Kraken Bitcoin Exchange sebagai contoh, mulai dari mendapatkan harga Bitcoin.
# Get prices on the Kraken Bitcoin exchange
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
Gunakan metode head ((() untuk melihat lima baris pertama kotak data.
btc_usd_price_kraken.head()
Hasilnya adalah:
Selanjutnya, kita akan membuat tabel sederhana untuk memverifikasi kebenaran 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 menyelesaikan bagian visualisasi. Dibandingkan dengan menggunakan beberapa pustaka visualisasi data Python yang lebih matang, seperti Matplotlib, Plotly adalah pilihan yang kurang umum, tetapi itu benar-benar pilihan yang baik, karena dapat memanggil grafik D3.js
Tips: Bagan yang dihasilkan dapat dibandingkan dengan bagan harga Bitcoin dari bursa utama (seperti bagan di OKX, Binance atau Huobi) sebagai pemeriksaan integritas cepat untuk mengkonfirmasi apakah data yang diunduh umumnya konsisten.
Pembaca yang berhati-hati mungkin telah memperhatikan bahwa ada data yang hilang dalam data di atas, terutama pada akhir 2014 dan awal 2016.
Karakteristik dari pertukaran mata uang digital adalah bahwa hubungan penawaran dan permintaan menentukan harga mata uang. Oleh karena itu, tidak ada harga transaksi yang bisa menjadi
Mari kita mulai dengan mengunduh data dari setiap pertukaran ke kerangka data yang terdiri dari 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
Selanjutnya, kita akan mendefinisikan fungsi khusus untuk menggabungkan kolom yang umum untuk setiap bingkai data ke dalam bingkai data baru. mari kita sebut fungsi merge_dfs_on_column.
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 kerangka data terintegrasi berdasarkan kolom
# 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 tabel di atas, kita dapat melihat bahwa data ini sesuai dengan harapan kami, dengan rentang data yang sama, tetapi sedikit berbeda berdasarkan keterlambatan atau karakteristik setiap pertukaran.
Dari perspektif logika analisis, langkah selanjutnya adalah membandingkan data ini melalui visualisasi. Untuk melakukan ini, kita perlu mendefinisikan fungsi bantu terlebih dahulu. Dengan memberikan perintah satu baris untuk menggunakan data untuk membuat grafik, kita menyebutnya 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 membahas prinsip logika fungsi bantu ini terlalu banyak. Jika Anda ingin tahu lebih lanjut, silakan periksa dokumentasi resmi Pandas dan Plotly.
Sekarang, kita dapat membuat grafik 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 grafik di atas, meskipun empat seri data mengikuti jalur yang sama, masih ada beberapa perubahan yang tidak teratur.
Pada periode 2012-2017, kita tahu bahwa harga Bitcoin tidak pernah sama dengan nol, jadi kita menghapus semua nilai nol dalam kerangka data terlebih dahulu.
# Clear the "0" value
btc_usd_datasets.replace(0, np.nan, inplace=True)
Setelah merekonstruksi kerangka data, kita bisa melihat grafik yang lebih jelas tanpa data yang hilang lagi.
# Plot the revised data frame
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')
Kita bisa menghitung kolom baru sekarang: harga Bitcoin rata-rata harian dari 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 gambar lagi untuk memeriksa apakah data terlihat 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])
Kemudian, kita akan terus menggunakan data seri harga agregat ini untuk menentukan nilai tukar antara mata uang digital lainnya dan USD.
Sejauh ini, kita memiliki data deret waktu harga Bitcoin. Selanjutnya, mari kita lihat beberapa data mata uang digital non-Bitcoin, yaitu, Altcoins. Tentu saja, istilah
Pertama, kami menggunakan API dari Poloniex exchange untuk mendapatkan informasi data transaksi mata uang digital. Kami mendefinisikan dua fungsi tambahan untuk mendapatkan data yang berkaitan dengan Altcoins. Dua fungsi ini terutama men-download dan cache data JSON melalui API.
Pertama, kita mendefinisikan fungsi get_ json_data, yang akan mengunduh 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
Selanjutnya, kita mendefinisikan fungsi baru yang akan menghasilkan permintaan HTTP dari API Poloniex dan memanggil fungsi get_ json_data yang baru didefinisikan 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 kode karakter yang cocok dari mata uang digital (seperti
Sebagian besar Altcoin tidak dapat dibeli dalam USD secara langsung. Untuk mendapatkan mata uang digital ini, individu biasanya harus membeli Bitcoin terlebih dahulu, dan kemudian mengubahnya menjadi Altcoin sesuai rasio harga mereka. Oleh karena itu, kita harus mengunduh nilai tukar setiap mata uang digital ke Bitcoin, dan kemudian menggunakan data harga Bitcoin yang ada untuk mengubahnya menjadi USD. Kami akan mengunduh data nilai tukar untuk 9 mata uang 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 memiliki kamus yang berisi 9 kerangka data, yang masing-masing berisi data harga rata-rata harian antara Altcoin dan Bitcoin.
Kita dapat menentukan apakah data tersebut benar melalui beberapa baris terakhir dari tabel harga Ethereum.
altcoin_data['ETH'].tail()
Sekarang, kita dapat menggabungkan data nilai tukar BTC dan Altcoin dengan indeks harga Bitcoin untuk menghitung harga historis masing-masing 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 menambahkan kolom baru untuk setiap kerangka data Altcoin untuk menyimpan harga USD yang sesuai.
Selanjutnya, kita dapat menggunakan kembali fungsi merge_dfs_on_column yang sebelumnya didefinisikan untuk membuat kerangka data gabungan dan mengintegrasikan harga USD dari setiap mata uang 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')
Sudah selesai!
Sekarang mari kita tambahkan harga Bitcoin sebagai kolom terakhir ke kerangka data yang digabungkan.
# Add BTC price to data frame
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
Sekarang kami memiliki kerangka data yang unik, yang berisi harga USD harian dari sepuluh mata uang digital yang kami verifikasi.
Kami memanggil fungsi sebelumnya df_scatter lagi, menunjukkan harga yang sesuai dari semua Altcoin dalam bentuk grafik.
Tampaknya tidak ada masalah dalam grafik. Bagan ini menunjukkan gambaran lengkap tentang perubahan harga pertukaran untuk setiap mata uang digital dalam beberapa tahun terakhir.
Catatan: di sini kita menggunakan sumbu y spesifikasi logaritma untuk membandingkan semua mata uang digital pada grafik yang sama.
Pembaca yang berhati-hati mungkin telah memperhatikan bahwa harga mata uang digital tampaknya relevan, meskipun nilai mata uang mereka bervariasi secara luas dan sangat fluktuatif.
Tentu saja, kesimpulan yang didukung oleh data lebih meyakinkan daripada intuisi berdasarkan gambar.
Kita dapat menggunakan fungsi Pandas corr() untuk memverifikasi hipotesis korelasi di atas. Metode uji ini menghitung koefisien korelasi Pearson dari setiap kolom dari bingkai data yang sesuai dengan kolom lainnya.
Catatan revisi pada 2017.8.22: Bagian ini dimodifikasi untuk menggunakan tingkat pengembalian harian alih-alih nilai absolut harga saat menghitung koefisien korelasi.
Perhitungan langsung berdasarkan deret waktu yang tidak solid (seperti data harga mentah) dapat menyebabkan penyimpangan koefisien korelasi. Untuk memecahkan masalah ini, solusi kami adalah menggunakan metode pct_change() untuk mengkonversi nilai absolut setiap harga dalam kerangka data menjadi tingkat pengembalian harian yang sesuai.
Sebagai contoh, mari kita hitung koefisien 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')
Diagram di atas menunjukkan koefisien korelasi. Ketika koefisien dekat dengan 1 atau -1, itu berarti bahwa seri ini berkorelasi positif atau negatif, masing-masing. Ketika koefisien korelasi dekat dengan 0, itu berarti bahwa objek yang sesuai tidak berkorelasi dan fluktuasi mereka independen satu sama lain.
Untuk lebih memvisualisasikan hasilnya, kami membuat 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 uang jelas sangat berkorelasi dengan dirinya sendiri), dan nilai biru gelap mewakili korelasi terbalik.
Pada dasarnya, ini menunjukkan fluktuasi harga mata uang digital yang berbeda pada tahun 2016, dengan sedikit korelasi yang signifikan secara statistik.
Sekarang, untuk memverifikasi hipotesis kami bahwa
combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')
Apakah data di atas lebih relevan? Apakah mereka cukup untuk digunakan sebagai standar penilaian untuk investasi?
Namun, perlu dicatat bahwa hampir semua mata uang digital telah menjadi semakin saling terkait.
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")
Seperti yang dapat kita lihat dari grafik di atas, hal-hal menjadi semakin menarik.
Pertanyaan yang bagus, tapi kenyataannya, aku tidak yakin...
Reaksi pertama saya adalah bahwa hedge fund baru-baru ini mulai berdagang secara terbuka di pasar mata uang digital. Dana-dana ini memiliki modal yang jauh lebih banyak daripada pedagang biasa. Ketika dana melindungi modal yang diinvestasikan di antara beberapa mata uang digital, ia menggunakan strategi perdagangan yang sama untuk setiap mata uang sesuai dengan variabel independen (seperti pasar saham). Dari perspektif ini, masuk akal bahwa tren peningkatan korelasi ini akan terjadi.
Pemahaman yang lebih dalam tentang XRP dan STR
Sebagai contoh, jelas dari grafik di atas bahwa XRP (token Ripple
Menariknya, Stellar dan Ripple adalah platform teknologi keuangan yang sangat mirip, yang keduanya bertujuan untuk mengurangi langkah-langkah yang membosankan dari transfer lintas batas antara bank.
Penjelasan di atas sebagian besar spekulatif, dan Anda mungkin melakukan lebih baik. Berdasarkan dasar yang telah kami letakkan, Anda memiliki ratusan cara yang berbeda untuk terus mengeksplorasi cerita yang terkandung dalam data.
Berikut adalah beberapa saran saya. Pembaca dapat merujuk pada penelitian di arah berikut:
Bagian terbaik tentang Bitcoin dan mata uang digital pada umumnya adalah sifatnya yang terdesentralisasi, yang membuatnya lebih bebas dan demokratis daripada aset lainnya. Anda dapat membagikan analisis Anda open-source, berpartisipasi dalam komunitas, atau menulis blog! Saya harap Anda telah menguasai keterampilan yang diperlukan untuk analisis diri dan kemampuan untuk berpikir dialektik ketika membaca artikel mata uang digital spekulatif di masa depan, terutama prediksi tanpa dukungan data. Terima kasih telah membaca. Jika Anda memiliki komentar, saran atau kritik tentang tutorial ini, silakan tinggalkan pesan dihttps://www.fmz.com/bbs.