
بٹ کوائن کی قیمت کیسی کارکردگی دکھا رہی ہے؟ کرپٹو کرنسی کی قیمتوں میں اضافے اور گرنے کا کیا سبب ہے؟ کیا مختلف altcoins کی مارکیٹ کی قیمتیں ایک دوسرے سے جڑے ہوئے ہیں یا وہ بڑی حد تک آزاد ہیں؟ ہم کیسے پیش گوئی کریں کہ آگے کیا ہوگا؟
ڈیجیٹل کرنسیوں کے بارے میں مضامین، جیسے کہ بٹ کوائن اور ایتھریم، اب قیاس آرائیوں سے بھرے ہوئے ہیں، سینکڑوں خود ساختہ ماہرین ان رجحانات کی وکالت کر رہے ہیں جن کے ابھرنے کی توقع ہے۔ ان میں سے بہت سے تجزیوں سے جو چیز غائب ہے وہ بنیادی ڈیٹا اور شماریاتی ماڈلز میں ایک مضبوط بنیاد ہے۔
اس مضمون کا مقصد Python کا استعمال کرتے ہوئے کریپٹو کرنسی کے تجزیہ کا ایک سادہ تعارف فراہم کرنا ہے۔ ہم مختلف کریپٹو کرنسیوں کے لیے ڈیٹا کی بازیافت، تجزیہ اور تصور کرنے کے لیے ایک سادہ ازگر اسکرپٹ سے گزریں گے۔ راستے میں، ہم ان غیر مستحکم مارکیٹوں کے رویے اور ان کی نشوونما کے بارے میں دلچسپ رجحانات دریافت کریں گے۔

یہ کرپٹو کرنسیوں کی وضاحت کرنے والا مضمون نہیں ہے، اور نہ ہی یہ ایک رائے ہے جس پر مخصوص کرنسیوں میں اضافہ ہوگا اور کون سی گرے گی۔ اس کے بجائے، اس ٹیوٹوریل میں ہماری توجہ صرف خام ڈیٹا لینا اور اعداد میں چھپی کہانیوں کو دریافت کرنا ہے۔
یہ ٹیوٹوریل تمام مہارتوں کے شوقینوں، انجینئرز، اور ڈیٹا سائنسدانوں کے لیے ڈیزائن کیا گیا ہے چاہے آپ انڈسٹری کے ماہر ہوں یا پروگرامنگ کے نوآموز، آپ کو صرف ایک ہی مہارت کی ضرورت ہے جو Python پروگرامنگ زبان کی بنیادی سمجھ اور کمانڈ لائن آپریشنز کا کافی علم ہے۔ (ڈیٹا سائنس پروجیکٹ قائم کرنے کے قابل ہونا کام کرے گا)۔
اہم مرکزی دھارے کے تبادلے سے اعلیٰ معیار کے ڈیٹا کے ذرائع فراہم کرنے کے علاوہ، موجد مقداری پلیٹ فارم FMZ.COM ڈیٹا کے تجزیہ کو مکمل کرنے کے بعد خودکار لین دین کرنے میں ہماری مدد کرنے کے لیے API انٹرفیس کا ایک بھرپور سیٹ بھی فراہم کرتا ہے۔ انٹرفیس کے اس سیٹ میں عملی ٹولز شامل ہیں جیسے اکاؤنٹ کی معلومات کے بارے میں استفسار کرنا، اعلیٰ، کھولنے، کم، بند ہونے والی قیمتوں، تجارتی حجم، مختلف مرکزی دھارے کے تبادلے کے مختلف عام طور پر استعمال ہونے والے تکنیکی تجزیہ اشارے، وغیرہ، خاص طور پر اصل میں بڑے مرکزی دھارے کے تبادلے سے جڑنے کے لیے۔ تجارتی عمل عوامی API انٹرفیس طاقتور تکنیکی مدد فراہم کرتا ہے۔
مندرجہ بالا تمام افعال ڈوکر کی طرح ایک سسٹم میں شامل ہیں ہمیں اپنی کلاؤڈ کمپیوٹنگ سروس کو خریدنا یا کرایہ پر لینا ہے اور پھر ڈوکر سسٹم کو تعینات کرنا ہے۔
موجد کوانٹیٹیو پلیٹ فارم کے آفیشل نام پر، اس ڈوکر سسٹم کو میزبان سسٹم کہا جاتا ہے۔
میزبانوں اور روبوٹس کو تعینات کرنے کے طریقے کے بارے میں مزید معلومات کے لیے، براہ کرم میرا سابقہ مضمون دیکھیں: https://www.fmz.com/bbs-topic/4140
وہ قارئین جو اپنا کلاؤڈ کمپیوٹنگ سرور تعیناتی میزبان خریدنا چاہتے ہیں اس مضمون کا حوالہ دے سکتے ہیں: https://www.fmz.com/bbs-topic/2848
کلاؤڈ کمپیوٹنگ سروس اور ہوسٹ سسٹم کو کامیابی کے ساتھ تعینات کرنے کے بعد، ہم سب سے طاقتور Python ٹول انسٹال کریں گے: ایناکونڈا
اس مضمون کے لیے درکار تمام متعلقہ پروگرام ماحول کو حاصل کرنے کے لیے (انحصار لائبریریاں، ورژن کا انتظام، وغیرہ)، سب سے آسان طریقہ ایناکونڈا کا استعمال ہے۔ یہ ایک پیکڈ Python ڈیٹا سائنس ایکو سسٹم اور انحصار مینیجر ہے۔
چونکہ ہم کلاؤڈ سروس پر ایناکونڈا انسٹال کر رہے ہیں، اس لیے ہم تجویز کرتے ہیں کہ آپ لینکس سسٹم کے علاوہ ایناکونڈا کا کمانڈ لائن ورژن کلاؤڈ سرور پر انسٹال کریں۔
ایناکونڈا کی تنصیب کے طریقہ کار کے لیے، براہ کرم ایناکونڈا کے آفیشل گائیڈ سے رجوع کریں: https://www.anaconda.com/distribution/
اگر آپ ایک تجربہ کار Python پروگرامر ہیں اور Anaconda استعمال کرنے کی ضرورت محسوس نہیں کرتے ہیں تو یہ بالکل ٹھیک ہے۔ میں فرض کروں گا کہ آپ کو مطلوبہ انحصار کو انسٹال کرنے میں مدد کی ضرورت نہیں ہے اور آپ حصہ 2 پر جا سکتے ہیں۔
ایناکونڈا انسٹال ہونے کے بعد، ہمیں اپنے انحصار پیکجوں کو منظم کرنے کے لیے ایک نیا ماحول بنانا ہوگا۔ لینکس کمانڈ لائن انٹرفیس میں، ہم درج کرتے ہیں:
conda create --name cryptocurrency-analysis python=3
آئیے اپنے پروجیکٹ کے لیے ایک نیا ایناکونڈا ماحول بنائیں۔
اگلا، درج کریں
source activate cryptocurrency-analysis (linux/MacOS操作)
或者
activate cryptocurrency-analysis (windows操作系统)
اس ماحول کو چالو کرنے کے لیے
اگلا، درج کریں:
conda install numpy pandas nb_conda jupyter plotly
اس پروجیکٹ کے لیے درکار مختلف انحصار پیکجوں کو انسٹال کرنے کے لیے۔
نوٹ: ایناکونڈا ماحول کیوں استعمال کریں؟ اگر آپ اپنے کمپیوٹر پر ازگر کے بہت سے پروجیکٹس چلانے کا ارادہ رکھتے ہیں، تو تنازعات سے بچنے کے لیے مختلف پروجیکٹس کے انحصار (لائبریریوں اور پیکجز) کو الگ کرنا مددگار ہے۔ انانکونڈا ہر پروجیکٹ کے انحصاری پیکج کے لیے ماحولیات کی ایک خصوصی ڈائرکٹری بناتا ہے تاکہ تمام پیکجوں کو مناسب طریقے سے منظم اور ممتاز کیا جا سکے۔
ماحول اور انحصار پیکجوں کے انسٹال ہونے کے بعد، چلائیں۔
jupyter notebook
iPython کرنل شروع کرنے کے لیے، پھر اپنے براؤزر کو http://localhost:8888/ کی طرف اشارہ کریں اور ایک نئی Python نوٹ بک بنائیں، اس بات کو یقینی بناتے ہوئے کہ یہ استعمال کرتا ہے:
Python [conda env:cryptocurrency-analysis]
دانا

ایک نئی خالی Jupyter نوٹ بک بنائیں، اور سب سے پہلی چیز جو ہمیں کرنے کی ضرورت ہے وہ ہے مطلوبہ انحصار پیکجز درآمد کریں۔
import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime
ہمیں پلاٹلی درآمد کرنے اور آف لائن موڈ کو فعال کرنے کی بھی ضرورت ہے۔
import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)
اب جب کہ تیاریاں مکمل ہو چکی ہیں، ہم تجزیہ کرنے کے لیے ڈیٹا حاصل کرنا شروع کر سکتے ہیں۔ سب سے پہلے، ہمیں Bitcoin کی قیمت کا ڈیٹا حاصل کرنے کے لیے Inventor Quantitative پلیٹ فارم کا API انٹرفیس استعمال کرنے کی ضرورت ہے۔
یہ GetTicker فنکشن کا استعمال کرے گا ان دو فنکشنز کے استعمال کی تفصیلات کے لیے، براہ کرم دیکھیں: https://www.fmz.com/api
ڈیٹا کے حصول کو آسان بنانے کے لیے، ہمیں Quandl (quandl.com) سے ڈیٹا ڈاؤن لوڈ اور سنکرونائز کرنے کے لیے ایک فنکشن لکھنا ہوگا۔ یہ ایک مفت مالیاتی ڈیٹا انٹرفیس ہے جو بیرون ملک بہت مشہور ہے۔ موجد کوانٹیٹیو پلیٹ فارم بھی اسی طرح کا ڈیٹا انٹرفیس فراہم کرتا ہے، جو بنیادی طور پر ریئل ٹائم ٹریڈنگ کے لیے استعمال ہوتا ہے چونکہ یہ مضمون بنیادی طور پر ڈیٹا کے تجزیہ کے لیے ہے، ہم اب بھی یہاں Quandl کا ڈیٹا استعمال کرتے ہیں۔
ریئل ٹائم میں ٹریڈنگ کرتے وقت، آپ قیمت کا ڈیٹا حاصل کرنے کے لیے Python میں GetTicker اور GetRecords فنکشنز کو براہِ راست کال کر سکتے ہیں: https://www.fmz.com/api
def get_quandl_data(quandl_id):
# 下载和缓冲来自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
اچار کی لائبریری کا استعمال یہاں ڈیٹا کو سیریلائز کرنے اور ڈاؤن لوڈ کیے گئے ڈیٹا کو فائل کے طور پر محفوظ کرنے کے لیے کیا جاتا ہے، تاکہ جب بھی پروگرام چلتا ہے اسی ڈیٹا کو دوبارہ ڈاؤن لوڈ نہ کرے۔ یہ فنکشن پانڈاس ڈیٹا فریم فارمیٹ میں ڈیٹا واپس کرے گا۔ اگر آپ ڈیٹا فریم کے تصور سے واقف نہیں ہیں، تو اسے ایک طاقتور ایکسل اسپریڈشیٹ سمجھیں۔
آئیے کریکن بٹ کوائن ایکسچینج کو بطور مثال استعمال کریں اور اس کی بٹ کوائن کی قیمت حاصل کرکے شروعات کریں۔
# 获取Kraken比特币交易所的价格
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')
ڈیٹا فریم کی پہلی پانچ قطاریں دیکھنے کے لیے head() طریقہ استعمال کریں۔
btc_usd_price_kraken.head()
نتیجہ یہ ہے:
| BTC | Open | High | Low | Close | Volume (BTC) | Volume (Currency) | Weighted Price |
|---|---|---|---|---|---|---|---|
| 2014-01-07 | 874.67040 | 892.06753 | 810.00000 | 810.00000 | 15.622378 | 13151.472844 | 841.835522 |
| 2014-01-08 | 810.00000 | 899.84281 | 788.00000 | 824.98287 | 19.182756 | 16097.329584 | 839.156269 |
| 2014-01-09 | 825.56345 | 870.00000 | 807.42084 | 841.86934 | 8.158335 | 6784.249982 | 831.572913 |
| 2014-01-10 | 839.99000 | 857.34056 | 817.00000 | 857.33056 | 8.024510 | 6780.220188 | 844.938794 |
| 2014-01-11 | 858.20000 | 918.05471 | 857.16554 | 899.84105 | 18.748285 | 16698.566929 | 890.671709 |
اگلا، ہمیں تصور کے ذریعے ڈیٹا کی درستگی کی تصدیق کرنے کے لیے ایک سادہ ٹیبل بنانے کی ضرورت ہے۔
# 做出BTC价格的表格
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])

یہاں، ہم تصور کے حصے کو مکمل کرنے کے لیے Plotly استعمال کرتے ہیں۔ Plotly کچھ زیادہ پختہ Python ڈیٹا ویژولائزیشن لائبریریوں، جیسے Matplotlib کو استعمال کرنے کے مقابلے میں کم عام انتخاب ہے، لیکن یہ ایک اچھا انتخاب ہے کیونکہ یہ مکمل طور پر انٹرایکٹو چارٹس کے لیے D3.js پر کال کر سکتا ہے۔ چارٹس میں بہت اچھی ڈیفالٹ سیٹنگز ہیں، دریافت کرنا آسان ہے، اور ویب صفحات میں سرایت کرنے کے لیے بہت آسان ہیں۔
ٹپ: آپ تیار کردہ چارٹ کا موازنہ کسی بڑے ایکسچینج (جیسے OKEX، Binance، یا Huobi پر) سے بٹ کوائن کی قیمت کے چارٹ کے ساتھ کر سکتے ہیں تاکہ اس بات کی تصدیق کی جا سکے کہ ڈاؤن لوڈ کردہ ڈیٹا تقریباً مطابقت رکھتا ہے۔
ہوشیار قارئین نے محسوس کیا ہوگا کہ مذکورہ ڈیٹا میں خاص طور پر 2014 کے آخر اور 2016 کے اوائل میں ڈیٹا غائب ہے۔ یہ ڈیٹا فرق خاص طور پر کریکن ایکسچینج میں واضح ہے۔ ہم یقینی طور پر نہیں چاہتے کہ یہ گمشدہ ڈیٹا قیمتوں کے ہمارے تجزیہ کو متاثر کرے۔
ڈیجیٹل کرنسی ایکسچینج کی خصوصیت یہ ہے کہ کرنسی کی قیمت کا تعین طلب اور رسد سے ہوتا ہے۔ لہذا، کوئی بھی لین دین کی قیمت مارکیٹ کی “مین اسٹریم قیمت” نہیں بن سکتی۔ اس مسئلے کو حل کرنے کے ساتھ ساتھ لاپتہ ڈیٹا کا مسئلہ جس کا ابھی ذکر کیا گیا ہے (ممکنہ طور پر تکنیکی بندش اور ڈیٹا کی خرابیوں کی وجہ سے)، ہم دنیا کے تین بڑے بٹ کوائن ایکسچینجز سے ڈیٹا ڈاؤن لوڈ کریں گے اور بٹ کوائن کی اوسط قیمت کا حساب لگائیں گے۔
آئیے ہر ایک ایکسچینج کے ڈیٹا کو ایک لغت کی قسم پر مشتمل ڈیٹا فریم میں ڈاؤن لوڈ کرکے شروع کریں۔
# 下载COINBASE,BITSTAMP和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
اگلا، ہم ہر ڈیٹا فریم سے مشترکہ کالموں کو ایک نئے ڈیٹا فریم میں ضم کرنے کے لیے ایک خصوصی فنکشن کی وضاحت کریں گے۔ آئیے اسے 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)
اب، ہر ڈیٹاسیٹ کے “ویٹڈ پرائس” کالم کی بنیاد پر تمام ڈیٹا فریمز کو اکٹھا کریں۔
# 整合所有数据帧
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')
آخر میں، ہم ضم شدہ ڈیٹا کی آخری پانچ قطاریں دیکھنے کے لیے “tail()” طریقہ استعمال کرتے ہیں تاکہ یہ یقینی بنایا جا سکے کہ ڈیٹا درست اور مکمل ہے۔
btc_usd_datasets.tail()
نتیجہ یہ ہے:
| BTC | BITSTAMP | COINBASE | ITBIT | KRAKEN |
|---|---|---|---|---|
| 2017-08-14 | 4210.154943 | 4213.332106 | 4207.366696 | 4213.257519 |
| 2017-08-15 | 4101.447155 | 4131.606897 | 4127.036871 | 4149.146996 |
| 2017-08-16 | 4193.426713 | 4193.469553 | 4190.104520 | 4187.399662 |
| 2017-08-17 | 4338.694675 | 4334.115210 | 4334.449440 | 4346.508031 |
| 2017-08-18 | 4182.166174 | 4169.555948 | 4175.440768 | 4198.277722 |
جیسا کہ آپ اوپر دیے گئے جدول سے دیکھ سکتے ہیں، یہ ڈیٹا ہماری توقعات کے مطابق ہے، ڈیٹا کی حد تقریباً ایک جیسی ہے، لیکن ہر تبادلے کی تاخیر یا خصوصیات کی بنیاد پر تھوڑا سا فرق ہے۔
تجزیاتی منطق کے نقطہ نظر سے، اگلا مرحلہ تصور کے ذریعے ان اعداد و شمار کا موازنہ کرنا ہے۔ ایسا کرنے کے لیے، ہمیں سب سے پہلے ایک مددگار فنکشن کی وضاحت کرنی ہوگی جو ایک لائن کمانڈ فراہم کرکے ڈیٹا کو چارٹ بنانے کے لیے استعمال کرتا ہے۔
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'
# 每个系列的表格跟踪
trace_arr = []
for index, series in enumerate(series_arr):
trace = go.Scatter(
x=series.index,
y=series,
name=label_arr[index],
visible=visibility
)
# 为系列添加单独的轴
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)
آپ کی آسانی سے سمجھنے کے لیے، یہ مضمون اس معاون فعل کے منطقی اصول پر تفصیل سے بات نہیں کرے گا۔ اگر آپ مزید جاننا چاہتے ہیں تو پانڈوں اور پلاٹلی کے لیے سرکاری دستاویزات دیکھیں۔
اب ہم آسانی سے بٹ کوائن کی قیمت کے ڈیٹا کے گراف بنا سکتے ہیں!
# 绘制所有BTC交易价格
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

جیسا کہ آپ اوپر کے گراف سے دیکھ سکتے ہیں، اگرچہ چار سیریز تقریباً ایک ہی راستے پر چلتی ہیں، لیکن ان میں کچھ بے ضابطگیاں ہیں، جنہیں ہم صاف کرنے کی کوشش کریں گے۔
2012-2017 کے عرصے میں، ہم جانتے ہیں کہ Bitcoin کی قیمت کبھی بھی صفر کے برابر نہیں رہی، اس لیے ہم سب سے پہلے ڈیٹا فریم میں تمام صفر کی قدروں کو ہٹاتے ہیں۔
# 清除"0"值
btc_usd_datasets.replace(0, np.nan, inplace=True)
ڈیٹا فریم کو دوبارہ بنانے کے بعد، ہم ایک بہت واضح گراف دیکھ سکتے ہیں جس میں ڈیٹا غائب نہیں ہے۔
# 绘制修订后的数据框
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

اب ہم ایک نئے کالم کا حساب لگا سکتے ہیں: تمام ایکسچینجز میں بٹ کوائن کی اوسط یومیہ قیمت۔
# 将平均BTC价格计算为新列
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)
نیا کالم بٹ کوائن پرائس انڈیکس ہے! آئیے یہ چیک کرنے کے لیے دوبارہ پلاٹ کریں کہ آیا ڈیٹا میں کچھ گڑبڑ نظر آتی ہے۔
# 绘制平均BTC价格
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])

ایسا لگتا ہے کہ کوئی مسئلہ نہیں ہے، اور ہم دیگر کریپٹو کرنسیوں اور امریکی ڈالر کے درمیان شرح مبادلہ کا تعین کرنے کے لیے بعد میں قیمتوں کے اس مجموعی ڈیٹا کو استعمال کرتے رہیں گے۔
ابھی تک، ہمارے پاس Bitcoin کی قیمتوں کے لیے ٹائم سیریز کا ڈیٹا موجود ہے۔ اس کے بعد، آئیے غیر بٹ کوائن ڈیجیٹل کرنسیوں پر کچھ ڈیٹا دیکھتے ہیں، یعنی altcoins کی صورت حال، یقیناً، altcoin کی اصطلاح تھوڑی بہت مضبوط ہو سکتی ہے، لیکن مارکیٹ کیپٹلائزیشن کی درجہ بندی کے علاوہ، ڈیجیٹل کرنسیوں کی موجودہ ترقی کے لیے۔ ٹاپ ٹین (جیسے Bitcoin، Ethereum، EOS، USDT، وغیرہ) میں کوئی حرج نہیں ہے کہ ہمیں ان کرنسیوں سے دور رہنے کی کوشش کرنی چاہیے کیونکہ یہ بہت زیادہ مبہم ہیں۔
سب سے پہلے، ہم ڈیجیٹل کرنسی کے لین دین پر ڈیٹا کی معلومات حاصل کرنے کے لیے Poloniex ایکسچینج کا API استعمال کرتے ہیں۔ ہم altcoins کے متعلقہ ڈیٹا کو حاصل کرنے کے لیے دو معاون فنکشنز کی وضاحت کرتے ہیں یہ دونوں فنکشنز بنیادی طور پر API کے ذریعے JSON ڈیٹا کو ڈاؤن لوڈ اور کیش کرتے ہیں۔
سب سے پہلے، ہم get_json_data فنکشن کی وضاحت کرتے ہیں، جو دیئے گئے یو آر ایل سے JSON ڈیٹا کو ڈاؤن لوڈ اور کیش کرے گا۔
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
اگلا، ہم ایک نئے فنکشن کی وضاحت کرتے ہیں جو Poloniex API سے HTTP درخواست کرے گا اور get_json_data فنکشن کو کال کرے گا جسے ہم نے ابھی کال کے نتیجے کو محفوظ کرنے کے لیے بیان کیا ہے۔
base_polo_url = 'https://poloniex.com/public?command=returnChartData¤cyPair={}&start={}&end={}&period={}'
start_date = datetime.strptime('2015-01-01', '%Y-%m-%d') # 从2015年开始获取数据
end_date = datetime.now() # 直到今天
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
مندرجہ بالا فنکشن cryptocurrency pair (جیسے “BTC_ETH”) کے سٹرنگ کوڈ کو نکالے گا اور دونوں کرنسیوں کی تاریخی قیمتوں پر مشتمل ڈیٹا فریم واپس کرے گا۔
زیادہ تر altcoins کو براہ راست امریکی ڈالر کا استعمال کرتے ہوئے نہیں خریدا جا سکتا ہے، اگر افراد یہ ڈیجیٹل کرنسی حاصل کرنا چاہتے ہیں، تو انہیں عام طور پر پہلے Bitcoin خریدنا پڑتا ہے اور پھر ان کے درمیان قیمت کے تناسب کی بنیاد پر ان کا تبادلہ کرنا پڑتا ہے۔ لہذا، ہمیں ہر ایک ڈیجیٹل کرنسی کی شرح تبادلہ کو Bitcoin میں ڈاؤن لوڈ کرنا ہوگا، اور پھر موجودہ Bitcoin قیمت کے ڈیٹا کو امریکی ڈالر میں تبدیل کرنے کے لیے استعمال کرنا ہوگا۔ ہم 9 ٹاپ کریپٹو کرنسیوں کے لیے لین دین کا ڈیٹا ڈاؤن لوڈ کریں گے: Ethereum, Litecoin, Ripple, EthereumClassic, Stellar, Dash, Siacoin, Monero, اور 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
اب ہمارے پاس ایک لغت ہے جس میں 9 ڈیٹا فریم ہیں، ہر ایک میں altcoins اور Bitcoin کے درمیان تاریخی یومیہ اوسط قیمت کا ڈیٹا ہوتا ہے۔
ہم Ethereum پرائس ٹیبل کی آخری چند قطاروں کو دیکھ کر اس بات کا تعین کر سکتے ہیں کہ آیا ڈیٹا درست ہے۔
altcoin_data['ETH'].tail()
| ETH | Open | High | Low | Close | Volume (BTC) | Volume (Currency) | Weighted Price |
|---|---|---|---|---|---|---|---|
| 2017-08-18 | 0.070510 | 0.071000 | 0.070170 | 0.070887 | 17364.271529 | 1224.762684 | 0.070533 |
| 2017-08-18 | 0.071595 | 0.072096 | 0.070004 | 0.070510 | 26644.018123 | 1893.136154 | 0.071053 |
| 2017-08-18 | 0.071321 | 0.072906 | 0.070482 | 0.071600 | 39655.127825 | 2841.549065 | 0.071657 |
| 2017-08-19 | 0.071447 | 0.071855 | 0.070868 | 0.071321 | 16116.922869 | 1150.361419 | 0.071376 |
| 2017-08-19 | 0.072323 | 0.072550 | 0.071292 | 0.071447 | 14425.571894 | 1039.596030 | 0.072066 |
اب ہم ہر altcoin کی تاریخی قیمت کا USD میں براہ راست حساب لگانے کے لیے BTC کو altcoin کے ایکسچینج ریٹ ڈیٹا کو اپنے Bitcoin پرائس انڈیکس کے ساتھ جوڑ سکتے ہیں۔
# 将USD Price计算为每个altcoin数据帧中的新列
for altcoin in altcoin_data.keys():
altcoin_data[altcoin]['price_usd'] = altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']
یہاں، ہم ہر altcoin کے لیے اس کی متعلقہ USD قیمت کو ذخیرہ کرنے کے لیے ڈیٹا فریم میں ایک نیا کالم شامل کرتے ہیں۔
اس کے بعد، ہم merge_dfs_on_column فنکشن کو دوبارہ استعمال کر سکتے ہیں جس کی ہم نے پہلے وضاحت کی تھی ایک ضم شدہ ڈیٹا فریم بنانے کے لیے جو ہر کریپٹو کرنسی کی USD قیمت کو مربوط کرتا ہے۔
# 将每个山寨币的美元价格合并为单个数据帧
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')
ہو گیا!
اب آئیے ضم شدہ ڈیٹا فریم میں آخری کالم کے طور پر بٹ کوائن کی قیمت بھی شامل کریں۔
# 将BTC价格添加到数据帧
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']
اب ہمارے پاس ایک منفرد ڈیٹا فریم ہے جس میں دس کریپٹو کرنسیوں کے لیے یومیہ USD کی قیمتیں شامل ہیں جن کی ہم تصدیق کر رہے ہیں۔
تمام altcoins کی متعلقہ قیمتوں کو چارٹ کی شکل میں ظاہر کرنے کے لیے ہم پچھلے فنکشن df_scatter کو دوبارہ کال کرتے ہیں۔

چارٹ ٹھیک لگ رہا ہے، اور یہ ہمیں ایک مکمل تصویر فراہم کرتا ہے کہ پچھلے کچھ سالوں میں ہر کریپٹو کرنسی کی ایکسچینج کی قیمت کیسے بدلی ہے۔
نوٹ: یہاں ہم نے ایک ہی گراف پر تمام کریپٹو کرنسیوں کا موازنہ کرنے کے لیے لوگاریتھمک y-axis کا استعمال کیا ہے۔ مختلف نقطہ نظر سے ڈیٹا کو سمجھنے کے لیے آپ مختلف پیرامیٹر ویلیوز (جیسے سکیل=‘لینیئر’) بھی آزما سکتے ہیں۔
ہوشیار قارئین نے دیکھا ہوگا کہ ڈیجیٹل کرنسیوں کی قیمتیں باہم مربوط دکھائی دیتی ہیں، حالانکہ ان کی مالیاتی قدریں وسیع پیمانے پر مختلف ہوتی ہیں اور انتہائی غیر مستحکم ہوتی ہیں۔ خاص طور پر اپریل 2017 میں تیزی سے اضافے کے بعد سے، یہاں تک کہ بہت سے چھوٹے اتار چڑھاؤ بھی پوری مارکیٹ کے اتار چڑھاو کے ساتھ مطابقت پذیر نظر آتے ہیں۔
بلاشبہ، اعداد و شمار کے ذریعے تائید شدہ نتائج تصاویر کی بنیاد پر انترجشتھان سے زیادہ قائل ہیں۔
ہم مندرجہ بالا ارتباطی مفروضے کی تصدیق کے لیے Pandas corr() فنکشن استعمال کر سکتے ہیں۔ یہ ٹیسٹ ڈیٹا فریم کے ہر کالم کے لیے ہر دوسرے کالم کے ساتھ پیئرسن کے ارتباط کے گتانک کا حساب لگاتا ہے۔
2017.8.22 نظرثانی نوٹ: اس سیکشن میں ترمیم کی گئی تھی تاکہ ارتباط کے گتانک کا حساب لگاتے وقت مطلق قیمتوں کے بجائے روزانہ کی واپسی کو استعمال کیا جا سکے۔
غیر ٹھوس ٹائم سیریز (جیسے خام قیمت کے اعداد و شمار) پر مبنی براہ راست کیلکولیشن باہمی ربط میں انحراف کا باعث بن سکتی ہے۔ اس مسئلے کا ہمارا حل یہ ہے کہ ڈیٹا فریم میں ہر قیمت کی مطلق قدر کو اسی روزانہ کی واپسی کی شرح میں تبدیل کرنے کے لیے pct_change() طریقہ استعمال کریں۔
مثال کے طور پر، آئیے 2016 کے لیے ارتباط کے گتانک کا حساب لگاتے ہیں۔
# 计算2016年数字货币的皮尔森相关系数
combined_df_2016 = combined_df[combined_df.index.year == 2016]
combined_df_2016.pct_change().corr(method='pearson')
| Name | DASH | ETC | ETH | LTC | SC | STR | XEM | XMR | XRP | BTC |
|---|---|---|---|---|---|---|---|---|---|---|
| DASH | 1.000000 | 0.003992 | 0.122695 | -0.012194 | 0.026602 | 0.058083 | 0.014571 | 0.121537 | 0.088657 | -0.014040 |
| ETC | 0.003992 | 1.000000 | -0.181991 | -0.131079 | -0.008066 | -0.102654 | -0.080938 | -0.105898 | -0.054095 | -0.170538 |
| ETH | 0.122695 | -0.181991 | 1.000000 | -0.064652 | 0.169642 | 0.035093 | 0.043205 | 0.087216 | 0.085630 | -0.006502 |
| LTC | -0.012194 | -0.131079 | -0.064652 | 1.000000 | 0.012253 | 0.113523 | 0.160667 | 0.129475 | 0.053712 | 0.750174 |
| SC | 0.026602 | -0.008066 | 0.169642 | 0.012253 | 1.000000 | 0.143252 | 0.106153 | 0.047910 | 0.021098 | 0.035116 |
| STR | 0.058083 | -0.102654 | 0.035093 | 0.113523 | 0.143252 | 1.000000 | 0.225132 | 0.027998 | 0.320116 | 0.079075 |
| XEM | 0.014571 | -0.080938 | 0.043205 | 0.160667 | 0.106153 | 0.225132 | 1.000000 | 0.016438 | 0.101326 | 0.227674 |
| XMR | 0.121537 | -0.105898 | 0.087216 | 0.129475 | 0.047910 | 0.027998 | 0.016438 | 1.000000 | 0.027649 | 0.127520 |
| XRP | 0.088657 | -0.054095 | 0.085630 | 0.053712 | 0.021098 | 0.320116 | 0.101326 | 0.027649 | 1.000000 | 0.044161 |
| BTC | -0.014040 | -0.170538 | -0.006502 | 0.750174 | 0.035116 | 0.079075 | 0.227674 | 0.127520 | 0.044161 | 1.000000 |
مندرجہ بالا گراف باہمی ربط کو ظاہر کرتا ہے۔ 1 یا -1 کے قریب ایک گتانک کا مطلب یہ ہے کہ ترتیب مثبت طور پر منسلک ہے یا بالترتیب 0 کے قریب ایک ارتباط کے قابلیت کا مطلب ہے کہ متعلقہ اشیاء آپس میں منسلک نہیں ہیں اور ان کے اتار چڑھاو ایک دوسرے سے آزاد ہیں۔
نتائج کو بہتر انداز میں دیکھنے کے لیے، ہم ایک نیا ویژولائزیشن مددگار فنکشن بناتے ہیں۔
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")

یہاں، گہرے سرخ رنگ کی قدریں مضبوط ارتباط کی نمائندگی کرتی ہیں (ہر سکہ واضح طور پر اپنے آپ سے بہت زیادہ منسلک ہوتا ہے)، اور گہرے نیلے رنگ کی قدریں الٹا ارتباط کی نمائندگی کرتی ہیں۔ درمیان میں موجود تمام رنگوں - ہلکے نیلے/نارنجی/گرے/براؤن - کی قدریں ہیں جو کمزور ارتباط کی مختلف ڈگریوں کی نمائندگی کرتی ہیں یا کوئی تعلق نہیں ہے۔
یہ تصویر ہمیں کیا بتاتی ہے؟ بنیادی سطح پر، یہ ظاہر کرتا ہے کہ 2016 کے دوران مختلف کریپٹو کرنسیوں کی قیمتوں میں کس طرح اتار چڑھاؤ آیا، جس میں اعداد و شمار کے لحاظ سے بہت کم تعلق ہے۔
اب، اپنے مفروضے کی تصدیق کرنے کے لیے کہ “حالیہ مہینوں میں کرپٹو کرنسیز زیادہ باہم مربوط ہو گئی ہیں”، ہم 2017 کے ڈیٹا کا استعمال کرتے ہوئے اسی ٹیسٹ کو دہرائیں گے۔
combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')
| Name | DASH | ETC | ETH | LTC | SC | STR | XEM | XMR | XRP | BTC |
|---|---|---|---|---|---|---|---|---|---|---|
| DASH | 1.000000 | 0.384109 | 0.480453 | 0.259616 | 0.191801 | 0.159330 | 0.299948 | 0.503832 | 0.066408 | 0.357970 |
| ETC | 0.384109 | 1.000000 | 0.602151 | 0.420945 | 0.255343 | 0.146065 | 0.303492 | 0.465322 | 0.053955 | 0.469618 |
| ETH | 0.480453 | 0.602151 | 1.000000 | 0.286121 | 0.323716 | 0.228648 | 0.343530 | 0.604572 | 0.120227 | 0.421786 |
| LTC | 0.259616 | 0.420945 | 0.286121 | 1.000000 | 0.296244 | 0.333143 | 0.250566 | 0.439261 | 0.321340 | 0.352713 |
| SC | 0.191801 | 0.255343 | 0.323716 | 0.296244 | 1.000000 | 0.417106 | 0.287986 | 0.374707 | 0.248389 | 0.377045 |
| STR | 0.159330 | 0.146065 | 0.228648 | 0.333143 | 0.417106 | 1.000000 | 0.396520 | 0.341805 | 0.621547 | 0.178706 |
| XEM | 0.299948 | 0.303492 | 0.343530 | 0.250566 | 0.287986 | 0.396520 | 1.000000 | 0.397130 | 0.270390 | 0.366707 |
| XMR | 0.503832 | 0.465322 | 0.604572 | 0.439261 | 0.374707 | 0.341805 | 0.397130 | 1.000000 | 0.213608 | 0.510163 |
| XRP | 0.066408 | 0.053955 | 0.120227 | 0.321340 | 0.248389 | 0.621547 | 0.270390 | 0.213608 | 1.000000 | 0.170070 |
| BTC | 0.357970 | 0.469618 | 0.421786 | 0.352713 | 0.377045 | 0.178706 | 0.366707 | 0.510163 | 0.170070 | 1.000000 |
کیا یہ اعداد و شمار زیادہ متعلقہ ہیں؟ کیا سرمایہ کاری کے لیے ایک معیار کے طور پر کام کرنا کافی ہے؟ اس کا جواب نہیں ہے۔
تاہم، یہ بات قابل توجہ ہے کہ تقریباً تمام کریپٹو کرنسی تیزی سے ایک دوسرے سے جڑی ہوئی ہیں۔
correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")

جیسا کہ آپ اوپر کی تصویر سے دیکھ سکتے ہیں، چیزیں زیادہ سے زیادہ دلچسپ ہوتی جا رہی ہیں۔
اچھا سوال! لیکن سچ یہ ہے کہ مجھے اتنا یقین نہیں ہے…
میرا پہلا ردعمل یہ تھا کہ ہیج فنڈز نے حال ہی میں کرپٹو کرنسی مارکیٹوں میں عوامی طور پر تجارت شروع کی تھی۔ ان فنڈز میں اوسط تاجر کے مقابلے میں بہت زیادہ سرمایہ ہوتا ہے اگر کوئی فنڈ ایک سے زیادہ کرپٹو کرنسیوں کے درمیان اپنے سرمایہ کاری کو روکتا ہے اور پھر ایک آزاد متغیر (مثلاً، اسٹاک مارکیٹ) کی بنیاد پر ایک جیسے خطرے والے عوامل کا استعمال کرتا ہے۔ حکمت عملی اگر اس نقطہ نظر سے دیکھا جائے تو باہمی ربط بڑھانے کا رجحان سمجھ میں آتا ہے۔
XRP اور STR کی گہری تفہیم
مثال کے طور پر، مندرجہ بالا چارٹ سے، یہ واضح ہے کہ XRP (Ripple’s token) دیگر کریپٹو کرنسیوں کے ساتھ سب سے کم مربوط ہے۔ لیکن یہاں ایک قابل ذکر رعایت STR (سٹیلر کا ٹوکن، جسے سرکاری طور پر “Lumens” کہا جاتا ہے) ہے، جس کا XRP (رابطہ عدد: 0.62) کے ساتھ مضبوط تعلق ہے۔
دلچسپ بات یہ ہے کہ اسٹیلر اور ریپل بہت ملتے جلتے فنٹیک پلیٹ فارمز ہیں جو دونوں کا مقصد سرحدوں کے پار بینکوں کے درمیان رقم کی منتقلی میں شامل بوجھل اقدامات کو کم کرنا ہے۔ یہ بات قابل فہم ہے کہ کچھ بڑے کھلاڑی اور ہیج فنڈز اسٹیلر اور ریپل میں اپنی سرمایہ کاری کے لیے اسی طرح کی تجارتی حکمت عملی استعمال کر سکتے ہیں، بلاکچین سروسز کے ذریعے استعمال کیے جانے والے ٹوکنز کی مماثلت کے پیش نظر۔ یہی وجہ ہے کہ XRP کا دیگر cryptocurrencies کے مقابلے STR کے ساتھ زیادہ مضبوط تعلق ہے۔
مندرجہ بالا وضاحتیں بڑی حد تک قیاس آرائی پر مبنی ہیں، اور آپ بہتر کر سکتے ہیں۔ ہم نے جو بنیاد رکھی ہے اس پر تعمیر کرتے ہوئے، سینکڑوں مختلف طریقے ہیں جن سے آپ اپنے ڈیٹا میں کہانیوں کو تلاش کرنا جاری رکھ سکتے ہیں۔
قارئین کے لیے میری چند تجاویز یہ ہیں کہ وہ اپنی تحقیقی سمتوں پر غور کریں:
Bitcoin کے بارے میں، اور عام طور پر ڈیجیٹل کرنسیوں کے بارے میں سب سے اچھی بات، ان کی وکندریقرت نوعیت ہے، جو اسے کسی بھی دوسرے اثاثے سے زیادہ آزاد اور زیادہ جمہوری بناتی ہے۔ اپنے تجزیے کو بطور اوپن سورس شیئر کریں، کمیونٹی میں شامل ہوں، یا بلاگ پوسٹ لکھیں! امید ہے، اب آپ کے پاس وہ مہارتیں ہیں جن کی آپ کو خود تجزیہ کرنے کے لیے ضرورت ہے اور آپ مستقبل میں پڑھے جانے والے کسی بھی قیاس آرائی پر مبنی کرپٹو کرنسی مضامین کے بارے میں تنقیدی انداز میں سوچ سکتے ہیں، خاص طور پر وہ پیشین گوئیاں جن کا ڈیٹا کے ذریعے بیک اپ نہیں لیا گیا ہے۔ پڑھنے کے لیے آپ کا شکریہ اگر آپ کے پاس اس ٹیوٹوریل کے بارے میں کوئی رائے، مشورے یا تنقید ہے تو براہ کرم https://www.fmz.com/bbs پر ایک پیغام دیں۔