Wolumen Bitcoina

W ostatnim czasie temat kryptowalut, w tym Bitcoina, przycichł. Wiadomo, nikt nie chce ładować pieniędzy w aktywo, które straciło mocno na wartości w ostatnich miesiącach choć może właśnie teraz jest okno czasowe na zainteresowanie się tym tematem. Niemniej, kryptowaluty w tym Bitcoin jest to ciekawym obiektem do eksperymentów i analizy bez względu na zawirowania rynkowe.

Wolumen

Na rynkach kapitałowych wolumenem nazywa się ilość jednostek danego aktywa, które zmieniło w danym okresie właściciela. Przykładowo jeśli osoba O1 sprzedała osobie O2 100 akcji spółki S w danym dniu i była to jedyna transakcja na tej spółce w tym dniu to oznacza, że tego dnia wolumen wynosił 100.

Do tej pory wolumen był możliwy do ustalenia na rynkach scentralizowanych takich jak np. Giełda Papierów Wartościowych w Warszawie ponieważ notowane na niej spółki są w większości notowane tylko na tej jednej giełdzie zatem łatwo ustalić ile akcji danej spółki zmieniło właściciela w danym okresie. Nawet jeśli jakaś spółka jest notowana na więcej niż jednej giełdzie(jak np. UniCredit) to też nie ma większych problemów aby ustalić wolumen ponieważ giełd prowadzących handel danymi akcjami będzie co najwyżej kilka.

Problemem jest natomiast ustalenie wolumenu w przypadku rynków zdecentralizowanych jak np. rynek surowcowy albo walutowy(Forex). Na tych rynkach nie możemy w prosty sposób ustalić wolumenu ponieważ ilość ośrodków prowadzących sprzedaż/wymianę tych aktywów jest ogromna, a część transakcji może nie być nigdzie rejestrowana.

Wymiana/handel kryptowalut z założenia również jest zdecentralizowana, ale posiadają one jeden ciekawy aspekt- publiczny blockchain, który umożliwia prześledzenie wszystkich transakcji wykonanych w danej kryptowalucie, a co za tym idzie- możemy ustalić jaki był wolumen.

Blockchain

W internecie istnieje wiele opracowań co to jest więc nie będę się tutaj rozwodził nad tym temat. Natomiast jeśli nie wiesz co to jest to w tym artykule możemy uznać, że jest to taka baza danych, w której są przechowywane informacje o wszystkich transakcjach.

Jak sprawdzić wolumen?

Oczywiście można skorzystać ze stron z notowaniami, od końcówki 2021 roku wiele tego typu stron podaje również wolumen Bitcoina, a nie tylko jego aktualny kurs. Po drugie, można przejrzeć największe giełdy, sprawdzić jakie na nich są wolumeny i zsumować wszystko, w ten sposób również otrzymamy przybliżoną wartość wolumenu. Ale my jesteśmy bardziej ambitni i będziemy analizować blockchain.

Każdy blok w blockchainie Bitcoina ma oczywiście taką samą strukturę. To jak wygląda przykładowy blok można zobaczyć tutaj. Pod podanym adresem można znaleźć dane przedstawione w formacie json, oczywiście blockchain nie składa się plików jsonowych, ale nam zdecydowanie będzie prościej użyć takiej formy danych. Zainteresowani mogą sobie przejrzeć jakie dane są przechowywane, nas w tym przypadku interesują dwa pola- time czyli czas o której został utworzony dany blok oraz tx czyli transakcje.

Pole time interesuje nas aby móc określić kiedy nastąpiły dane transakcje, a pole tx nas interesuje ponieważ w nim znajdują się wielkości poszczególnych transakcji, a zatem to dzięki nim możemy zmierzyć wolumen.

Implementacja

Nie będziemy oczywiście sprawdzać każdego bloku oddzielnie i sumować danych na kalkulatorze, napiszemy prosty skrypt w Pythonie. Cały skrypt prezentuje się następująco:

import urllib.request, json
from datetime import datetime

daily_data = dict()
for block in range(754982, 754980, -1):
    try:
        with open("data/btc/{}.json".format(block)) as f:
            data = json.load(f)
    except:
        url = urllib.request.urlopen("https://blockchain.info/block-height/{}?format=json".format(block))
        data = json.loads(url.read().decode())
        with open("data/btc/{}.json".format(block), 'w') as f:
            json.dump(data, f)

    transactions = data["blocks"][0]["tx"]
    out_sum = 0
    in_sum = 0

    for t in transactions[1:]:
        for i in t["inputs"]:
            in_sum += i["prev_out"]["value"] / 10**8
        for o in t["out"]:
            out_sum += o["value"] / 10**8

    date = datetime.fromtimestamp(data["blocks"][0]["time"])
    if date.date() not in daily_data:
        daily_data[date.date()] = {"in_sum": 0, "out_sum": 0}
    daily_data[date.date()]["out_sum"] += out_sum
    daily_data[date.date()]["in_sum"] += in_sum

print(daily_data)

A teraz zajmijmy się poszczególnymi fragmentami kodu:

daily_data = dict()

Jest to słownik, w którym będą przechowywane dane w poszczególnych dniach.

for block in range(754982, 754000, -1):
    try:
        with open("data/btc/{}.json".format(block)) as f:
            data = json.load(f)
    except:
        url = urllib.request.urlopen("https://blockchain.info/block-height/{}?format=json".format(block))
        data = json.loads(url.read().decode())
        with open("data/btc/{}.json".format(block), 'w') as f:
            json.dump(data, f)

Iterujemy po blokach, pętla zaczyna od najnowszego do najstarszego bloku(oczywiście użyj aktualnych numerów bloków, te były nowe w momencie pisania artykułu). Następnie jest sprawdzane czy dane z danego bloku znajdują się w pamięci komputera, jeśli ich nie ma to zostaną one pobrane.

    transactions = data["blocks"][0]["tx"]
    out_sum = 0
    in_sum = 0

Dla prostoty słownik z transakcjami przypisujemy do nowej zmiennej. Zmienne out_sum oraz in_sum będą zawierać ilość zbywanych i nabywanych Bitcoinów.

for t in transactions[1:]:
        for i in t["inputs"]:
            in_sum += i["prev_out"]["value"] / 10**8
        for o in t["out"]:
            out_sum += o["value"] / 10**8

Przechodzimy przez kolejne transakcje i sumujemy zbywane i nabywane bitcoiny. Wartości te dzielimy przez 108 ponieważ są one przechowywane w jednostce satoshi czyli 10-8 Bitcoina. Pomijamy zerowy indeks ponieważ, o ile dobrze rozumiem, to w nim zawiera się premia dla górników czyli nowowygenerowane Bitcoiny. Czyli Bitcoiny, które nie brały udziału w transakcjach.


    date = datetime.fromtimestamp(data["blocks"][0]["time"])
    if date.date() not in daily_data:
        daily_data[date.date()] = {"in_sum": 0, "out_sum": 0}
    daily_data[date.date()]["out_sum"] += out_sum
    daily_data[date.date()]["in_sum"] += in_sum

Jeśli nie istnieje pole w słowniku odpowiadające dacie z aktualnego bloku to takowe jest tworzone, zawiera ono ilość zbywanych i nabywanych bitcoinów w danym dniu.

print(daily_data)

No i na koniec wyświetlamy zebrane dane.

Podczas odczytywania danych zauważysz, że ilość zbywanych Bitcoinów jest większa niż nabywanych. Wynika to z faktu, że w sieci Bitcoina istnieją opłaty transakcyjne.

W dalszych krokach można się potrudzić o bardziej szczegółową analizę transakcji np. czy więcej się przeciętnie sprzedaje czy więcej kupuje.

Ten wpis został opublikowany w kategorii Analiza danych, Artykuły. Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *