该策略在每日收盘时买入SPY ETF,并在次日开盘时卖出,但由于滑点和费用的影响,更适合作为高级策略的输入或交易执行优化工具使用。

策略概述

该策略是在每日收盘时买入SPY ETF,并在次日开盘时卖出。尽管该策略交易频繁,易受滑点和费用的影响,但更适合用作高级策略的输入或交易执行工具,以优化进出场点位。

经济基础

这种异常现象可能源于公司在非交易时段发布正面财报超预期的现象,自20世纪90年代中期开始逐渐显现。学术研究表明,高开盘价通常由市场订单的积累推动,并在开盘后一小时内逐渐回落。尽管流动性溢价可能部分解释隔夜收益的正向回报,但它仅能解释夜间与日间收益差异的一小部分。

论文来源

Return Differences between Trading and Non-Trading Hours: Like Night and Day [点击浏览原文]

<摘要>

我们利用逐笔交易数据,将美国股权溢价分解为日间(开盘至收盘)和夜间(收盘至开盘)回报。研究揭示了一个显著的现象:过去十年的美国股权溢价完全来自隔夜回报;夜间回报显著为正,而日间回报接近于零,有时甚至为负。这种昼夜效应不仅适用于个股,也适用于股指和股指期货合约,并在NYSE和Nasdaq交易所中具有一致性。夜间回报在一周中的任何一天、每月的不同日期以及一年中的每个月均高于日间回报。这种现象部分由高开盘价驱动,随后在开盘后一小时内逐渐下降。

回测表现

年化收益率14%
波动率N/A
Beta0.341
夏普比率N/A
索提诺比率0.369
最大回撤N/A
胜率55%

完整python代码

from AlgorithmImports import *
#endregion
class OvernightAnomaly(QCAlgorithm):
    def initialize(self):
        self.set_start_date(1998, 1, 2)
        self.set_cash(100_000)
        
        data: Equity = self.add_equity("SPY", Resolution.MINUTE)
        data.SetFeeModel(CustomFeeModel())
        self.symbol: Symbol = data.Symbol
        
        # NOTE: MarketOnClose orders must be placed with at least a 16 minute buffer before market close.
        self.schedule.on(self.date_rules.every_day(self.symbol), self.time_rules.before_market_close(self.symbol, 16), self.day_close)
    def day_close(self) -> None:
        if not self.portfolio.invested:
            q: int = self.portfolio.total_portfolio_value // self.securities[self.symbol].price
            self.market_on_close_order(self.symbol, q)
            self.market_on_open_order(self.symbol, -q)
# Custom fee model (trading strategy is backtested without transaction costs to show a theoretical potential of overnight factor)
class CustomFeeModel(FeeModel):
    def get_order_fee(self, parameters):
        fee = parameters.security.price * parameters.order.absolute_quantity * 0
        return OrderFee(CashAmount(fee, "USD"))

Leave a Reply

Discover more from Quant Buffet

Subscribe now to keep reading and get access to the full archive.

Continue reading