
“该策略基于全职与兼职就业增长率之间的比较,在SPY(标普500 ETF)和IEF(10年期美国国债ETF)之间进行切换。每月重新平衡投资组合,以通过劳动力市场趋势捕捉经济变化。”
资产类别:差价合约(CFDs)、ETF、基金、期货 | 地域:美国 | 频率:每月 | 市场:债券、股票 | 关键词:择时、就业
I. 策略概述
该策略基于就业数据在SPY(标普500 ETF)和IEF(10年期美国国债ETF)之间切换。比较全职与兼职就业的年度增长率:若全职就业增长率高于兼职就业增长率,则投资于SPY(股票);否则,投资于IEF(债券)。投资组合按月重新平衡,但根据投资者偏好,也可调整为更高频率(如每周)。该方法通过劳动力市场趋势在股票和债券间分配资产,旨在捕捉经济动能并根据劳动结构变化调整敞口。
II. 策略合理性
该策略重点在于预测经济活动放缓,而非仅预测经济衰退,依赖多样化的就业数据来识别可靠模式。通过分析大规模数据集并将其归一化为相同尺度处理,能够产生显著且可操作的结果,这种方法优于依赖单一指标(如失业率)。与市场衍生指标不同,宏观经济数据无法直接交易或被套利,因此提供了稳定的洞察力。相比之下,股票价格波动性更高,容易受到非经济因素的影响。简单模型(如两个变量的差异)往往优于复杂的多变量条件。自1956年以来,美国国家经济研究局命名的每一次经济衰退都能通过此方法提前识别。
III. 论文来源
Easy and Successful Macroeconomic Timing [点击浏览原文]
- Rafter
<摘要>
当经济恶化时,就业会下降,对吧?但并非所有类型的就业都会下降。在经济衰退期间,全职就业确实会下降,但与此同时,兼职就业会大幅增加。熟练的受托人可以对比这两种就业类型以及其他多种数据,以在官方宣布经济衰退之前做出广泛的投资择时决策。使用描述的方法可以显著减少回撤,并大幅提高风险回报比。这种方法既可以作为买入并持有策略的独立改进措施,也可以作为进行其他基本面或技术分析前的初步筛选工具。决策频率可以是每月、每周甚至每日,适应愿意投入更多精力的投资者。

IV. 回测表现
| 年化收益率 | 11.38% |
| 波动率 | 11.05% |
| Beta | 0.326 |
| 夏普比率 | 1.03 |
| 索提诺比率 | N/A |
| 最大回撤 | -16.22% |
| 胜率 | 53% |
V. 完整python代码
import pandas as pd
class Full_Partial_Employment(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2005, 1, 1)
self.SetEndDate(2019, 7, 1)
self.SetCash(100000)
self.employment_data = pd.read_csv('https://docs.google.com/spreadsheets/d/1P0E8_ZUAm1NhqaMB1PK1Bc5uB2wL3f6W/export?format=csv', dtype={'date':str}, index_col='date') # header=None)
symbols = ['SPY', 'IEF']
for symbol in symbols:
self.AddEquity(symbol, Resolution.Daily)
self.Schedule.On(self.DateRules.MonthStart(symbols[0]), self.TimeRules.AfterMarketOpen(symbols[0]), self.Rebalance)
def Rebalance(self):
date = str(self.Time.month) + '/' + str(self.Time.year)
current_row_index = self.employment_data.index.get_loc(date)
#one month lag due to employment data reporting
this_month = self.employment_data.iloc[current_row_index-1]
last_month = self.employment_data.iloc[current_row_index-2]
full_time_diff = this_month['full_time'] - last_month['full_time']
part_time_diff = this_month['part_time'] - last_month['part_time']
if full_time_diff > part_time_diff:
if not self.Portfolio['SPY'].Invested:
self.Liquidate('IEF')
self.SetHoldings('SPY', 1)
else:
if not self.Portfolio['IEF'].Invested:
self.Liquidate('SPY')
self.SetHoldings('IEF