Cryptocurrency¶
Cryptocurrency Daily Data¶
Quantiacs provides up-to-date daily data for cryptocurrencies:
import qnt.data as qndata
btc_data = qndata.cryptodaily.load_data(tail=365 * 8, dims=('time', 'field', 'asset'))
['ADA', 'AUR', 'AVAX', 'BCH', 'BCN', 'BLK', 'BNB', 'BSV', 'BTC', 'BTG',
 'BTS', 'DASH', 'DGC', 'DGD', 'DOGE', 'DOT', 'EOS', 'ETC', 'ETH', 'FCT',
 'FRC', 'FTC', 'GNT', 'ICP', 'IFC', 'IXC', 'LINK', 'LSK', 'LTC', 'MAID',
 'MNC', 'NEO', 'NMC', 'NXT', 'OMNI', 'PPC', 'PTS', 'QRK', 'REP', 'SOL',
 'STEEM', 'STRAX', 'THETA', 'TRC', 'TRX', 'UNI', 'WAVES', 'WDC', 'XCP',
 'XEM', 'XLM', 'XMR', 'XPM', 'XPY', 'XRP']  
| Number | Ticker | Full Name | 
|---|---|---|
| 1 | ADA | Cardano | 
| 2 | AUR | Auroracoin | 
| 3 | AVAX | Avalanche | 
| 4 | BCH | Bitcoin Cash | 
| 5 | BCN | Bytecoin | 
| 6 | BLK | BlackCoin | 
| 7 | BNB | Binance Coin | 
| 8 | BSV | Bitcoin SV | 
| 9 | BTC | Bitcoin | 
| 10 | BTG | Bitcoin Gold | 
| 11 | BTS | BitShares | 
| 12 | DASH | Dash | 
| 13 | DGC | DigitalCoin | 
| 14 | DGD | DigixDAO | 
| 15 | DOGE | Dogecoin | 
| 16 | DOT | Polkadot | 
| 17 | EOS | EOS | 
| 18 | ETC | Ethereum Classic | 
| 19 | ETH | Ethereum | 
| 20 | FCT | Factom | 
| 21 | FRC | Freicoin | 
| 22 | FTC | Feathercoin | 
| 23 | GNT | Golem | 
| 24 | ICP | Internet Computer | 
| 25 | IFC | Infinitecoin | 
| 26 | IXC | Ixcoin | 
| 27 | LINK | Chainlink | 
| 28 | LSK | Lisk | 
| 29 | LTC | Litecoin | 
| 30 | MAID | MaidSafeCoin | 
| 31 | MNC | Mincoin | 
| 32 | NEO | NEO | 
| 33 | NMC | Namecoin | 
| 34 | NXT | Nxt | 
| 35 | OMNI | Omni | 
| 36 | PPC | Peercoin | 
| 37 | PTS | ProtoShares | 
| 38 | QRK | Quark | 
| 39 | REP | Augur | 
| 40 | SOL | Solana | 
| 41 | STEEM | Steem | 
| 42 | STRAX | Stratis | 
| 43 | THETA | Theta Network | 
| 44 | TRC | Terracoin | 
| 45 | TRX | TRON | 
| 46 | UNI | Uniswap | 
| 47 | WAVES | Waves | 
| 48 | WDC | WorldCoin | 
| 49 | XCP | Counterparty | 
| 50 | XEM | NEM | 
| 51 | XLM | Stellar | 
| 52 | XMR | Monero | 
| 53 | XPM | Primecoin | 
| 54 | XPY | Paycoin | 
| 55 | XRP | XRP | 
Examples¶
This trading strategy uses a moving average crossover system for Crypto Daily Long contest, taking long positions when the 10-day LWMA is above the 50-day LWMA, considering the asset’s liquidity.
# import os
# os.environ['API_KEY'] = "{your_api_key_here}"  # you may need it for local development
import xarray as xr
import qnt.stats as qnstats
import qnt.data as qndata
import qnt.output as qnout
import qnt.ta as qnta
def calculate_weights(data):
    close = data.sel(field="close")
    liquidity = data.sel(field='is_liquid')
    long_lwma = qnta.lwma(close, 50)
    short_lwma = qnta.lwma(close, 10)
    buy = 1
    return xr.where(short_lwma > long_lwma, buy, 0) * liquidity
# SINGLE-PASS
data = qndata.cryptodaily.load_data(min_date="2013-04-01")  # load data
weights = calculate_weights(data)
weights = qnout.clean(weights, data, 'crypto_daily_long')  # fix common errors
qnout.check(weights, data, 'crypto_daily_long')  # check that weights are correct.
qnout.write(weights)  # write results, necessary for submission.
statistics = qnstats.calc_stat(data, weights.sel(time=slice("2014-01-01", None)))  # calc stats
print(statistics.to_pandas().tail())
# import qnt.graph as qngraph
# qngraph.make_major_plots(statistics)  # works in Jupyter Notebook
# # MULTI-PASS
# import qnt.backtester as qnbt
# weights = qnbt.backtest(
#     competition_type='crypto_daily_long',  # Crypto Daily Long contest
#     lookback_period=365,  # lookback in calendar days
#     start_date="2014-01-01",
#     strategy=calculate_weights,
#     analyze=True,
#     build_plots=True
# )
This example demonstrates how to use various data sources to predict the stock market. It leverages futures, stocks, and cryptocurrency data to build a strategy.
# import os
# os.environ['API_KEY'] = "{your_api_key_here}"  # you may need it for local development
# Import basic libraries.
import xarray as xr
import pandas as pd
import numpy as np
# Import Quantiacs libraries.
import qnt.data as qndata  # load and manipulate data
import qnt.output as qnout  # manage output
import qnt.backtester as qnbt  # backtester
import qnt.stats as qnstats  # statistical functions for analysis
import qnt.graph as qngraph  # graphical tools
import qnt.ta as qnta  # indicators library
import qnt.xr_talib as xr_talib  # indicators library
import qnt.exposure as qnexp  # exposure calculation
def load_data(period):
    stocks = qndata.stocks.load_ndx_data(tail=period)
    futures = qndata.futures.load_data(tail=period, assets=["F_DX"]).isel(asset=0)
    futures = xr.align(futures, stocks.isel(field=0), join='right')[0]
    try:
        crypto = qndata.cryptodaily.load_data(tail=period, assets=["BTC"]).isel(asset=0)
        crypto = xr.align(crypto, stocks.isel(field=0), join='right')[0]
    except Exception as e:
        # Cryptocurrency data is not available in 2006.
        print(f"Failed to load crypto data: {e}")
        crypto = futures  # Fallback to futures data if crypto data loading fails
    return {"futures": futures, "stocks": stocks, "crypto": crypto}, stocks.time.values
def window(data, max_date: np.datetime64, lookback_period: int):
    min_date = max_date - np.timedelta64(lookback_period, "D")
    return {
        "futures": data["futures"].sel(time=slice(min_date, max_date)),
        "stocks": data["stocks"].sel(time=slice(min_date, max_date)),
        "crypto": data["crypto"].sel(time=slice(min_date, max_date)),
    }
def strategy(data):
    # close_futures = data["futures"].sel(field="close")
    close_crypto = data["crypto"].sel(field="close")
    close_stocks = data["stocks"].sel(field="close")
    # Generate buy signal if 20-day SMA < 50-day SMA, otherwise hold (0) or sell (-1)
    accuracy = 0.00001  # to avoid floating point errors
    weights_stocks = xr.where(qnta.sma(close_stocks, 20) < qnta.sma(close_stocks, 50) + accuracy, 1, 0)
    weights_crypto = xr.where(qnta.sma(close_crypto, 20) < qnta.sma(close_crypto, 60) + accuracy, 1, 0)
    weights = (weights_stocks + weights_crypto) / 2
    # Apply liquidity filter
    is_liquid = data["stocks"].sel(field="is_liquid")
    weights = weights * is_liquid
    # Normalize positions and cut big positions
    weights_sum = abs(weights).sum('asset')
    weights = xr.where(weights_sum > 1, weights / weights_sum, weights)
    weights = qnexp.cut_big_positions(weights=weights, max_weight=0.049)
    return weights
weights = qnbt.backtest(
    competition_type="stocks_nasdaq100",
    load_data=load_data,
    lookback_period=90,
    start_date="2005-12-30",
    strategy=strategy,
    window=window,
    check_correlation=False
)
Cryptocurrency Hourly Data¶
Quantiacs provides up-to-date hourly data - price and volume - for the following cryptocurrencies:
import qnt.data as qndata
crypto_data = qndata.crypto.load_data(tail=365 * 10)
['BCH', 'BTC', 'EOS', 'ETH', 'LTC', 'USDT', 'XRP']
| Number | Ticker | Full Name | 
|---|---|---|
| 1 | BCH | Bitcoin Cash | 
| 2 | BTC | Bitcoin | 
| 3 | EOS | EOS | 
| 4 | ETH | Ethereum | 
| 5 | LTC | Litecoin | 
| 6 | USDT | Tether | 
| 7 | XRP | XRP | 
BTC Futures from spot price¶
For a more detailed description on loading and accessing BTC Futures consult our API-Reference: Loading BTC Futures Data
The Bitcoin Futures data for the last 8 years (history extended with Bitcoin spot price) can be loaded using:
import qnt.data as qndata
btc_data = qndata.cryptofutures.load_data(tail=365 * 8, dims=('time', 'field', 'asset'))