
“该策略在美国大选前五天买入标准普尔500指数,并持有至选举日收盘,对国会选举和总统选举一视同仁,以利用选举期间的市场行为。”
资产类别: 差价合约、ETFs、基金、期货 | 地区: 美国 | 周期: 每日 | 市场: 股票 | 关键词: 选举
I. 策略概要
该策略涉及在美国大选前五天收盘时买入标准普尔500指数(通过ETF、差价合约等),并持有至选举日收盘。美国举行两种类型的联邦选举:每偶数年的国会选举和每四年一次的总统选举。该策略对这两种事件一视同仁。根据美国法律,选举日定为11月第一个星期一之后的星期二,这意味着它总是在每偶数年的11月2日至8日之间。这种简单的交易方法利用了选举期间的历史市场行为。
II. 策略合理性
在美国大选前五天买入标准普尔500指数并持有至选举日收盘的策略是基于一个观察到的异常现象,该现象带来了显著的回报。从1950年到2018年,在35个选举期间,该策略的平均表现范围从-2.47%到10.79%。这种波动性并非美国独有;其他发达国家也观察到类似的模式。Białkowski、Gottschalk和Wisniewski在其论文《国家选举期间的股市波动》中分析了经合组织国家选举期间的股市波动,进一步证实了这一现象的重要性。
III. 来源论文
Pre-Election Drift in the Stock market [点击查看论文]
- 拉多万·沃伊特科(Radovan Vojtko)、多米尼克·西萨尔(Dominik Cisár)
<摘要>
选举这样的特定事件制造了大量噪音,不仅在我们的日常生活中,我们应该参与并投票给我们偏好的候选人/政党。这个过程也影响着金融市场。选举结果带来的不确定性会影响金融市场的波动性,这种波动性很容易翻倍。在本文中,我们只关注一个特定的市场,我们试图寻找任何可以通过构建投资策略来获利的模式。通过分析美国股市,那里的选举每偶数年都在确切的日期举行,我们发现在选举前几天存在一个特定的模式。这种积极的漂移从选举日前第五天开始,并在选举日结束时结束,平均表现接近2.5%。这种选举前模式的另一个优势是它独立于选举结果,即使它与选举相关。过去几年,由于政治原因导致的不确定性增加,选举期间的市场波动更大,这种不确定性如今并未消退。因此,无论选举结果如何,选举前时期都可能更有利可图。


IV. 回测表现
| 年化回报 | 2.46% |
| 波动率 | N/A |
| β值 | 0.023 |
| 夏普比率 | N/A |
| 索提诺比率 | -0.133 |
| 最大回撤 | N/A |
| 胜率 | 62% |
V. 完整的 Python 代码
from pandas.tseries.offsets import BDay
from AlgorithmImports import *
from dateutil.relativedelta import relativedelta, MO
class PreElectionDriftStockMarket(QCAlgorithm):
def initialize(self) -> None:
self.set_start_date(2000, 1, 1)
self.set_cash(100_000)
self.symbol: Symbol = self.add_equity("SPY", Resolution.MINUTE).symbol
def on_data(self, data: Slice) -> None:
if self.time.year % 2 == 0:
election_day: datetime.date = ((date(self.time.year, 11, 1) + relativedelta(weekday=MO(1))) + BDay(1)).date()
# This condition make sure, that we invest into market six business days before election day
# and position will be open right after hurricane Sandy, when market is open.
if self.time.date() >= (election_day - BDay(6)).date() and self.time.date() < election_day and not self.portfolio[self.symbol].invested:
self.set_holdings(self.symbol, 1)
# Liquidate.
elif self.time.date() == election_day:
if self.portfolio[self.symbol].invested:
self.liquidate(self.symbol)