Introduction
The asset growth effect is based upon the reasoning that high asset growth stocks underperform stocks with low asset growth. Some papers suggest that the return premium achieved by low asset growth stocks is consistent with the compensation for risk. There are two popular arguments to suggest this return premium. One arguments is that as firms grow, the asset mix of the firm becomes less risky as assets-in-place displace the value of assets the firm's expected to invest in the future. The second argument is that there is a systematic market mispricing of growing businesses due to the extrapolation of past gains to growth for high asset growth companies.
This strategy will take a long position in low asset growth companies, and a short position in high asset growth accompanies. It is important to note that this strategy requires fundamental data from the current and past year to perform its analysis.
Method
The first step is coarse and fine universe selection. Using coarse selection, we create an investment universe with all non-financial U.S. stocks listed on NYSE, AMEX, and NASDAQ that contain fundamental data. The universes will be saved so that we can perform analysis on the annual changes of the total assets in the following year.
+ Expand
def coarse_selection_function(self, coarse):
if self.yearly_rebalance:
filtered_coarse = [x.symbol for x in coarse if (x.has_fundamental_data)
and (x.market == "usa")]
return filtered_coarse
else:
return []
def fine_selection_function(self, fine):
if self.yearly_rebalance:
fine = [x for x in fine if x.financial_statements.balance_sheet.total_assets.value > 0
and ((x.security_reference.exchange_id == "NYS") or (x.security_reference.exchange_id == "NAS") or (x.security_reference.exchange_id == "ASE"))
and (x.company_reference.industry_template_code!="B")
and (x.company_reference.industry_template_code!="I")]
if not self.previous_fine:
self.previous_fine = fine
self.yearly_rebalance = False
return []
else:
self.filtered_fine = self.calculate(fine,self.previous_fine)
sorted_filter = sorted(self.filtered_fine, key=lambda x: x.delta_assets)
self.filtered_fine = [i.symbol for i in sorted_filter]
self.previous_fine = fine
return self.filtered_fine
else:
return []
During fine universe selection we take the stocks from the previous and current year and calculate their total asset growth. The stocks are then sorted in ascending order based upon the implemented calculation. Note that we account for size difference across the sample firms by scaling the growth by last year's total assets.
def calculate(self, current, previous):
growth = []
for stock_data in current:
try:
prev_data = None
for x in previous:
if x.symbol == stock_data.symbol:
prev_data = x
break
stock_data.delta_assets = (float(stock_data.financial_statements.balance_sheet.total_assets.value)-float(prev_data.financial_statements.balance_sheet.total_assets.value))/float(prev_data.financial_statements.balance_sheet.total_assets.value)
growth.append(stock_data)
except:
pass
return growth
In OnData()
, we short top decile of the stocks in the sorted list and long the bottom decile of stocks. The portfolio is rebalanced every year at the end of June.
Derek Melchin
See the attached backtest for an updated version of the algorithm with the following changes:
The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by QuantConnect. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. QuantConnect makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances. All investments involve risk, including loss of principal. You should consult with an investment professional before making any investment decisions.
To unlock posting to the community forums please complete at least 30% of Boot Camp.
You can continue your Boot Camp training progress from the terminal. We hope to see you in the community soon!