I made a killer trade in March putting a significant portion of my portfolio in Robinhood. It's up >70% since!
(My original $HOOD thesis I put out publicly 2 months ago is here if you're interested in reading: https://shorturl.at/FKddO)
A key question I had for myself was WHY Robinhood's stock has been killing it in the last ~60 days.
Am I lucky?
Was my thesis correct?
Were returns attributable to something else I didn't see?
Studying your own investment processes and track record is important so that you can replicate it again. I spent time this week to break down the 5 Fama-French factor returns of Robinhood:
- Market Risk (Rm-Rf): The excess return of the overall market portfolio over a risk-free rate, capturing the systematic risk inherent in the market.
- Size (SMB): The difference in return between portfolios of small-cap stocks and large-cap stocks. This factor captures the tendency for smaller companies to historically outperform larger ones.
- Value (HML): The difference in return between portfolios of high book-to-market ratio (value) stocks and low book-to-market ratio (growth) stocks. This factor reflects the historical observation that value stocks tend to outperform growth stocks.
- Profitability (RMW): The difference in return between portfolios of companies with robust operating profitability and those with weak profitability. Higher profitability is associated with higher expected returns.
- Investment (CMA): The difference in return between portfolios of companies that invest conservatively versus those that invest aggressively. Aggressive investment strategies are associated with lower expected returns.
I ONLY used AI coding tools and built a sexy interactive dashboard .... All of this project is done in Cursor with 0 lines of code written myself.
Here's our gameplan:
- Prompt for library setup
- Prompt for data ingestion
- Prompt for factor exposure calculation
- Prompt for rolling regression
- Prompt for attribution notebook
- Prompt for comps / peer comparison
- Prompt for sexy Streamlit dashboard
The Prompt:
Prompt for library setup
You are a top tier data scientist specializing in equities. Build a fresh project folder with this layout: .
├── data/
├── notebooks/
├── src/
└── requirements.txt
Create a Python venv in `.venv` and write a bash script `setup.sh` that:
1. Activates the venv
2. Installs pandas numpy scipy statsmodels yfinance pandas‑datareader matplotlib seaborn scikit‑learn jupyterlab Return `setup.sh` and `requirements.txt` contents only.
Prompt for data ingestion
Generate fetch_data.py that:
1. Accepts `start_date`, `end_date`, and `ticker` args (default ticker="HOOD").
2. Pulls daily adj close for the ticker using yfinance.
3. Downloads Fama‑French 5 factors + Momentum + Risk‑free rate from Ken French website via pandas‑datareader.
4. Saves two CSVs to `data/`: `hood_prices.csv`, `ff_factors.csv`. Include a `main()` that runs for 2019‑01‑01 through today.
Create 01_data_check.ipynb that:
1. Loads the two CSVs.
2. Plots ticker price and the six factor returns on two subplots. Return the full notebook JSON.
Prompt for factor exposure calculation
Write prep_returns.py that: 1. Loads hood_prices.csv and computes daily pct change. 2. Subtracts daily RF from the pct change. 3. Joins to factor dataframe, aligning on date. 4. Outputs hood_excess_and_factors.csv.
Prompt for rolling regression
Create rolling_ols.py that: 1. Loads hood_excess_and_factors.csv. 2. Runs 60‑day rolling OLS of HOOD excess return on the six factors using statsmodels. 3. Saves a CSV rolling_betas.csv with Date and betas.
Prompt for attribution notebook
Build 02_attribution.ipynb that: 1. Loads rolling_betas.csv and ff_factors.csv. 2. Multiplies daily factor returns by same‑day betas to estimate contribution. 3. Cumulatively sums each contribution. 4. Plots stacked area showing cumulative return vs contributions. Return notebook JSON.
Prompt for comps / peer comparison
Generate peer_compare.py that: 1. Accepts a list of tickers (default [“HOOD”,”SQ”,”COIN”,”IBKR”,”SOFI”]). 2. Pulls trailing twelve‑month Revenue CAGR, P/S, ROE, Beta via yfinance fundamentals. 3. Standardizes each metric to z‑scores, writes peer_style_table.csv.
Prompt for sexy Streamlit dashboard
Create app.py for Streamlit that: 1. Loads all CSV outputs. 2. Shows three tabs: Price & Factors, Rolling Betas, Attribution. 3. Adds a sidebar selector for look‑back window.
The Result
https://davidwang95-hood-factor-analysis-srcapp-eoihf3.streamlit.app/
Check out the interactive app above!
What's the conclusion?
- Rates tail-wind dominates. Almost all of March’s gain came from the rates factor. The brokerage’s net-interest revenue scaling with T-bill yields is doing the heavy lifting.
- Quality head-wind. The negative RMW slice shows investors still penalize HOOD for thin GAAP profitability.
- Market beta a drag. Broad equities slipped in mid-March, pulling the tiny Mkt-RF exposure slightly negative.
- Negative alpha. After stripping out factor moves, HOOD still under-performed by roughly 15 % of the total move, hinting at firm-specific concerns (e.g., regulatory noise, competitive worries).
- Rates proxy, not high-beta fintech. With β_RF ~ 0.20 and β_Mkt ~ 0.03, HOOD trades more like a floating-rate bond sleeve than a typical growth stock right now.
- Unprofitable-growth discount lingers. The negative RMW and HML betas confirm the market is still grouping HOOD with low-earnings, high-multiple names.
- Alpha still negative. Even after accounting for factors, the stock under-delivered. Management catalysts or earnings beats must offset that.
- Factor-level risk. If Treasury yields roll over, most of March’s positive attribution disappears. Portfolio hedges against a rate-cut scenario would help.
New Posts!
Here are some AI investing resources I put out last week: