Quant Buffet放轻松,别过度思虑

每日票房收入和股票总收益

登录后收藏

学术论文

Is it Time for Popcorn? Daily Box Office Earnings and Aggregate Stock Returns

作者Seda Oz; Steve Fortin

机构
  • CAUniversity of Waterloo
  • ?University of Waterloo - School of Accounting and Finance

策略概要

该策略使用CRSP等权重指数或标普500指数,并纳入来自Box Office Mojo的票房收益数据。每日票房收益增长(Changebox)计算为当季平均收益或前一周收益的百分比变化。实际上,Changebox计算为第d天和第d-7天的每日收益之差,除以第d-7天的收益。如果Changebox超过15%,则在第d天结束时做多;否则,做空。这种方法利用娱乐业的表现作为投资者情绪的代理,可能影响股票市场回报。

II. 策略合理性

票房收益是可自由支配消费的有效代理,反映了大量人口的消费习惯,2016年有71%的美国人去过电影院。该数据公开可用,并与GDP增长和可支配收入呈正相关,捕捉的是真实消费变化,而不是借入资金的变化。研究表明,票房收益也与行业投资组合回报呈正相关,排除了行业特定的偏差。然而,票房收益对股票回报的预测能力仅限于4天窗口,因此需要高换手率的投资策略,以利用由可自由支配支出趋势驱动的短期市场波动。

回测表现

索提诺比率-1.486
胜率31%

完整 Python 代码

from AlgorithmImports import *
#endregion
class DailyBoxOfficeEarningsandAggregateStockReturns(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2010, 1, 1)
self.SetCash(100000)

self.symbol = self.AddEquity("SPY", Resolution.Daily).Symbol

# Daily box data indexed by date.
self.daily_box_data = {}

# Import daily box data.
# Data source: https://www.boxofficemojo.com/daily/2020/?view=year
daily_box_string_data = self.Download('data.quantpedia.com/backtesting_data/economic/daily_box_earnings.csv')
lines = daily_box_string_data.split('\r\n')
for line in lines[1:]:
    split_line = line.split(';')
    date = datetime.strptime(split_line[0], "%Y-%m-%d").date()
    
    if split_line[5] == '-':
        weekly_change = None
    else:
        weekly_change = float(split_line[5])
    
    self.daily_box_data[date] = weekly_change

def OnData(self, data):
date_to_lookup = (self.Time - timedelta(days = 1)).date()

if date_to_lookup in self.daily_box_data:
    weekly_change = self.daily_box_data[date_to_lookup]
    if weekly_change:
        if weekly_change > 15:
            self.SetHoldings(self.symbol, 1)
        else:
            self.SetHoldings(self.symbol, -1)
else:
    self.Liquidate()