We propose a measure of corporate investment plans, namely, the expected investment growth (EIG). We document a robust finding that firms with high EIG have larger future investment growth and earn significantly higher returns than firms with low EIG, which cannot be fully explained by leading factor models. Further analyses reveal that EIG is closely related to distress risk, especially at short-run horizons up to one year. Detailed comparisons with traditional distress risk measures highlight the distinction between the short-run and long-run horizons in reconciling the opposite signs of distress premium documented in the literature.
Keywords: Expected investment growth, cross-sectional stock returns, financial distress
- Focus on stocks within the S&P 500
- On a monthly basis, determine the EIG factor
- Use a cross-sectional regression that predicts investment growth
- Set EIG as the target variable
- Utilize momentum, cash flow, and market value (q) as predictors
- For precise EIG calculation, refresh data every month
- Organize stocks into ten groups according to EIG values
- Group 1: Stocks with the lowest EIG
- Group 10: Stocks with the highest EIG
- Construct a portfolio by adopting a long position on stocks in Group 10 and a short position on stocks in Group 1
- Equally weighted across stocks.
- Every month, reset the portfolio.
import backtrader as bt import pandas as pd import numpy as np class EIGStrategy(bt.Strategy): params = dict( rebalance_period=21 ) def __init__(self): self.month_counter = 0 def next(self): # Rebalance monthly self.month_counter += 1 if self.month_counter % self.params.rebalance_period != 0: return # Compute EIG factor for all stocks eig_factors =  for stock in self.getdatanames(): data = self.getdatabyname(stock) eig = self.compute_eig(data) eig_factors.append((stock, eig)) # Sort stocks into deciles based on EIG sorted_stocks = sorted(eig_factors, key=lambda x: x) decile_size = len(sorted_stocks) // 10 # Get decile 1 and decile 10 stocks decile_1_stocks = sorted_stocks[:decile_size] decile_10_stocks = sorted_stocks[-decile_size:] # Allocate equal weights to long and short positions weight = 1.0 / (2 * decile_size) # Short decile 1 stocks for stock, eig in decile_1_stocks: data = self.getdatabyname(stock) self.order_target_percent(data, -weight) # Long decile 10 stocks for stock, eig in decile_10_stocks: data = self.getdatabyname(stock) self.order_target_percent(data, weight) def compute_eig(self, data): # Implement the EIG factor calculation using the formula on page 6 # This may require additional data such as momentum, cash flow, and market value (q) # You might need to add these data feeds to your backtest setup pass cerebro = bt.Cerebro() # Add the S&P 500 stocks data feeds and any other required data feeds to the cerebro instance cerebro.addstrategy(EIGStrategy) results = cerebro.run()
Please note that you’ll need to implement the
compute_eig method using the formula on page 6, and add the necessary data feeds (momentum, cash flow, and market value (q)) to your backtest setup.