每个交易日通过将前一交易日的收盘价与当天上午10:00的价格进行比较计算前半小时的回报率。如果预测指标为正,则在最后半小时开始时建立多头仓位;如果预测指标为负,则建立空头仓位,并在最后半小时结束时平仓。

I. 策略概述

在每个交易日,通过将前一交易日的收盘价与当天上午10:00的价格进行比较计算前半小时的回报率。如果预测指标为正,则在最后半小时开始时建立多头仓位;如果预测指标为负,则建立空头仓位,并在最后半小时结束时平仓。

II. 策略合理性

动量效应广泛存在于各种资产类别中,包括股票、货币、大宗商品和债券,其中特定时间段的历史表现可预测未来的回报。在日内交易中,前半小时的回报率显著预测最后半小时的回报率。前半小时的回报率通过比较前一交易日的收盘价与开盘后30分钟的价格得出,捕捉隔夜和盘前新闻的影响。开盘前的价格敏感新闻通常会导致盘前的大幅波动、高交易量和显著的隔夜回报。在开盘初期的高活动性之后,交易趋于放缓,直到最后半小时,机构交易者平仓引发高交易量和波动性,而这些波动性受前半小时新闻的影响较大。

III. 论文来源

Intraday Momentum: Evidence from the Crude Oil Market [点击浏览原文]

<摘要>

通过对2006年至2018年间美国石油基金(USO)高频数据的分析,我们发现原油市场中存在日内动量效应。前半小时的回报率(基于前一交易日的收盘价)能够正向预测最后半小时的回报率,无论是样本内还是样本外均有效。此预测能力在危机期间及实现波动率较高、交易量较大、隔夜回报率较高和存在跳跃波动的日子里更强。基于前半小时回报率作为时机信号构建的市场时机策略优于其他两种基准策略。

IV. 回测表现

年化收益率1.85%
波动率N/A
Beta0.003
夏普比率N/A
索提诺比率N/A
最大回撤N/A
胜率53%

V. 完整python代码

from AlgorithmImports import *
#endregion
class IntradayMomentumCrudeOil(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2010, 1, 1)
        self.SetCash(100000)
        self.last_day_close:float = 0
        self.symbol:Symbol = self.AddEquity('USO', Resolution.Minute).Symbol
        self.ret:float|None = None
        
    def OnData(self, data:Slice) -> None:
        if self.symbol in data and data[self.symbol]:
            # day close
            if self.Time.hour == 16 and self.Time.minute == 0:
                self.last_day_close = data[self.symbol].Value
            
            # rebalance
            elif self.Time.hour == 15 and self.Time.minute == 30:
                q:float = self.CalculateOrderQuantity(self.symbol, 1)
                
                if self.ret:
                    if self.ret > 0:
                        self.MarketOrder(self.symbol, q)
                        self.MarketOnCloseOrder(self.symbol, -q)
                    else:
                        self.MarketOrder(self.symbol, -q)
                        self.MarketOnCloseOrder(self.symbol, q)
                
                self.ret = None
            
            # day open - calculation
            elif self.Time.hour == 10 and self.Time.minute == 0:
                if self.last_day_close == 0: return
                
                price:float = data[self.symbol].Value
                self.ret = price / self.last_day_close - 1
                self.last_day_close = 0




发表评论

了解 Quant Buffet 的更多信息

立即订阅以继续阅读并访问完整档案。

继续阅读