Obter dados históricos do bitcoin [fechado]

122

Eu quero fazer meu próprio gráfico de bitcoin.

Você conhece alguma maneira confiável de recuperar dados históricos de preços de bitcoins? Existe alguma maneira de recuperá-lo usando o REST? Eu vi o Bitfloor, que suporta REST, mas não está retornando nenhum valor útil, possui um "erro interno do servidor".

Vi também Bitcoincharts, mas acho que é limitado a 2000 valores de dados.

Você me sugeriria alguma estrutura ou sistema para trabalhar nisso?

Cod1ngFree
fonte
Você pode pagar por dados bitcoin históricos abrangendo muitas trocas / mercados de Coinigy: coinigy.com/bitcoin-data
Joe Phillips

Respostas:

150

Na verdade, você pode obter todo o histórico de negociações do Bitcoin no Bitcoincharts no formato CSV aqui: http://api.bitcoincharts.com/v1/csv/

é atualizado duas vezes por dia para trocas ativas e há algumas trocas também.

EDIT: Como não há cabeçalhos de coluna nos CSVs, eis o que são: coluna 1) o carimbo de data / hora da negociação, coluna 2) o preço, coluna 3) o volume da negociação

Lykegenes
fonte
2
+1 Sim, é de fato muito útil para traçar negociações estabelecidas. Os dados também podem ser adquiridos ao vivo por meio da API do empurrador do bitstamp, que é o que estou fazendo agora. Após a indexação bitstamp por um dia, eu baixei o bitstampUSD.csv e prefixado os dados para ter um quadro completo
nurettin
2
@Lykegenes Qual é a segunda coluna? Os valores estão no intervalo de 0,5 a 33, que não pode ser a taxa de câmbio USD / BTC.
holdenlee
4
Cuidado com grandes lacunas nos bitcoincharts.comdados. Observe também que não há informações sobre a opção "comprar / vender".
Petr Javorik
2
@theJerm Está no formato de carimbo de data / hora UNIX, portanto, o número de segundos desde 01/01/1970 no fuso horário UTC
Lykegenes 08/08/19
2
Onde posso obter dados para Litecoin, Ethereum ou outras moedas importantes?
skan
31

Você pode encontrar muitos dados históricos aqui: https://www.quandl.com/data/BCHARTS-Bitcoin-Charts-Exchange-Rate-Data

Sean
fonte
1
As respostas apenas para links não são incentivadas no SO. Além disso, ele está procurando uma maneira de recuperar dados, não apenas os dados em si.
precisa saber é o seguinte
1
Você está certo, eu deveria ter sido mais abrangente na minha resposta. No entanto, ele responde a sua solicitação, pois a API solicita a recuperação dos dados e está listada no lado direito da página.
21413 Sean
O link está quebrado
Guillaume Chevalier
2
@GuillaumeChevalier eu encontrei quandl.com/data/BCHARTS-Bitcoin-Charts-Exchange-Rate-Data
Jörn
1
Site interessante e agradável. Outro serviço que eu amo é o walletinvestor.com/forecast/bitcoin-prediction, que usa IA e aprendizado de máquina para fazer previsões diárias dos preços de criptomoedas, para investimentos de curto e longo prazo.
Johnny
15

No caso, você gostaria de coletar dados comerciais de bitstamp em seu websocket em resolução mais alta por um período mais longo, usando o script log_bitstamp_trades.py abaixo.

O script usa as bibliotecas python websocket-client e pusher_client_python, portanto, instale-as.

#!/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

e logrotate config do arquivo

/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
}

então você pode executá-lo em segundo plano

nohup ./log_bitstamp_trades.py /mnt/data/bitstamp_logs/bitstamp-trade.log /mnt/data/bitstamp_logs/reload_log &
mettw
fonte
Usar uma loja de séries temporais como o InfluxDB seria uma boa melhoria.
MrYellow
7

Bitstamp tem dados bitcoin ao vivo que estão publicamente disponíveis em JSONem este link . Não tente acessá-lo mais de 600 vezes em dez minutos; caso contrário, eles bloquearão seu IP (além disso, é desnecessário; leia mais aqui ). A seguir, é apresentada uma C#abordagem para obter dados ao vivo:

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
}

A partir daqui, você pode analisá- JSONlo e armazená-lo em um banco de dados (ou MongoDBinseri-lo diretamente) e acessá-lo.

Para dados históricos (dependendo do banco de dados - se é assim que você o aborda), insira a partir de um arquivo simples, que a maioria dos bancos de dados permite que você use (por exemplo, SQL Servervocê pode fazer a BULK INSERTpartir de um CSVarquivo).

user123
fonte
4

Eu escrevi um exemplo de java para este caso:

Use a biblioteca json.org para recuperar JSONObjects e JSONArrays. O exemplo abaixo usa os dados do blockchain.info que podem ser obtidos como 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
fonte
Que biblioteca está usando?
Michael A
JSON padrão: json.org
domi
4

A Coinbase possui uma API REST que fornece acesso a preços históricos em seu site. Os dados parecem mostrar o preço à vista da Coinbase (em USD) a cada dez minutos.

Os resultados são retornados no formato CSV. Você deve consultar o número da página que deseja através da API. Existem 1000 resultados (ou preços) por página. São cerca de 7 dias de dados por página.

leishman
fonte
4

Raspá-lo para JSON com Node.js seria divertido :)

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

insira a descrição da imagem aqui

[
  [
    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
fonte
Obrigado pelo script! Parece que agora os arquivos baixados contêm apenas "indefinidos".
Chad Johnson
Acabei de verificar o repositório, executei npm installe, em seguida, cat bitstampUSD-2014-9-9.jsonparece ótimo para mim. Se você está investindo em fazê-lo funcionar, vamos levá-lo ao Github, em vez dos comentários do Stackoverflow? Deixe-me um relatório de erro?
F1lt3r
se entendi que seu código me permite obter o histórico completo do preço do bitcoin em uma escala de 1 minuto?
Mayeul sgc 27/03
Sim, isso mesmo #
f1lt3r 28/0317