Bitcoin Gang

View My GitHub Profile

Contents:
  1. Manual
  2. Experiments
  3. Download it all

Manual

Let’s set up the environment first. We need the coingecko API to fetch prices, and pandas to work with timeseries (and tabular data in general).

from pycoingecko import CoinGeckoAPI
gecko = CoinGeckoAPI()
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib notebook
import datetime as dt
import requests
from time import sleep
from IPython.display import clear_output

Experiments

First, let’s set up the correct URL and parsing and all that jazz.

def __get_historical_data_url(coin_id, currency_id, start_date, end_date):
    return 'https://www.coingecko.com/en/coins/{}/historical_data/{}?end_date={}&start_date={}'.format(coin_id, currency_id, end_date.isoformat(), start_date.isoformat()) 
def get_historical_data_scraper(coin_id, currency_id, start_date_s, end_date_s):
    start_date = dt.date.fromisoformat(start_date_s)
    end_date = dt.date.fromisoformat(end_date_s)

    url = __get_historical_data_url(coin_id, currency_id, start_date, end_date)
    r = requests.get(url, timeout=5, stream=True)
    
    try:
        dfs = pd.read_html(r.content, parse_dates=['Date'])
    except:
        return None
    if len(dfs) != 1:
        return None

    df = dfs[0][::-1].set_index("Date")
    df = df.replace({'[$,]': ''}, regex=True).apply(pd.to_numeric)
    df.columns = pd.MultiIndex.from_product([[coin_id], df.columns])

    return df
def get_historical_data_gecko(coin_id, currency_id, start_date_s, end_date_s):
    p = gecko.get_coin_market_chart_range_by_id(coin_id, currency_id, dt.datetime.fromisoformat(start_date_s).strftime("%s"), dt.datetime.fromisoformat(end_date_s).strftime("%s"))

    df_mcaps = pd.DataFrame(p['market_caps'], columns=['Date', 'Market Cap'])
    df_mcaps['Date'] = pd.to_datetime(df_mcaps['Date'].apply(lambda x: dt.datetime.utcfromtimestamp(x/1000).date()))
    df_mcaps.set_index("Date", inplace=True)

    df_vol = pd.DataFrame(p['total_volumes'], columns=['Date', 'Volume'])
    df_vol['Date'] = pd.to_datetime(df_vol['Date'].apply(lambda x: dt.datetime.utcfromtimestamp(x/1000).date()))
    df_vol.set_index("Date", inplace=True)

    df_prices = pd.DataFrame(p['prices'], columns=['Date', 'Open'])
    df_prices['Date'] = pd.to_datetime(df_prices['Date'].apply(lambda x: dt.datetime.utcfromtimestamp(x/1000).date()))
    df_prices.set_index("Date", inplace=True)

    df = pd.concat([df_mcaps, df_vol, df_prices], axis=1)
    df['Close'] = df['Open'].shift(-1)

    df.columns = pd.MultiIndex.from_product([[coin_id], df.columns])

    return df
def get_historical_data(coin_id, currency_id, start_date_s, end_date_s):
    df = None
    try:
        df = get_historical_data_gecko(coin_id, currency_id, start_date_s, end_date_s)
    except:
        try:
            df = get_historical_data_scraper(coin_id, currency_id, start_date_s, end_date_s)
        except:
            return None
    return df

Let’s test the functions.

df = get_historical_data('bitcoin', 'usd', '2013-01-01', '2021-04-01')
df.head()
bitcoin
Market Cap Volume Open Close
Date
2013-04-28 1.500518e+09 0.0 135.30 141.96
2013-04-29 1.575032e+09 0.0 141.96 135.30
2013-04-30 1.501657e+09 0.0 135.30 117.00
2013-05-01 1.298952e+09 0.0 117.00 103.43
2013-05-02 1.148668e+09 0.0 103.43 91.01
coins_list = pd.DataFrame(gecko.get_coins_list())

Download it all

Finally, let’s download the daily data for all tokens, across all time.

df_complete = None
coins_list_ids = coins_list['id']
coins_list_ids_len = len(coins_list_ids)

i = 2206
timeout = 1
while i < coins_list_ids_len: 
    coin = coins_list_ids[i]
    
    df = get_historical_data(coin, 'usd', '2013-01-01', '2021-04-01')
    if df is None:
        print ("Failed to download", coin)
        sleep(timeout)
        continue
    
    i = i + 1
    if df_complete is None:
        df_complete = df
    else:
        df_complete = df_complete.join(df, how='outer')
    
    clear_output(wait=True)
    print ("Downloaded", coin, "{}/{}".format(i, coins_list_ids_len - 1))
Downloaded etf-dao 2205/6547



---------------------------------------------------------------------------

KeyboardInterrupt                         Traceback (most recent call last)

<ipython-input-15-a1cc93c97937> in <module>
     18         df_complete = df
     19     else:
---> 20         df_complete = df_complete.join(df, how='outer')
     21 
     22     clear_output(wait=True)


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/frame.py in join(self, other, on, how, lsuffix, rsuffix, sort)
   8109         """
   8110         return self._join_compat(
-> 8111             other, on=on, how=how, lsuffix=lsuffix, rsuffix=rsuffix, sort=sort
   8112         )
   8113 


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/frame.py in _join_compat(self, other, on, how, lsuffix, rsuffix, sort)
   8141                 right_index=True,
   8142                 suffixes=(lsuffix, rsuffix),
-> 8143                 sort=sort,
   8144             )
   8145         else:


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/reshape/merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)
     87         validate=validate,
     88     )
---> 89     return op.get_result()
     90 
     91 


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/reshape/merge.py in get_result(self)
    695             axes=[llabels.append(rlabels), join_index],
    696             concat_axis=0,
--> 697             copy=self.copy,
    698         )
    699 


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/internals/concat.py in concatenate_block_managers(mgrs_indexers, axes, concat_axis, copy)
     51     """
     52     concat_plans = [
---> 53         _get_mgr_concatenation_plan(mgr, indexers) for mgr, indexers in mgrs_indexers
     54     ]
     55     concat_plan = _combine_concat_plans(concat_plans, concat_axis)


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/internals/concat.py in <listcomp>(.0)
     51     """
     52     concat_plans = [
---> 53         _get_mgr_concatenation_plan(mgr, indexers) for mgr, indexers in mgrs_indexers
     54     ]
     55     concat_plan = _combine_concat_plans(concat_plans, concat_axis)


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/internals/concat.py in _get_mgr_concatenation_plan(mgr, indexers)
    122 
    123         ax0_indexer = None
--> 124         blknos = mgr.blknos
    125         blklocs = mgr.blklocs
    126 


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/internals/managers.py in blknos(self)
    167         if self._blknos is None:
    168             # Note: these can be altered by other BlockManager methods.
--> 169             self._rebuild_blknos_and_blklocs()
    170 
    171         return self._blknos


~/docs/projects/by-year-month/2021/03/bplfamily/notebooks/.venv/lib/python3.7/site-packages/pandas/core/internals/managers.py in _rebuild_blknos_and_blklocs(self)
    242             rl = blk.mgr_locs
    243             new_blknos[rl.indexer] = blkno
--> 244             new_blklocs[rl.indexer] = np.arange(len(rl))
    245 
    246         if (new_blknos == -1).any():


KeyboardInterrupt: 
# df_complete.to_parquet("CoinGecko_2013-04-28_2021-03-28_2205.parquet")
df = get_historical_data('0-5x-long-shitcoin-index-token', 'usd', '2013-01-01', '2021-04-01')
df_complete.head()
01coin 0-5x-long-algorand-token 0-5x-long-altcoin-index-token ... 1x-short-theta-network-token 1x-short-tomochain-token 1x-short-trx-token
Market Cap Volume Open Close Market Cap Volume Open Close Market Cap Volume ... Open Close Market Cap Volume Open Close Market Cap Volume Open Close
Date
2017-06-14 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2017-06-15 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2017-06-16 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2017-06-17 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2017-06-18 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 280 columns

df_complete_first
01coin 0-5x-long-algorand-token 0-5x-long-altcoin-index-token ... engine enigma enjincoin
Market Cap Volume Open Close Market Cap Volume Open Close Market Cap Volume ... Open Close Market Cap Volume Open Close Market Cap Volume Open Close
Date
2013-04-28 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 ... 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96
2013-04-29 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 ... 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30
2013-04-30 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 ... 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00
2013-05-01 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 ... 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43
2013-05-02 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 ... 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2021-03-24 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 ... 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00
2021-03-25 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 ... 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00
2021-03-26 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 ... 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00
2021-03-27 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 ... 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00
2021-03-28 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 ... 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN

2890 rows × 8604 columns

df_complete_second
enkronos enq-enecuum en-tan-mo ... shitcoin-token shivers shopping-io
Market Cap Volume Open Close Market Cap Volume Open Close Market Cap Volume ... Open Close Market Cap Volume Open Close Market Cap Volume Open Close
Date
2013-04-28 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 ... 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96
2013-04-29 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 ... 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30
2013-04-30 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 ... 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00
2013-05-01 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 ... 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43
2013-05-02 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 ... 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2021-03-24 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 ... 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00
2021-03-25 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 ... 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00
2021-03-26 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 ... 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00
2021-03-27 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 ... 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00
2021-03-28 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 ... 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN

2890 rows × 11464 columns

df_complete_third
shorty showhand shrimp-capital ... zyx zzz-finance zzz-finance-v2
Market Cap Volume Open Close Market Cap Volume Open Close Market Cap Volume ... Open Close Market Cap Volume Open Close Market Cap Volume Open Close
Date
2013-04-28 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 ... 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96 1.500518e+09 0.000000e+00 135.30 141.96
2013-04-29 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 ... 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30 1.575032e+09 0.000000e+00 141.96 135.30
2013-04-30 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 ... 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00 1.501657e+09 0.000000e+00 135.30 117.00
2013-05-01 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 ... 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43 1.298952e+09 0.000000e+00 117.00 103.43
2013-05-02 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 ... 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01 1.148668e+09 0.000000e+00 103.43 91.01
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2021-03-24 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 ... 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00 1.017637e+12 6.038338e+10 54585.00 52527.00
2021-03-25 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 ... 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00 9.827974e+11 7.302905e+10 52527.00 51417.00
2021-03-26 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 ... 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00 9.591553e+11 6.340164e+10 51417.00 55033.00
2021-03-27 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 ... 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00 1.027210e+12 5.544256e+10 55033.00 55832.00
2021-03-28 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 ... 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN 1.042184e+12 4.728575e+10 55832.00 NaN

2890 rows × 6112 columns

df_complete.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 2890 entries, 2013-04-28 to 2021-03-28
Columns: 11464 entries, ('enkronos', 'Market Cap') to ('shopping-io', 'Close')
dtypes: float64(11464)
memory usage: 252.9 MB
coins_list.iloc[109]
id        3x-long-midcap-index-token
symbol                       midbull
name      3X Long Midcap Index Token
Name: 109, dtype: object
df_complete = df_complete_first.join(df_complete_second.join(df_complete_third, how='outer'), how='outer')
df_complete.to_parquet("CoinGecko_2013-04-28_2021-03-28.parquet")
df_spendcoin = get_historical_data('spendcoin', 'usd', '2010-01-01', '2021-03-28')
df_spendcoin['spendcoin']['Close'].plot()
<IPython.core.display.Javascript object>

<AxesSubplot:xlabel='Date'>
coin_id = 'bitcoin'
currency_id = 'usd'
start_date_s = '2013-01-01'
end_date_s = '2021-04-01'

p = gecko.get_coin_market_chart_range_by_id(coin_id, currency_id, dt.datetime.fromisoformat(start_date_s).strftime("%s"), dt.datetime.fromisoformat(end_date_s).strftime("%s"))

df_mcaps = pd.DataFrame(p['market_caps'], columns=['Date', 'Market Cap'])
df_mcaps['Date'] = pd.to_datetime(df_mcaps['Date'].apply(lambda x: dt.datetime.utcfromtimestamp(x/1000).date()))
df_mcaps.set_index("Date", inplace=True)

df_vol = pd.DataFrame(p['total_volumes'], columns=['Date', 'Volume'])
df_vol['Date'] = pd.to_datetime(df_vol['Date'].apply(lambda x: dt.datetime.utcfromtimestamp(x/1000).date()))
df_vol.set_index("Date", inplace=True)

df_prices = pd.DataFrame(p['prices'], columns=['Date', 'Open'])
df_prices['Date'] = pd.to_datetime(df_prices['Date'].apply(lambda x: dt.datetime.utcfromtimestamp(x/1000).date()))
df_prices.set_index("Date", inplace=True)

df = pd.concat([df_mcaps, df_vol, df_prices], axis=1)
df['Close'] = df['Open'].shift(-1)

df.columns = pd.MultiIndex.from_product([[coin_id], df.columns])
bitcoin
Market Cap Volume Open Close
Date
2013-04-28 1.500518e+09 0.0 135.30 141.96
2013-04-29 1.575032e+09 0.0 141.96 135.30
2013-04-30 1.501657e+09 0.0 135.30 117.00
2013-05-01 1.298952e+09 0.0 117.00 103.43
2013-05-02 1.148668e+09 0.0 103.43 91.01
2013-05-03 1.011066e+09 0.0 91.01 111.25
2013-05-04 1.236352e+09 0.0 111.25 116.79
2013-05-05 1.298378e+09 0.0 116.79 118.33
2013-05-06 1.315992e+09 0.0 118.33 106.40
2013-05-07 1.183766e+09 0.0 106.40 112.64
df = get_historical_data('bitcoin', 'usd', '2013-01-01', '2021-04-01')
df.head()
bitcoin
Market Cap Volume Open Close
Date
2013-04-28 1.500518e+09 0.0 135.30 141.96
2013-04-29 1.575032e+09 0.0 141.96 135.30
2013-04-30 1.501657e+09 0.0 135.30 117.00
2013-05-01 1.298952e+09 0.0 117.00 103.43
2013-05-02 1.148668e+09 0.0 103.43 91.01