Quant Buffet放轻松,别过度思虑

结合动量与反趋势策略在美国股票指数上的应用

登录后收藏

学术论文

策略概要

投资范围包括跟踪纳斯达克综合指数和标准普尔500指数的两只ETF/期货。趋势跟踪策略使用纳斯达克价格的指数移动平均线(EMA),当收盘价高于50日和150日EMA时买入。如果价格低于50日EMA但高于150日EMA,则该策略转为现金,当价格低于两个EMA时卖空。逆趋势策略在今日低点为过去20天最低点时买入标准普尔500指数ETF,否则卖出。投资者将50%分配给每个策略。

II. 策略合理性

这种组合策略的本质在于实施一种机制,以减少短期反转的影响——即逆趋势策略。该策略仅在市场大幅下跌后才买入选定的ETF。结果是显著提高了回报/风险比率。

回测表现

索提诺比率0.004
最大回撤-11.5%
胜率47%

完整 Python 代码

from AlgorithmImports import *
class MomentumandCountertrend(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)
self.SetWarmUp(150)

self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol
self.qqq = self.AddEquity("QQQ", Resolution.Daily).Symbol

self.qqq_short_ema = self.EMA("QQQ", 50, Resolution.Daily)
self.qqq_long_ema = self.EMA("QQQ", 150, Resolution.Daily)

self.low_history_period = 20
self.spy_low_history = RollingWindow[float](self.low_history_period)

def OnData(self, data):
if self.IsWarmingUp: return

# QQQ trend-following strategy
if self.qqq_short_ema.IsReady and self.qqq_long_ema.IsReady:
    if self.qqq in data.Bars:
        qqq_close = data.Bars[self.qqq].Close
        
        short_ema = self.qqq_short_ema.Current.Value
        long_ema = self.qqq_long_ema.Current.Value

        if (short_ema > long_ema) and (qqq_close > short_ema) and (qqq_close > long_ema):
            self.SetHoldings(self.qqq, 1/2)
        elif (short_ema < long_ema) and (qqq_close < short_ema) and (qqq_close < long_ema):
            self.SetHoldings(self.qqq, -1/2)
# SPY counter-trend strategy
if self.spy in data.Bars:
    spy_low = data.Bars[self.spy].Low
    self.spy_low_history.Add(spy_low)
    if self.spy_low_history.IsReady:
        history_low = min([x for x in self.spy_low_history])  # low of the 20 most recent days
        
        if history_low == spy_low:
            self.SetHoldings(self.spy, 1/2)
        else:
            self.SetHoldings(self.spy, -1/2)