Pobierz historyczne dane bitcoin [zamknięte]

122

Chcę zrobić własny wykres bitcoin.

Czy znasz jakiś niezawodny sposób pobierania historycznych danych o cenach bitcoinów? Czy istnieje sposób, aby go odzyskać za pomocą REST? Widziałem Bitfloor, który obsługuje REST, ale nie zwraca żadnej użytecznej wartości, ma "wewnętrzny błąd serwera".

Widziałem też Bitcoincharts, ale myślę, że jest to ograniczone do 2000 wartości danych.

Czy zasugerowałbyś mi jakiś framework lub system do pracy nad tym?

Cod1ngFree
źródło
Możesz zapłacić za historyczne dane bitcoin obejmujące wiele giełd / rynków z Coinigy: coinigy.com/bitcoin-data
Joe Phillips

Odpowiedzi:

150

W rzeczywistości możesz uzyskać całą historię transakcji Bitcoin z Bitcoincharts w formacie CSV tutaj: http://api.bitcoincharts.com/v1/csv/

jest aktualizowany dwa razy dziennie dla aktywnych wymian, jest też kilka martwych wymian.

EDYCJA: Ponieważ w plikach CSV nie ma nagłówków kolumn, oto jakie one są: kolumna 1) znacznik czasu transakcji, kolumna 2) cena, kolumna 3) wolumen transakcji

Lykegenes
źródło
2
+1 tak, w rzeczywistości jest to bardzo przydatne do tworzenia wykresów ustalonych transakcji. Dane można również pozyskiwać na żywo za pośrednictwem interfejsu API pushera bitstampa, co teraz robię. Po indeksowaniu bitstampa przez jeden dzień pobrałem plik bitstampUSD.csv i dołączyłem dane, aby uzyskać pełny obraz
nurettin
2
@Lykegenes Jaka jest druga kolumna? Wartości mieszczą się w przedziale 0,5-33, co nie może być kursem wymiany USD / BTC.
holdenlee
4
Uważaj na duże luki w bitcoincharts.comdanych. Należy również pamiętać, że nie ma informacji „kup / sprzedaj”.
Petr Javorik,
2
@theJerm Jest w formacie UNIX timestamp, czyli liczba sekund od 01/01/1970 w strefie czasowej UTC
Lykegenes
2
Gdzie mogę uzyskać dane dotyczące Litecoina, Ethereum lub innych ważnych monet?
skan
31

Wiele danych historycznych można znaleźć tutaj: https://www.quandl.com/data/BCHARTS-Bitcoin-Charts-Exchange-Rate-Data

Sean
źródło
1
Odpowiedzi zawierające tylko linki nie są zalecane w SO. Szuka również sposobu na odzyskanie danych, a nie tylko samych danych.
fancyPants,
1
Masz rację, moja odpowiedź powinna być bardziej wyczerpująca. Jednak odpowiada na jego żądanie, ponieważ wywołania interfejsu API w celu pobrania danych są wymienione w prawej części strony.
Sean,
Link jest uszkodzony
Guillaume Chevalier
2
@GuillaumeChevalier Znalazłem quandl.com/data/BCHARTS-Bitcoin-Charts-Exchange-Rate-Data
Jörn
1
Ładna, interesująca strona. Inną usługą, którą uwielbiam, jest walletinvestor.com/forecast/bitcoin-prediction, która wykorzystuje sztuczną inteligencję i uczenie maszynowe do codziennych prognoz cen kryptowalut w przypadku inwestycji krótko- i długoterminowych.
Johnny
15

W przypadku, gdybyś chciał zbierać dane handlowe bitstampów z ich gniazda internetowego w wyższej rozdzielczości przez dłuższy okres czasu, możesz użyć poniższego skryptu log_bitstamp_trades.py.

Skrypt używa bibliotek Python websocket-client i pusher_client_python, więc zainstaluj je.

#!/usr/bin/python

import pusherclient
import time
import logging
import sys
import datetime
import signal
import os

logging.basicConfig()
log_file_fd = None

def sigint_and_sigterm_handler(signal, frame):
    global log_file_fd
    log_file_fd.close()
    sys.exit(0)


class BitstampLogger:

    def __init__(self, log_file_path, log_file_reload_path, pusher_key, channel, event):
        self.channel = channel
        self.event = event
        self.log_file_fd = open(log_file_path, "a")
        self.log_file_reload_path = log_file_reload_path
        self.pusher = pusherclient.Pusher(pusher_key)
        self.pusher.connection.logger.setLevel(logging.WARNING)
        self.pusher.connection.bind('pusher:connection_established', self.connect_handler)
        self.pusher.connect()

    def callback(self, data):
        utc_timestamp = time.mktime(datetime.datetime.utcnow().timetuple())
        line = str(utc_timestamp) + " " + data + "\n"
        if os.path.exists(self.log_file_reload_path):
            os.remove(self.log_file_reload_path)
            self.log_file_fd.close()
            self.log_file_fd = open(log_file_path, "a")
        self.log_file_fd.write(line)

    def connect_handler(self, data):
        channel = self.pusher.subscribe(self.channel)
        channel.bind(self.event, self.callback)


def main(log_file_path, log_file_reload_path):
    global log_file_fd
    bitstamp_logger = BitstampLogger(
        log_file_path,
        log_file_reload_path,
        "de504dc5763aeef9ff52",
        "live_trades",
        "trade")
    log_file_fd = bitstamp_logger.log_file_fd
    signal.signal(signal.SIGINT, sigint_and_sigterm_handler)
    signal.signal(signal.SIGTERM, sigint_and_sigterm_handler)
    while True:
        time.sleep(1)


if __name__ == '__main__':
    log_file_path = sys.argv[1]
    log_file_reload_path = sys.argv[2]
    main(log_file_path, log_file_reload_path

i logrotate file config

/mnt/data/bitstamp_logs/bitstamp-trade.log
{
    rotate 10000000000
    minsize 10M
    copytruncate
    missingok
    compress
    postrotate
        touch /mnt/data/bitstamp_logs/reload_log > /dev/null
    endscript
}

wtedy możesz uruchomić go w tle

nohup ./log_bitstamp_trades.py /mnt/data/bitstamp_logs/bitstamp-trade.log /mnt/data/bitstamp_logs/reload_log &
mettw
źródło
Korzystanie ze sklepu z szeregami czasowymi, takiego jak InfluxDB, byłoby dobrym ulepszeniem.
MrYellow
7

Bitstamp zawiera aktualne dane bitcoin, które są publicznie dostępne JSONpod tym linkiem . Nie próbuj uzyskać do niego dostępu więcej niż 600 razy w ciągu dziesięciu minut, bo inaczej zablokują Twój adres IP (plus, i tak jest to niepotrzebne; przeczytaj więcej tutaj ). Poniżej znajduje się C#podejście do uzyskiwania danych na żywo:

using (var WebClient = new System.Net.WebClient())
{
     var json = WebClient.DownloadString("https://www.bitstamp.net/api/ticker/");
     string value = Convert.ToString(json);
     // Parse/use from here
}

Z tego miejsca możesz przeanalizować JSONi zapisać go w bazie danych (lub MongoDBbezpośrednio wstawić), a następnie uzyskać do niego dostęp.

W przypadku danych historycznych (w zależności od bazy danych - jeśli tak się do tego podchodzisz), zrób insert z pliku płaskiego, z którego możesz korzystać w większości baz danych (na przykład SQL Servermożesz zrobić BULK INSERTz CSVpliku).

user123
źródło
4

Napisałem przykład Java dla tego przypadku:

Użyj biblioteki json.org, aby pobrać obiekty JSONObject i JSONArrays. Poniższy przykład wykorzystuje dane blockchain.info, które można uzyskać jako JSONObject.

    public class main 
    {
        public static void main(String[] args) throws MalformedURLException, IOException
        {
            JSONObject data = getJSONfromURL("https://blockchain.info/charts/market-price?format=json");
            JSONArray data_array = data.getJSONArray("values");

            for (int i = 0; i < data_array.length(); i++)
            {
                JSONObject price_point = data_array.getJSONObject(i);

                //  Unix time
                int x = price_point.getInt("x");

                //  Bitcoin price at that time
                double y = price_point.getDouble("y");

                //  Do something with x and y.
            }

        }

        public static JSONObject getJSONfromURL(String URL)
        {
            try
            {
                URLConnection uc;
                URL url = new URL(URL);
                uc = url.openConnection();
                uc.setConnectTimeout(10000);
                uc.addRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
                uc.connect();

                BufferedReader rd = new BufferedReader(
                        new InputStreamReader(uc.getInputStream(), 
                        Charset.forName("UTF-8")));

                StringBuilder sb = new StringBuilder();
                int cp;
                while ((cp = rd.read()) != -1)
                {
                    sb.append((char)cp);
                }

                String jsonText = (sb.toString());            

                return new JSONObject(jsonText.toString());
            } catch (IOException ex)
            {
                return null;
            }
        }
    }
domi
źródło
Z jakiej biblioteki to korzysta?
Michael A,
Standardowy JSON: json.org
domi
4

Coinbase ma REST API, które zapewnia dostęp do historycznych cen z ich strony internetowej. Wydaje się, że dane pokazują cenę spot Coinbase (w USD) co ​​około dziesięć minut.

Wyniki są zwracane w formacie CSV. Musisz sprawdzić żądany numer strony za pośrednictwem interfejsu API. Każda strona zawiera 1000 wyników (lub punktów cenowych). To około 7 dni danych na stronę.

leishman
źródło
4

Przeniesienie go do JSON za pomocą Node.js byłoby fajne :)

https://github.com/f1lt3r/bitcoin-scraper

wprowadź opis obrazu tutaj

[
  [
    1419033600,  // Timestamp (1 for each minute of entire history)
    318.58,      // Open
    318.58,      // High
    318.58,      // Low
    318.58,      // Close
    0.01719605,  // Volume (BTC)
    5.478317609, // Volume (Currency)
    318.58       // Weighted Price (USD)
  ]
]
f1lt3r
źródło
Dziękuję za scenariusz! Wygląda na to, że teraz pobrane pliki zawierają po prostu „undefined”.
Chad Johnson,
Właśnie sprawdziłem repozytorium, uruchomiłem npm install, a potem cat bitstampUSD-2014-9-9.jsonwygląda dobrze. Jeśli zainwestowałeś w to, by to działało, zabierzmy to na Github, a nie na komentarze Stackoverflow? Zostaw mi raport o błędzie?
f1lt3r
czy rozumiem, że Twój kod pozwala mi uzyskać pełną historię cen bitcoinów w skali 1 minuty?
Mayeul sgc
Tak, zgadza się
f1lt3r