Holding Period Effects in Dividend Strip Returns#
Last updated: Mar 16, 2026, 12:42:47โฏAM
Table of Contents#
Pipeline Charts ๐
Pipeline Dataframes ๐
- Dataframe:
P04:all_strip_prices- - Dataframe:
P04:clean_crsp_sp500_monthly- - Dataframe:
P04:clean_options- - Dataframe:
P04:clean_rates- - Dataframe:
P04:clean_zero_curve- - Dataframe:
P04:crsp_sp500_daily- - Dataframe:
P04:crsp_treasury_returns- - Dataframe:
P04:fama_french_factors- - Dataframe:
P04:fama_french_monthly- - Dataframe:
P04:fred_treasury_rates- - Dataframe:
P04:implied_rates- - Dataframe:
P04:implied_rates_1y- - Dataframe:
P04:monthly_returns- - Dataframe:
P04:optionmetrics_spx_monthly- - Dataframe:
P04:optionmetrics_spx_raw- - Dataframe:
P04:optionmetrics_zero_curve- - Dataframe:
P04:strip_prices- - Dataframe:
P04:zero_curve_1y-
Pipeline Specs#
Pipeline Name |
Holding Period Effects in Dividend Strip Returns |
|---|---|
Pipeline ID |
|
Lead Pipeline Developer |
Jie Lin and Zimeng Yi |
Contributors |
Jie Lin, Zimeng Yi |
Git Repo URL |
|
Pipeline Web Page |
|
Date of Last Code Update |
2026-03-16 00:21:10 |
OS Compatibility |
|
Linked Dataframes |
P04:crsp_sp500_daily |
About this project#
This repository contains our final project for FINM 32900 at the University of Chicago.
We replicate key empirical results from:
Golez, Benjamin, and Jens Jackwerth.
Holding Period Effects in Dividend Strip Returns.
Review of Financial Studies 37, no. 10 (2024): 3188โ3215.
Our assigned project is P04. Holding Period Effects in Dividend Strip Returns.
Using an end-to-end reproducible analytical pipeline, we replicate and extend the following objects from the paper:
Figure 1: 12-month interest rates
Figure 2: cumulative returns
Figure 3: annualized volatility across holding periods
Table 1: monthly return summary statistics
We also extend these results through the most recent available sample in our pipeline (through 2024).
This project is formatted using the cookiecutter chartbook template and automated using PyDoit.
Team responsibilities#
Both group members contributed to understanding the paper, designing the pipeline, validating results, and preparing the final report. Primary responsibilities were divided as follows.
Jie Lin#
Built and tested major parts of the automated data and calculation pipeline
Worked on strip return construction and diagnostics
Implemented Figure 2 replication and extensions
Implemented Figure 3 replication and extensions
Integrated figures and tables into the LaTeX report
Helped test end-to-end reproducibility with PyDoit
Zimeng Yi#
Worked on Figure 1 replication and extensions
Worked on Table 1 replication and extensions
Helped validate intermediate outputs and summary statistics
Contributed to the report writeup and empirical interpretation
Assisted with GitHub workflow, project organization, and debugging
Replication goals#
The paper studies dividend strip prices inferred from S&P 500 index options and emphasizes the importance of using option-implied interest rates rather than exogenous zero-curve rates. Our project reproduces the paperโs main empirical objects and then re-runs the same calculations on an updated sample.
Our replication pipeline performs the following steps:
Pull raw data from WRDS, FRED, and the Fama-French Data Library
Clean the raw data into tidy intermediate datasets
Estimate option-implied interest rates
Construct dividend strip prices using put-call parity
Build monthly strip and market return panels
Generate final figures, tables, and the LaTeX report
Quick start#
1. Install LaTeX#
You must have TeX Live (or another LaTeX distribution) installed and available in your path.
Installers:
2. Create and activate a virtual environment#
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
3. Install dependencies#
pip install -r requirements.txt
4. Create a .env file#
Copy .env.example into a new file called .env in the project root:
cp .env.example .env
Then edit .env with your own settings. A typical file looks like:
WRDS_USERNAME=your_wrds_username
START_DATE=1996-01-01
END_DATE=2025-12-31
5. Run the full pipeline#
doit all
This executes the project end-to-end: raw data pulls โ cleaning โ intermediate calculations โ figure and table generation.
6. List available tasks#
doit list
Main PyDoit tasks#
Task |
Description |
|---|---|
|
Pull daily S&P 500 index data from CRSP |
|
Pull monthly Treasury returns from CRSP |
|
Pull Treasury rates and Fama-French factors |
|
Pull SPX options and zero curve from OptionMetrics |
|
Clean and standardize all raw data |
|
Estimate option-implied interest rates |
|
Construct dividend strip prices |
|
Build monthly return panel |
|
Replicate Figure 1 |
|
Extend Figure 1 through 2024 |
|
Replicate Figure 2 |
|
Extend Figure 2 through 2024 |
|
Robustness version of extended Figure 2 |
|
Replicate Figure 3 |
|
Extend Figure 3 through 2024 |
|
Replicate Table 1 |
|
Extend Table 1 through 2024 |
|
Run the full pipeline end-to-end |
Data sources#
Source |
Content |
|---|---|
OptionMetrics via WRDS |
European SPX options; zero-coupon curve |
CRSP via WRDS |
Daily S&P 500 index data; monthly Treasury bond returns |
FRED |
Treasury constant maturity rates |
Kenneth French Data Library |
Daily and monthly Fama-French factors; 1-month risk-free rate |
Directory structure#
src/ Python scripts for pulling, cleaning, calculating, and plotting
_data/ Raw, cleaned, and intermediate parquet files (not tracked in Git)
_data/calc/ Derived datasets (implied rates, strip prices, monthly returns)
output/ Generated figures and tables
reports/ LaTeX report source files
assets/ Static files not generated automatically
Why _data/ is not tracked in Git#
Most files in _data/ are either automatically reproducible by rerunning the pipeline, or they come from licensed academic databases (WRDS) and cannot be redistributed.
Naming conventions#
Prefix |
Purpose |
|---|---|
|
Pull raw data from an external source |
|
Clean and standardize raw data |
|
Compute derived datasets |
|
Generate final output figures and tables |
Notebook tour#
The project includes notebooks that provide a tour of the cleaned data and selected parts of the analysis logic. These notebooks help the reader understand the structure of the data, how the paperโs methodology is implemented, and how key replication objects were validated before scripting.
The final official outputs are generated by the Python scripts and the PyDoit pipeline, not by manual notebook execution.
Unit tests#
This project uses unit tests to validate key intermediate logic and replicated values, including checks on Figure 1 summary statistics, Table 1 values, Figure 2 terminal values, and Figure 3 holding-period volatility values.
pytest # Run all tests
pytest --doctest-modules # Include doctests
Setting environment variables#
If you want to export your .env variables into your shell session:
Linux / Mac:
set -a
source .env
set +a
Windows (PowerShell):
Get-Content .env | ForEach-Object {
if ($_ -match '^([^=]+)=(.*)$') {
[Environment]::SetEnvironmentVariable($matches[1], $matches[2], 'Process')
}
}
Code formatting#
This project uses Ruff for linting and formatting:
ruff check . --fix
ruff format .
Notes on data limitations#
The original paper uses intraday CBOE data for part of the sample. Our replication uses WRDS-accessed OptionMetrics end-of-day data, which leads to some remaining quantitative differences, especially in strip return statistics:
Figure 1 is replicated closely
Market return results are generally close to the paper
Strip return results are directionally and qualitatively similar, but can differ more in magnitude
Post-2022 strip extensions become less stable and should be interpreted cautiously
These issues are discussed in detail in the report.
Repository hygiene#
This repository does not contain:
Copyrighted raw data
API keys or private credentials
Committed
.envfiles
Use .env.example as the template for your local .env file.