I'm sure you've heard about Circle's IPO - how did the bankers price it at $31 and it's trading >$100 on the second day of trading?
Luckily, we can use Cursor to run a DCF analysis and comps of its multiples vs peers (via no-code Python).
I did this analysis pre-IPO via the S1 (IPO offering docs) few days before CRCL went public to back solve the banker assumptions.
Here's how it works:
Create a table of assumptions
Run the Python script (via Cursor) to output a comps table + scenario analysis based on interest rates
The Prompt
I created a few assumptions on interest rate sensitivity and USDC float to create a valuation scenario. I tried to backsolve the base case to roughly ~$31 to see what the assumptions would be in order to get to that valuation.
We'll run two things: (1) Bull/Base/Bear intrinsic valuation with emphasis on interest rate sensitivity (2) EV/Rev & EV/EBITDA vs fintech and crypto comps
First, let's create a file with assumptions. These assumptions below are quick and dirty to guesstimate how the shares are being priced.
——————————————————————–
# GLOBAL SETTINGS # ——————————————————————– projection_years: 3 # length of model
Next, let's use the below in Cursor to build our dashboards:
# Cursor Prompt """ Objective ▸ Build a valuation dashboard that (1) re-values Circle under bull / base / bear scenarios and (2) compares its EV-to-Revenue and EV-to-EBITDA multiples against listed comps in one clean image. Packages ▸ pandas, yfinance, requests_cache (for rate-limiting), matplotlib (no seaborn). ------------------------------------------------ DATA PIPELINE ------------------------------------------------ 1. Read `valuation_config.yaml` that holds: - bull / base / bear growth for USDC float - fee take-rate - Fed-funds path assumptions - target exit multiples (EV/Rev, EV/EBITDA). 2. **valuation_model(config) → dict** Return EV, implied share price and 3-yr IRR for each scenario. • Use discounted-cash-flow on Reserve-Income + Transaction-Fees. • Discount rate = 12 % in base, +200 bp/-200 bp for bear/bull. ------------------------------------------------ COMPS PULL ------------------------------------------------ 3. Build `pull_comp_data(tickers)` that: • Instantiates `yf.Ticker(tkr)` for each code. • Caches with `requests_cache.install_cache("yf_cache")`. • Extracts: price = info["regularMarketPrice"] shares_out = info["sharesOutstanding"] market_cap = price * shares_out net_debt = info["totalDebt"] - info["cash"] revenue_fwd = info["targetMeanRevenue"] # fallback → TTM ebitda_fwd = info.get("ebitda", None) • Calculates EV = market_cap + net_debt. • Returns a DataFrame with EV/Revenue_fwd and EV/EBITDA_fwd. • Tick-set: ["COIN", "PYPL", "HOOD", "MA", "SQ", "V"]. # edit freely 4. Append Circle’s own EV from `valuation_model(base)` plus its projected 2025 Revenue & EBITDA to the same frame for side-by-side comparison. ------------------------------------------------ VISUALS ------------------------------------------------ 5. **Chart 1 — “Circle vs Peers — EV/Revenue & EV/EBITDA”** • Two-panel bar plot: left = EV/Rev, right = EV/EBITDA. • Save to `output/fig_multiples_comp.png`, dpi=150, bbox_inches="tight". • Display inline via: ```python from IPython.display import Image, display display(Image("output/fig_multiples_comp.png")) ``` 6. **Chart 2 — “Share-Price Sensitivity to Fed Path”** • X-axis = Fed-funds rate path (±300 bp in 25 bp steps). • Y-axis = implied share price from `valuation_model()` looped over the path. • Save to `output/fig_rate_sensitivity.png` and display as above.
The Result:
On a multiples basis, CRCL was priced extremely cheap vs its peer set:
Circle is implied to trade around 5.5x EV/Rev and ~8x EV/EBITDA (low end of peers)
As for the DCF, we had to assume very low growth rate (3% compound annual growth rate) and a cheap exit multiple in order to get to the bankers' price.
DCF analysis for Bull/Base/Bear cases with interest rate sensitivities (Adjust assumptions to your thesis). IMO, Circle is an interest rate trade and highly pegged towards the Fed Funds rate - hence the Fed Funds mapping.
Clearly this IPO was severely underpriced - hopefully you got a piece of the action!
If you're interested in how I analyzed the full Circle IPO before it went public, I did a full AI breakdown of the S1 (IPO offering prospectus) alongside all the prompts.