Quant Buffet放轻松,别过度思虑

利用美国存托凭证(ADRs)进行价差交易

登录后收藏

学术论文

策略概要

投资范围包括两个ETF:代表美国市场的SPY(标准普尔500指数ETF)和代表中国ADR的FXI(iShares中国大盘ETF)。投资者为ADR和SPY之间的每日价差设定-0.4%的阈值。当价差跌至该值以下时,投资者开仓,做多FXI,做空SPY。持仓一天,并在收盘时平仓。投资组合等权重,策略每日重新平衡。

II. 策略合理性

该策略利用了ADR的时间不一致行为,特别是来自日本、香港、中国、台湾、印度和韩国等亚洲国家的ADR。这些ADR受到美国和其本国市场情绪的影响。随着美国市场收盘,这些国家的市场开盘,导致异步的价格波动。这导致ADR价格及其基础股票出现波动,经常在ADR价格和标准普尔500指数(SPY)之间产生价差。该策略假设该价差将回归均值,通过基于阈值开仓并持有至收盘,从而利用这些差异获利。

回测表现

波动率16.35%
夏普比率0.61
索提诺比率-0.369
胜率46%

完整 Python 代码

from AlgorithmImports import *
class SpreadTradingADRs(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)
self.symbols = ['SPY', 'FXI']

self.k = -0.004

for symbol in self.symbols:
    self.AddEquity(symbol, Resolution.Minute)

self.spy_open_price = 0
self.fxi_open_price = 0

self.Schedule.On(self.DateRules.EveryDay(self.symbols[0]), self.TimeRules.AfterMarketOpen(self.symbols[0], 1), self.MarketOpen)
self.Schedule.On(self.DateRules.EveryDay(self.symbols[0]), self.TimeRules.BeforeMarketClose(self.symbols[0], 1), self.Rebalance)

def MarketOpen(self):
if self.Securities.ContainsKey(self.symbols[0]) and self.Securities.ContainsKey(self.symbols[1]):
    spy_price = self.Securities[self.symbols[0]].Open
    fxi_price = self.Securities[self.symbols[1]].Open
    if spy_price != 0 and fxi_price != 0:
        self.spy_open_price = spy_price
        self.fxi_open_price = fxi_price
                
def Rebalance(self):
self.Liquidate()

if self.Securities.ContainsKey(self.symbols[0]) and self.Securities.ContainsKey(self.symbols[1]):
    spy_price = self.Securities[self.symbols[0]].Close
    fxi_price = self.Securities[self.symbols[1]].Close
    
    if spy_price != 0 and fxi_price != 0 and self.spy_open_price != 0 and self.fxi_open_price != 0:
        spy_ret = spy_price / self.spy_open_price - 1
        fxi_ret = fxi_price / self.fxi_open_price - 1
        
        if fxi_ret - spy_ret < self.k:
            self.SetHoldings('FXI', 1/2)
            self.SetHoldings('SPY', -1/2)

        self.spy_open_price = 0
        self.fxi_open_price = 0