Homework 4#
Due Date: Sunday, August 23, 2026 at 11:59 PM CT
Link to Assignment: HW 4: https://classroom.github.com/a/ATHvtNp-
Note
Homework 4 has been reworked. An earlier version of this assignment was an options case study; that assignment has been retired, and the options notebooks remain class material in Week 7. Homework 4 is now a short, focused assignment: deploy a live, self-updating clone of the CME FedWatch tool.
Overview#
Homework 4 turns the in-class FedWatch case study (finm-32900/case_study_fedwatch) into a live monitor. The pipeline pulls 30-Day Fed Funds futures (ZQ) from Databento and the effective federal funds rate (EFFR) from FRED, computes the market-implied probability of a hike, cut, or no change at the next FOMC meeting, and renders the forecast chart into a chartbook site. You will (1) fill in the small amount of math that has been removed and (2) publish the site so that a GitHub Action rebuilds it every morning, unattended.
The two class notebooks from Week 8 walk through everything the pipeline does:
This assignment is the Week 8 material—GitHub Actions, cron scheduling, and GitHub Pages—put into practice. It is also the course’s themes in miniature: a reproducible analytical pipeline that runs end-to-end with no human in the loop, from raw data pull to published product.
Learning Outcomes#
Schedule recurring jobs with cron in GitHub Actions
Publish a static site with GitHub Pages
Manage API keys with Actions repository secrets (in CI) and
.envfiles (locally)Run a full
doitpipeline unattended in CIUnderstand how fed funds futures prices imply FOMC meeting-outcome probabilities
What You Do#
The assignment repository’s README spells out every step; in brief:
Task 1: Fill in the FedWatch math (1 point)#
Three functions in src/fedwatch.py have had their bodies replaced with
raise NotImplementedError(...): implied_rate, solve_post_meeting_rate,
and move_probability. Each docstring specifies exactly what the function
must do, and the replication notebook
derives the same formulas step by step.
Your feedback loop runs offline, with no API key:
pytest -vv ./src/test_fedwatch.py ./src/test_fedwatch_monitor.py
Once those tests pass, run the full pipeline locally: copy .env.example to
.env, add your Databento API key (the pull is cost-guarded and free), and
run doit. The built site lands in docs/index.html.
Task 2: Deploy your daily self-updating site (2 points)#
The workflow in .github/workflows/deploy_pages.yml rebuilds the pipeline and
publishes the chartbook site to GitHub Pages—on every push to main and on a
daily cron (14:30 UTC, mid-morning Chicago, after the NY Fed’s ~9 AM ET EFFR
print). You will:
Push your completed pipeline to a new public repo under your personal GitHub account (the assignment repo itself stays private).
Add your
DATABENTO_API_KEYas an Actions repository secret—never commit it in code.Run the workflow once by hand and watch it go green: it pulls the data, executes the notebooks, renders the forecast chart, builds the site, runs the tests, and pushes the result to the
gh-pagesbranch.Enable GitHub Pages on
gh-pagesand confirm your site is live athttps://<you>.github.io/<repo>/.Back in the assignment repo, record your attestation: set the flag to
Trueand paste your live site URL insrc/monitor_self_attestation.py, then commit and push.
From then on, the cron refreshes your forecast every morning with no action from you. I will visit the URL you provide and check that the site is live and current.
Grading#
3 points total, autograded on every push by GitHub Actions:
Component |
Points |
|---|---|
FedWatch math tests pass (Task 1) |
1 |
Monitor attestation: flag set (Task 2) |
1 |
Monitor attestation: live site URL provided (Task 2) |
1 |
I will spot-check the attested URLs to confirm the sites are live and updating on schedule.
Warnings#
The assignment repo must stay private—it is your graded work. Your separate deploy repo will be public, including your completed Task 1 code; that is intended for this assignment.
Your API key goes into
.envlocally and into the Actions secret in CI. If it ends up in a commit anywhere, revoke it and generate a new one.Do not edit the test files (
test_*.py).