获取比特币历史数据

128

我想制作自己的比特币图表。

你知道可靠的检索比特币历史价格数据的方法吗?是否有使用REST检索它的方式?我看到Bitfloor支持REST,但没有返回任何有用的值,反而出现了“内部服务器错误”的问题。

我也看到了Bitcoincharts,但我认为它仅限于2000个数据值。

你会推荐我使用哪种框架或系统来解决这个问题吗?


4
在这里:http://bitcoin.stackexchange.com/a/4808/5 - nmat
您可以从Coinigy购买覆盖多个交易所/市场的历史比特币数据:http://coinigy.com/bitcoin-data/ - Joe Phillips
这是我用Python提供的解决方案:https://stackoverflow.com/a/66773333/2251559 - Benji A.
7个回答

155

实际上,你可以从Bitcoincharts获取所有比特币交易历史记录的CSV格式,网址为:http://api.bitcoincharts.com/v1/csv/

该网站每天更新两次活跃交易所的数据,并包含一些已死亡的交易所。

编辑提示:由于CSV文件中没有列标题,请查看以下信息:

  • 第1列为交易时间戳
  • 第2列为价格
  • 第3列为交易量

3
+1 是的,实际上它对于记录已建立的交易非常有用。数据也可以通过Bitstamp的推送API实时获取,这也是我正在做的事情。在将Bitstamp索引一天之后,我下载了bitstampUSD.csv并将数据前置以获得完整的图片。 - nurettin
2
@Lykegenes 第二列是什么?数值范围在0.5到33之间,这不可能是美元对比特币的汇率。 - holdenlee
4
请注意bitcoincharts.com数据中可能存在较大的间隔,另外也没有买卖的"tick"信息。 - Petr Javorik
2
@theJerm 这是UNIX时间戳格式,表示自1970年01月01日以来在UTC时区的秒数 - Lykegenes
2
我在哪里可以获取莱特币、以太坊或其他重要数字货币的数据? - skan
显示剩余15条评论

33

2
在SO上,不鼓励仅提供链接的答案。此外,他正在寻找一种检索数据的方法,而不仅仅是数据本身。 - fancyPants
2
你说得对,我应该在回答中更全面一些。然而,我的回答确实回答了他的请求,因为检索数据的API调用在页面的右侧列出。 - Sean
链接已损坏。 - Guillaume Chevalier
2
@GuillaumeChevalier 我找到了https://www.quandl.com/data/BCHARTS-Bitcoin-Charts-Exchange-Rate-Data。 - Jörn

17

如果您想要在更长的时间周期内以更高的分辨率收集bitstamp交易数据,可以使用下面的脚本log_bitstamp_trades.py从他们的websocket中提取。

该脚本使用python websocket-client和pusher_client_python库,请先安装它们。

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

以及logrotate文件配置

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

那么您可以在后台运行它

nohup ./log_bitstamp_trades.py /mnt/data/bitstamp_logs/bitstamp-trade.log /mnt/data/bitstamp_logs/reload_log &

1
使用时间序列存储,如InfluxDB,将是一个不错的改进。 - MrYellow

10

Bitstamp在此链接提供了实时的比特币数据,以JSON格式公开可用。请注意,在10分钟内不要超过600次访问,否则他们将阻止您的IP(而且这也是不必要的;在此处阅读更多)。以下是使用C#获取实时数据的方法:

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
}

从这里开始,您可以解析 JSON 并将其存储在数据库中(或直接使用 MongoDB 插入),然后访问它。

对于历史数据(取决于数据库的不同方法),可以从平面文件进行插入,大多数数据库都允许使用它们(例如,使用 SQL Server 可以从 CSV 文件进行 BULK INSERT)。


5

用Node.js将其转换为JSON格式会很有趣 :)

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

enter image description here

[
  [
    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)
  ]
]

谢谢你提供脚本!现在下载的文件似乎只包含“未定义”的内容。 - Chad Johnson
我刚刚检查了代码库,运行了 npm install,然后 cat bitstampUSD-2014-9-9.json 看起来对我来说没问题。如果你想让它工作,我们可以把它放到 Github 上,而不是在 Stackoverflow 的评论区?给我留下一个 bug 报告? - f1lt3r
如果我理解正确,您的代码允许我在1分钟的时间尺度上获取比特币价格的完整历史记录? - Mayeul sgc
是的,没错。 - f1lt3r
对我来说没有用。我基于你的脚本创建了一个可行的解决方案:https://github.com/stpoa/bitcoin-price-scraper - stpoa

5

我已经为这种情况编写了一个Java示例:

使用json.org库检索JSONObjects和JSONArrays。下面的示例使用blockchain.info的数据,可以作为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;
            }
        }
    }

这个程序使用了哪个库? - Michael A
标准JSON:http://www.json.org/ - domi

5
Coinbase拥有一个REST API,可让您从其网站访问历史价格。数据似乎显示每十分钟左右的Coinbase现货价格(以美元计)。结果以CSV格式返回。您必须通过API查询所需的页面编号。每页有1000个结果(或价格点)。这大约是每页7天的数据量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接