Quant Buffet放轻松,别过度思虑

加密市场折价

登录后收藏

学术论文

Cryptomarket Discounts

作者Cryptomarket Discounts [点击查看论文]

机构
  • ITLibera Università Internazionale degli Studi Sociali Guido Carli
  • ?LUISS University - Department of Economics and Finance
  • University of Surrey

策略概要

投资范围包括在不同交易所交易的比特币-美元对,每个交易对都被视为一个独立的资产。为了计算每个市场的折价,将每个交易所的比特币美元价格(P(m,1))与Bitfinex的价格(P(1,1))进行比较,折价D(m,j)计算为(P(m,1)/P(1,1)) - 1。资产根据折价水平从低到高排序,形成五个基于折价水平的投资组合。该策略涉及在折价最低(溢价最高)的市场买入比特币,并在Bitfinex(市场1)卖出比特币。投资组合采用等权重,每日重新平衡,并涉及使用无风险利率和比特币期货,投资者偿还借入的美元加上任何应计利息。

II. 策略合理性

比特币在不同交易所的价格往往存在显著差异,这与一价定律相悖,原因在于折价或溢价。尽管套利策略可以利用这些差异,但交易费用、提现成本和执行延迟使过程复杂化。尽管存在这些限制,论文表明,即使在考虑了交易成本之后,基于利用这些价格差异的策略仍然有利可图且具有经济意义。这表明,虽然纯粹的套利可能很困难,但所提出的策略仍然可以实际应用并产生可观的回报。投资者可以从交易所之间这些持续且巨大的价格差异中受益,利用市场中的低效率。

回测表现

波动率3.28%
夏普比率4.21
胜率62%

完整 Python 代码

from AlgorithmImports import *
import data_tools
# endregion
class CryptomarketDiscounts(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2015, 1, 1)
self.SetCash(100000)
# exchanges
tickers:list[str] = [
    'ABUCOINS_BTCUSD', 'BITBAY_BTCUSD', 'BITSTAMP_BTCUSD', 'BITTREX_BTCUSD',
    'CEX_BTCUSD', 'COINBASE_BTCUSD', 'EXMO_BTCUSD', 'GEMINI_BTCUSD',
    'HITBTC_BTCUSD', 'ITBIT_BTCUSD', 'KRAKEN_BTCUSD', 'OKCOIN_BTCUSD', 
    'YOBIT_BTCUSD'
]
bitfinex_btc_ticker:str = 'BITFINEX_BTCUSD'
self.quantile:int = 5
self.portfolio_percentage:float = .1
self.exchange_btc_symbols:list[Symbol] = []
# subscribe symbols
for ticker in tickers + [bitfinex_btc_ticker]:
    security:Security = self.AddData(data_tools.QuantpediaBTCExchanges, ticker, Resolution.Daily)
    security.SetFeeModel(data_tools.CustomFeeModel())
    security.SetLeverage(5)
    if ticker == bitfinex_btc_ticker:
        self.bitfinex_btc_symbol:Symbol = security.Symbol
    else:
        self.exchange_btc_symbols.append(security.Symbol)
def OnData(self, data: Slice):
premium_by_symbol:dict[Symbol, float] = {}
# calculate discount (premium)
if data.ContainsKey(self.bitfinex_btc_symbol):
    bitfinex_btc_price:float = data[self.bitfinex_btc_symbol].Value
    for exch_symbol in self.exchange_btc_symbols:
        if data.ContainsKey(exch_symbol):
            exch_price:float = data[exch_symbol].Value
            
            premium:float = exch_price / bitfinex_btc_price - 1
            premium_by_symbol[exch_symbol] = premium

if len(premium_by_symbol) < self.quantile:
    self.Liquidate()
    return
quantile:int = int(len(premium_by_symbol) / self.quantile)
sorted_by_discount:list[Symbol] = [x[0] for x in sorted(premium_by_symbol.items(), key=lambda item: item[1])]
# investing in the markets with the highest discounts
long_leg:list[Symbol] = sorted_by_discount[:quantile]
long_length = len(long_leg)
# liquidate
invested = [x.Key for x in self.Portfolio if x.Value.Invested]
for exch_symbol in invested:
    if exch_symbol not in long_leg and exch_symbol != self.bitfinex_btc_symbol:
        self.Liquidate(exch_symbol)
# trade arbitrage
for exch_symbol in long_leg:
    self.SetHoldings(exch_symbol, (1 / long_length) * self.portfolio_percentage)
self.SetHoldings(self.bitfinex_btc_symbol, -1 * self.portfolio_percentage)