Quant Buffet放轻松,别过度思虑

股指期货中的短期反转现象

登录后收藏

回测表现

年化收益29.6%
贝塔0.03
索提诺比率-0.001
胜率49%

完整 Python 代码

import numpy as np
from AlgorithmImports import *
class ShortTermReversal(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)

self.symbols = ['EWG', 'EWQ', 'EWI', 'EWP', 'EWN', 'EWK', 'EWO']

# Daily price data.
self.data = {}
self.period = 5
self.SetWarmUp(self.period)

for symbol in self.symbols:
    data = self.AddEquity(symbol, Resolution.Daily)
    data.SetFeeModel(CustomFeeModel())
    data.SetLeverage(5)
    
    self.data[symbol] = RollingWindow[float](self.period)

self.Schedule.On(self.DateRules.Every(DayOfWeek.Thursday), self.TimeRules.AfterMarketOpen(self.symbols[0]), self.Rebalance)
def OnData(self, data):
for symbol in self.data:
    symbol_obj = self.Symbol(symbol)
    if symbol_obj in data.Keys:
        if data[symbol_obj]:
            price = data[symbol_obj].Value
            if price != 0:
                self.data[symbol].Add(price)
def Rebalance(self):
self.Liquidate()

symbol_return = {}
for symbol in self.symbols:
    if self.data[symbol].IsReady: 
        if self.Securities[symbol].GetLastData() and (self.Time.date() - self.Securities[symbol].GetLastData().Time.date()).days < 5:
            closes = [x for x in self.data[symbol]]
            symbol_return[symbol] = closes[0] / closes[-1] - 1

if len(symbol_return) != 0:
    avg_ret = np.average([x[1] for x in symbol_return.items()])
    
    # Average return weighting.
    return_diff = {x[0] : abs(x[1] - avg_ret) for x in symbol_return.items()}

    total_diff = sum(x[1] for x in return_diff.items())
    weight_ratio = float(1 / total_diff)

    # Trade execution.
    winners = [x[0] for x in return_diff.items() if symbol_return[x[0]] > avg_ret]
    losers = [x[0] for x in return_diff.items() if symbol_return[x[0]] < avg_ret]
    
    for symbol in winners + losers:
        weight = return_diff[symbol] * weight_ratio
        if symbol in winners:
            self.SetHoldings(symbol, -weight)
        elif symbol in losers:
            self.SetHoldings(symbol, weight)

# Custom fee model
class CustomFeeModel(FeeModel):
def GetOrderFee(self, parameters):
fee = parameters.Security.Price * parameters.Order.AbsoluteQuantity * 0.00005
return OrderFee(CashAmount(fee, "USD"))