CoinAPI

Kraken Crypto Price Data

Introduction

The Kraken Crypto Price Data by CoinAPI provides Cryptocurrency price and volume data points. The data covers 710 Cryptocurrency pairs, starts in October 2013, and is delivered on any frequency from tick to daily. This dataset is created by monitoring the trading activity on the Cryptocurrency markets/exchanges supported by QuantConnect.

For more information about the Kraken Crypto Price Data dataset, including CLI commands and pricing, see the dataset listing.

About the Provider

CoinAPI was founded by Artur Pietrzyk in 2016 with the goal of providing real-time and historical cryptocurrency market data, collected from hundreds of exchanges. CoinAPI provides access to Cryptocurrencies for traders, market makers, and developers building third-party applications.

Getting Started

The following snippet demonstrates how to request data from the Kraken Crypto Price dataset:

from QuantConnect.DataSource import *
from QuantConnect.Data.UniverseSelection import *

# Kraken accepts both Cash and Margin type account.
self.SetBrokerageModel(BrokerageName.Kraken, AccountType.Cash)
self.SetBrokerageModel(BrokerageName.Kraken, AccountType.Margin)

self.symbol = self.AddCrypto("BTCUSD", Resolution.Minute, Market.Kraken).Symbol

self.universe = self.AddUniverse(CryptoUniverse.Kraken(self.UniverseSelectionFilter));
using QuantConnect.DataSource;
using QuantConnect.Data.UniverseSelection;

// Kraken accepts both Cash and Margin type account.
SetBrokerageModel(BrokerageName.Kraken, AccountType.Cash);
SetBrokerageModel(BrokerageName.Kraken, AccountType.Margin);

_symbol = AddCrypto("BTCUSD", Resolution.Minute, Market.Kraken).Symbol;

_universe = AddUniverse(CryptoUniverse.Kraken(UniverseSelectionFilter));

Data Summary

The following table describes the dataset properties:

PropertyValue
Start DateOctober 2013
Asset Coverage710 Currency Pairs
Data DensityDense
ResolutionTick, Second, Minute, Hourly, & Daily
TimezoneUTC

Data Point Attributes

The Kraken Crypto Price dataset provides TradeBar, QuoteBar, Tick, and CryptoUniverse objects.

TradeBar Attributes

TradeBar objects have the following attributes:

QuoteBar Attributes

QuoteBar objects have the following attributes:

Tick Attributes

Tick objects have the following attributes:

CryptoUniverse Attributes

CryptoUniverse objects have the following attributes:

Supported Assets

The following table shows the available Cryptocurrency pairs:

Requesting Data

To add Kraken Crypto Price data to your algorithm, call the AddCrypto method. Save a reference to the Crypto Symbol so you can access the data later in your algorithm.

class CoinAPIDataAlgorithm(QCAlgorithm):

    def Initialize(self) -> None:
        self.SetStartDate(2020, 6, 1)
        self.SetEndDate(2021, 6, 1)
        self.SetCash(100000)

        # Kraken accepts both Cash and Margin type account.
        self.SetBrokerageModel(BrokerageName.Kraken, AccountType.Margin)
        
        self.symbol = self.AddCrypto("BTCUSD", Resolution.Minute, Market.Kraken).Symbol
namespace QuantConnect
{
    public class CoinAPIDataAlgorithm : QCAlgorithm
    {
        private Symbol _symbol;
        
        public override void Initialize()
        {
            SetStartDate(2020, 6, 1);
            SetEndDate(2021, 6, 1);
            SetCash(100000);

            // Kraken accepts both Cash and Margin type account.
            SetBrokerageModel(BrokerageName.Kraken, AccountType.Margin);
            
            _symbol = AddCrypto("BTCUSD", Resolution.Minute, Market.Kraken).Symbol;
        }
    }
}

For more information about creating Crypto subscriptions, see Requesting Data.

Accessing Data

To get the current Kraken Crypto Price data, index the Bars, QuoteBars, or Ticks properties of the current Slice with the Crypto Symbol. Slice objects deliver unique events to your algorithm as they happen, but the Slice may not contain data for your security at every time step. To avoid issues, check if the Slice contains the data you want before you index it.

def OnData(self, slice: Slice) -> None:
    if self.symbol in slice.Bars:
        trade_bar = slice.Bars[self.symbol]
        self.Log(f"{self.symbol} close at {slice.Time}: {trade_bar.Close}")

    if self.symbol in slice.QuoteBars:
        quote_bar = slice.QuoteBars[self.symbol]
        self.Log(f"{self.symbol} bid at {slice.Time}: {quote_bar.Bid.Close}")

    if self.symbol in slice.Ticks:
        ticks = slice.Ticks[self.symbol]
        for tick in ticks:
            self.Log(f"{self.symbol} price at {slice.Time}: {tick.Price}")
public override void OnData(Slice slice)
{
    if (slice.Bars.ContainsKey(_symbol))
    {
        var tradeBar = slice.Bars[_symbol];
        Log($"{_symbol} price at {slice.Time}: {tradeBar.Close}");
    }

    if (slice.QuoteBars.ContainsKey(_symbol))
    {
        var quoteBar = slice.QuoteBars[_symbol];
        Log($"{_symbol} bid at {slice.Time}: {quoteBar.Bid.Close}");
    }

    if (slice.Ticks.ContainsKey(_symbol))
    {
        var ticks = slice.Ticks[_symbol];
        foreach (var tick in ticks)
        {
            Log($"{_symbol} price at {slice.Time}: {tick.Price}");
        }
    }
}

You can also iterate through all of the data objects in the current Slice.

def OnData(self, slice: Slice) -> None:
    for symbol, trade_bar in slice.Bars.items():
        self.Log(f"{symbol} close at {slice.Time}: {trade_bar.Close}")

    for symbol, quote_bar in slice.QuoteBars.items():
        self.Log(f"{symbol} bid at {slice.Time}: {quote_bar.Bid.Close}")

    for symbol, ticks in slice.Ticks.items():
        for tick in ticks:
            self.Log(f"{symbol} price at {slice.Time}: {tick.Price}")
public override void OnData(Slice slice)
{
    foreach (var kvp in slice.Bars)
    {
        var symbol = kvp.Key;
        var tradeBar = kvp.Value;
        Log($"{symbol} price at {slice.Time}: {tradeBar.Close}");
    }

    foreach (var kvp in slice.QuoteBars)
    {
        var symbol = kvp.Key;
        var quoteBar = kvp.Value;
        Log($"{symbol} bid at {slice.Time}: {quoteBar.Bid.Close}");
    }

    foreach (var kvp in slice.Ticks)
    {
        var symbol = kvp.Key;
        var ticks = kvp.Value;
        foreach (var tick in ticks)
        {
            Log($"{symbol} price at {slice.Time}: {tick.Price}");
        }
    }
}

For more information about accessing Crypto data, see Handling Data.

Historical Data

To get historical Kraken Crypto Price data, call the History method with the Crypto Symbol. If there is no data in the period you request, the history result is empty.

# DataFrame
history_df = self.History(self.symbol, 100, Resolution.Daily)

# TradeBar objects
history_trade_bars = self.History[TradeBar](self.symbol, 100, Resolution.Minute)

# QuoteBar objects
history_quote_bars = self.History[QuoteBar](self.symbol, 100, Resolution.Minute)

# Tick objects
history_ticks = self.History[Tick](self.symbol, timedelta(seconds=10), Resolution.Tick)
// TradeBar objects 
var historyTradeBars = History(_symbol, 100, Resolution.Daily);

// QuoteBar objects 
var historyQuoteBars = History<QuoteBar>(_symbol, 100, Resolution.Minute);

// Tick objects 
var historyTicks = History<Tick>(_symbol, TimeSpan.FromSeconds(10), Resolution.Tick);

For more information about historical data, see History Requests.

Universe Selection

To select a dynamic universe of Kraken Crypto pairs, call the AddUniverse method with a CryptoUniverse object. A Crypto universe uses a selection function to select Crypto pairs based on their OHLCV and dollar volume of the previous day as of midnight Coordinated Universal Time (UTC).

from QuantConnect.Data.UniverseSelection import *

def Initialize(self) -> None:
    self.SetBrokerageModel(BrokerageName.Kraken, AccountType.Margin)
    self.UniverseSettings.Asynchronous = True
    self.universe = self.AddUniverse(CryptoUniverse.Kraken(self.UniverseSelectionFilter))

def UniverseSelectionFilter(self, universe_day):
    return [c.Symbol for c in universe_day if c.Volume >= 100 and c.VolumeInUsd > 10000]
using QuantConnect.Data.UniverseSelection;

public override void Initialize()
{
    SetBrokerageModel(BrokerageName.Kraken, AccountType.Margin);
    UniverseSettings.Asynchronous = True;
    _universe = AddUniverse(CryptoUniverse.Kraken(UniverseSelectionFilter));
}

private IEnumerable<Symbol> UniverseSelectionFilter(IEnumerable<CryptoUniverse> universeDay)
{
    return from c in universeDay
           where c.Volume >= 100m && c.VolumeInUsd > 10000m
           select c.Symbol;
}

For more information about universe settings, see Settings.

Universe History

You can get historical universe data in an algorithm and in the Research Environment.

Historical Universe Data in Algorithms

To get historical universe data in an algorithm, call the History method with the Universe object, and the lookback period. If there is no data in the period you request, the history result is empty.

var history = History(_universe, 30, Resolution.Daily);
foreach (var universeDay in history)
{
    foreach (CryptoUniverse universeItem in universeDay)
    {
        Log($"{universeItem.Symbol} price at {universeItem.EndTime}: {universeItem.Close}");
    }
}
history = self.History(self.universe, 30, Resolution.Daily)
for (univere_symbol, time), universe_day in history.items():
    for universe_item in universe_day:
        self.Log(f"{universe_item.Symbol} price at {universe_item.EndTime}: {universe_item.Close}")

Historical Universe Data in Research

To get historical universe data in research, call the UniverseHistory method with the Universe object, and the lookback period. The UniverseHistory returns the filtered universe. If there is no data in the period you request, the history result is empty.

var universeHistory = qb.UniverseHistory(universe, qb.Time.AddDays(-30), qb.Time);
foreach (var universeDay in universeHistory)
{
    foreach (CryptoUniverse universeItem in universeDay)
    {
        Console.WriteLine($"{universeItem.Symbol} price at {universeItem.EndTime}: {universeItem.Close}");
    }
}
universe_history = qb.UniverseHistory(universe, qb.Time-timedelta(30), qb.Time)
for (univere_symbol, time), universe_day in universe_history.items():
    for universe_item in universe_day:
        print(f"{universe_item.Symbol} price at {universe_item.EndTime}: {universe_item.Close}")

You can call the History method in Research.

Remove Subscriptions

To unsubscribe from a Crypto pair that you added with the AddCrypto method, call the RemoveSecurity method.

self.RemoveSecurity(self.symbol)
RemoveSecurity(_symbol);

The RemoveSecurity method cancels your open orders for the security and liquidates your holdings in the virtual pair.

Example Applications

The Kraken Crypto Price dataset enables you to accurately design strategies for Cryptocurrencies. Examples include the following strategies:

  • Buy and hold
  • Trading Cryptocurrency volatility and price action
  • Allocating a small portion of your portfolio to Cryptocurrencies to hedge against inflation

You can also see our Videos. You can also get in touch with us via Discord.

Did you find this page helpful?

Contribute to the documentation: