
“该策略涉及在不同交易所交易比特币-美元对,利用价格溢价和折价。它在折扣较低的市场买入比特币,并在Bitfinex卖出,每日重新平衡,投资组合等权重。”
资产类别: 加密货币 | 地区: 全球 | 周期: 每日 | 市场: 加密货币 | 关键词: 加密市场
I. 策略概要
投资范围包括在不同交易所交易的比特币-美元对,每个交易对都被视为一个独立的资产。为了计算每个市场的折价,将每个交易所的比特币美元价格(P(m,1))与Bitfinex的价格(P(1,1))进行比较,折价D(m,j)计算为(P(m,1)/P(1,1)) – 1。资产根据折价水平从低到高排序,形成五个基于折价水平的投资组合。该策略涉及在折价最低(溢价最高)的市场买入比特币,并在Bitfinex(市场1)卖出比特币。投资组合采用等权重,每日重新平衡,并涉及使用无风险利率和比特币期货,投资者偿还借入的美元加上任何应计利息。
II. 策略合理性
比特币在不同交易所的价格往往存在显著差异,这与一价定律相悖,原因在于折价或溢价。尽管套利策略可以利用这些差异,但交易费用、提现成本和执行延迟使过程复杂化。尽管存在这些限制,论文表明,即使在考虑了交易成本之后,基于利用这些价格差异的策略仍然有利可图且具有经济意义。这表明,虽然纯粹的套利可能很困难,但所提出的策略仍然可以实际应用并产生可观的回报。投资者可以从交易所之间这些持续且巨大的价格差异中受益,利用市场中的低效率。
III. 来源论文
Cryptomarket Discounts [点击查看论文]
- 尼科拉·博里(Nicola Borri)和基里尔·沙赫诺夫(Kirill Shakhnov),LUISS 大学经济与金融系,萨里大学
<摘要>
本论文通过考察比特币价格随时间以及跨交易所-货币对的分布来研究加密货币市场的效率。我们记录了比特币相对价格(或折价)的持续差异,半衰期为1天,分布呈尖峰厚尾状,右偏,标准差为3.9%。由于市场分割和与特定地点挖矿活动及投资者关注相关的本地供需冲击的综合影响,资本管制更严格的国家折价变异性更大。


IV. 回测表现
| 年化回报 | 17.82% |
| 波动率 | 3.28% |
| β值 | -0.005 |
| 夏普比率 | 4.21 |
| 索提诺比率 | N/A |
| 最大回撤 | N/A |
| 胜率 | 62% |
V. 完整的 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)