
“该策略交易高收益CDS指数CDX.NA.HY,根据FOMC日程每周重新平衡,在奇数周开立空头头寸,在偶数周开立多头头寸。”
资产类别: CDS | 地区: 美国 | 周期: 每周 | 市场: 债券 | 关键词: 特质、FOMC周期、信用风险
I. 策略概要
该研究考察了高收益CDS指数CDX.NA.HY,使用来自Markit的数据和美联储的FOMC会议日程。头寸的开立基于FOMC周期,从预定的FOMC公告前一天开始。对于为期两天的会议,第二天是公告日。投资组合每周重新平衡:在第1周和每个奇数周开立空头头寸,而在偶数周开立多头头寸。该策略将交易决策与FOMC会议日程对齐,并遵循系统的再平衡方法。
II. 策略合理性
该研究与Cieslak、Morse和Vissing-Jorgensen(2019)的研究一致,表明股票回报和CDS指数回报遵循双周FOMC周期模式。FOMC会议和偶数周的理事会会议降低了宏观经济不确定性,从而降低了股票风险溢价并增加了CDS指数回报。偶数周通常会出现联邦基金期货利率下降,这预示着意想不到的宽松消息。当《华尔街日报》戴维·韦塞尔的文章中包含“美联储理事会”或“FOMC”等词语时,回报率显著更高。此外,在股票表现不差的偶数周,CDS指数回报率更高,尤其是在美联储货币政策令CDS市场感到意外时。
III. 来源论文
Does the FOMC Cycle Affect Credit Risk? [点击查看论文]
- 黄迪芳、李宇斌、王新杰、钟兆东。蒙纳士大学,哈尔滨工业大学(深圳),南方科技大学,罗格斯大学
<摘要>
本文研究了联邦公开市场委员会(FOMC)周期中CDS指数的回报。我们记录到,在FOMC周期的偶数周,CDS回报显著高于奇数周。CDS市场的双周模式并非仅仅是股票市场模式的反映。基于双周模式的简单交易策略产生了8.8%的年超额回报。这种模式与美联储内部理事会会议的双周日程对宏观经济不确定性的解决有关。我们提供了进一步的证据,表明美联储通过意外信息信号和货币政策影响CDS市场,从而导致风险溢价的降低。


IV. 回测表现
| 年化回报 | 8.89% |
| 波动率 | 14.87% |
| β值 | 0.039 |
| 夏普比率 | 0.6 |
| 索提诺比率 | -0.364 |
| 最大回撤 | N/A |
| 胜率 | 43% |
V. 完整的 Python 代码
from AlgorithmImports import *
class FOMCCycleAndCreditRisk(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2012, 1, 1) # HYG price is causing margin call in 2011.
self.SetCash(100000)
self.weights = { "HYG" : 1, 'IEI' : -0.5, 'SHY': -0.5 }
for symbol in self.weights:
data = self.AddEquity(symbol, Resolution.Minute)
data.SetLeverage(5) # leverage can be set according to the strategy
csv_string_file = self.Download('data.quantpedia.com/backtesting_data/economic/fed_days.csv')
dates = csv_string_file.split('\r\n')
dates_before_fed = [datetime.strptime(x, "%Y-%m-%d") for x in dates]
self.trade_flag = False
self.days_to_switch_positions = 5
symbol = [x for x in self.weights.keys()][0]
self.Schedule.On(self.DateRules.On(dates_before_fed), self.TimeRules.AfterMarketOpen(symbol, 1), self.FEDDays)
self.Schedule.On(self.DateRules.EveryDay(symbol), self.TimeRules.AfterMarketOpen(symbol, 1), self.Rebalance)
# At FED day go +1.0HYG - 0.5xIEI - 0.5xSHY
def FEDDays(self):
# At first liquidate portfolio on FED days
self.Liquidate()
self.FedDaysAndOddWeeksInvestment()
self.days_to_switch_positions = 5
self.trade_flag = True
# every odd week go +1.0xHYG - 0.5xIEI - 0.5xSHY
# every even week go -1.0xHYG + 0.5xIEI + 0.5xSHY
def Rebalance(self):
if self.trade_flag:
if self.days_to_switch_positions == 0:
if self.Portfolio["HYG"].IsLong:
self.FedDaysAndEvenWeeksInvestment()
else:
self.FedDaysAndOddWeeksInvestment()
self.days_to_switch_positions = 5
self.days_to_switch_positions -= 1
def FedDaysAndOddWeeksInvestment(self):
for symbol, weight in self.weights.items():
if self.Securities[symbol].Price != 0:
self.SetHoldings(symbol, weight)
def FedDaysAndEvenWeeksInvestment(self):
for symbol, weight in self.weights.items():
if self.Securities[symbol].Price != 0:
self.SetHoldings(symbol, -weight)