“该策略的投资范围包括两个ETF:美国大型股S&P 500($SPY)和新兴市场国家MSCI指数($EEM)。策略为简单的趋势跟随,选择滞后期为12个月。交易规则为:如果过去12个月的价差表现为正,则下个月做多价差(做多$SPY,做空$EEM);否则,做空价差(做空$SPY,做多$EEM)。策略每12个月进行一次再平衡。”
资产类别:ETF,基金 | 地区:全球 | 频率:月度 | 市场:股票 | 关键词:美国股票,新兴市场,EAFE
策略概述
该策略的投资范围包括两个ETF:美国大型股S&P 500 (TR) (ˆSP500TR) $SPY 和新兴市场国家MSCI指数 $EEM。 (数据可来自雅虎财经和MSCI全球市场指数网站。)
在一个价差上进行简单的趋势跟随策略(SPY作为美国股票的代理,EM作为新兴市场股票的代理): 选择滞后期为1年(12个月)。 普遍的交易规则(适用于所有价差)非常简单明了:如果过去12个月的价差表现为正,那么在下个月我们做多价差(做多100%的SPY,做空100%的相应股票ETF);否则,我们做空价差(做空SPY,做多相应ETF)。
根据计算,策略将每12个月(年度)进行再平衡。
策略合理性
作者得出结论,在过去30年(大约,准确来说是29年半),美国股市整体上以每年超过4%的幅度击败了欧洲、亚洲和远东(EAFE)发达市场地区,以每年超过2%的幅度击败了新兴市场股票,稍微超过了价值股(0.6%),而略微落后于美国小盘股(-0.5%)。在1年动量时间框架内,SPY与EM的表现也不错,但所有趋势策略的主要问题是高回撤。我们简化为一个经验法则:如果美国股票在12-36个月的时间框架内跑赢新兴市场或EAFE股票,那么你可能可以安全地押注它们在一段时间内会继续如此。此外,还有一个原因是EM/美国股票价差呈现趋势——美元往往具有趋势,其强弱会转化为主要资产类别的表现,尤其对大宗商品的表现影响最大。许多新兴市场(以及一些EAFE)国家是大宗商品生产大国,它们的股票是广泛的EM和EAFE指数的一部分。因此,美元对SPY与EM或SPY与EAFE的价差表现也有一定影响是毫不奇怪的。
论文来源
Why Do US Stocks Outperform EM and EAFE Regions? [点击浏览原文]
- Cyril Dujava, Radovan Vojtko, Quantpedia.com
<摘要>
Quantpedia的文章“为什么美国股票表现优于新兴市场和EAFE地区?”探讨了美国股票相较于新兴市场 (EM) 和美国以外的发达市场 (DM) 历史性表现优异的原因。文章强调了导致这一现象的几个因素,包括:
生产力:美国拥有许多高生产力的公司,这些公司拥有稳固的资本回报率。它们能够为投资者带来更高的利润,从而带来更高的回报。
市场规模与流动性:美国股票市场是世界上规模最大且流动性最强的市场,拥有多样化的股票。这种流动性使得投资者更容易买卖股票,从而促进更高效的定价和更好的回报。
政治与监管的稳定性:美国拥有稳定的政治和监管环境,为投资者提供信心并降低风险。这种稳定性吸引了更多的投资进入美国市场,进一步推动回报。
货币强势:美元作为全球储备货币,具有稳定性并对投资者具有吸引力。这使得美国股票对国际投资者更具吸引力,促成其优异表现。
市场周期:美国股票的表现往往遵循周期模式,有时表现突出,有时表现较弱。这些周期受到多种因素的影响,包括经济状况、利率和投资者情绪等。


回测表现
| 年化收益率 | 7.14% |
| 波动率 | 19.5% |
| Beta | 0.132 |
| 夏普比率 | 0.37 |
| 索提诺比率 | 0.308 |
| 最大回撤 | -62.28% |
| 胜率 | 67% |
完整python代码
from AlgorithmImports import *
import data_tools
from pandas.core.frame import DataFrame
# endregion
class WhyDoUSStocksOutperformEMandEAFERegions(QCAlgorithm):
def Initialize(self) -> None:
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)
self.period: int = 365
self.leverage: int = 3
self.spread_assets: List[Symbol] = [
self.AddEquity('SPY', Resolution.Daily).Symbol,
self.AddEquity('EEM', Resolution.Daily).Symbol
]
for symbol in self.spread_assets:
self.Securities[symbol].SetLeverage(self.leverage)
self.Settings.MinimumOrderMarginPortfolioPercentage = 0.
self.current_month: int = -1
def OnData(self, data: Slice) -> None:
# monthly rebalance
if self.Time.month == self.current_month:
return
self.current_month = self.Time.month
trade_direction: int = 0
returns_df: DataFrame = self.History(self.spread_assets, timedelta(days=self.period), Resolution.Daily)['close'].unstack(level=0).pct_change().iloc[1:].dropna(axis=1)
if returns_df.shape[1] == 2:
spread: pd.Series = returns_df[self.spread_assets[0]] - returns_df[self.spread_assets[1]]
spread_equity: float = (1 + spread).cumprod()
trade_direction: int = 1 if spread_equity[-1] > spread_equity[0] else -1
# order execution
portfolio: List[PortfolioTarget] = [PortfolioTarget(symbol, ((-1)**i) * trade_direction) for i, symbol in enumerate(self.spread_assets) if symbol in data and data[symbol]]
self.SetHoldings(portfolio, True)
