
“该策略使用第一个和第十二个半小时的回报作为信号,通过ETF或期货在盘中建立多头、空头或中性头寸,并在收盘时清算所有头寸。”
资产类别: 差价合约、ETF、期货 | 地区: 全球 | 周期: 日内 | 市场: 股票 | 关键词: 动量
I. 策略概要
投资者使用第一个和第十二个半小时的回报作为市场择时信号。如果两个信号都为正,则在最后一个半小时建立多头头寸;如果两个信号都为负,则建立空头头寸。如果信号不同,投资者保持中性。头寸在收盘时清算,确保没有隔夜风险。该策略可以使用ETF或期货执行,利用日内市场择时来利用短期趋势,同时保持纪律严明的系统性方法。
II. 策略合理性
学术研究对这种效应提供了两种解释。首先,日内交易者可能在第一个半小时回报强劲后做空,预期价格反转。当他们在收盘前平仓时,一些人会等到最后一个半小时,从而影响价格走势。其次,知情交易者会在高交易量时期策略性地择时交易。阿德马蒂和普费德勒(1988)以及霍拉(2006)的理论表明,最优策略包括在交易日的开始和结束时进行快速交易,在交易日中期进行较慢的交易,这与交易量和信息动态一致。这两种行为都导致了特定日内时段内可预测的价格模式。
III. 来源论文
市场日内动量 [点击查看论文]
- 雷高,韩宇峰,李正子,周国富。乔治梅森大学。北卡罗来纳大学(UNC)夏洛特分校-金融。罗格斯大学,新泽西州立大学-罗格斯商学院纽瓦克和新布伦瑞克分校。圣路易斯华盛顿大学-约翰·M·奥林商学院。
<摘要>
基于1993年至2013年标普500 ETF的高频数据,我们记录了一种日内动量模式:自前一日收盘以来的市场第一个半小时的回报预测最后一个半小时的回报。这种可预测性在统计学和经济学上都非常显著,在波动性较大的日子、交易量较高的日子、衰退的日子以及重大宏观经济新闻发布的日子里更为强烈。这种日内动量也存在于其他十只交易最活跃的国内和国际ETF中。从理论上讲,日内动量不仅与博古斯拉夫斯基(2016)的投资组合不频繁再平衡模型一致,而且与在收盘附近交易滞后知情新闻的模型一致。


IV. 回测表现
| 年化回报 | 4.39% |
| 波动率 | 4.49% |
| β值 | 0.001 |
| 夏普比率 | 0.98 |
| 索提诺比率 | -0.592 |
| 最大回撤 | N/A |
| 胜率 | 48% |
V. 完整的 Python 代码
from AlgorithmImports import *
class IntradayMomentumEquities(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2000, 1, 1)
self.SetCash(100000)
self.symbol = self.AddEquity("SPY", Resolution.Minute).Symbol
self.Schedule.On(self.DateRules.EveryDay(self.symbol), self.TimeRules.BeforeMarketClose(self.symbol, 30), self.Rebalance)
self.Schedule.On(self.DateRules.EveryDay(self.symbol), self.TimeRules.BeforeMarketClose(self.symbol, 1), self.MarketClose)
def Rebalance(self):
day_history = self.History([self.symbol], 12*30, Resolution.Minute)
if len(day_history) == 12*30 and 'close' in day_history:
first_half_hour = day_history['close'][:30]
first_half_hour_ret = self.Return(first_half_hour)
twelfth_half_hour = day_history['close'][-30:]
twelfth_half_hour_ret = self.Return(twelfth_half_hour)
if first_half_hour_ret > 0 and twelfth_half_hour_ret > 0:
self.SetHoldings(self.symbol, 1)
elif first_half_hour_ret < 0 and twelfth_half_hour_ret < 0:
self.SetHoldings(self.symbol, -1)
def MarketClose(self):
self.Liquidate()
def Return(self, history):
return (history[-1] - history[0]) / history[0]