Circle's DCF & Comps with AI

By Dave Wang

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:

  1. Create a table of assumptions
  2. 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
start_year: 2025
shares_fully_diluted: 217_300_000 # post-IPO share count
usdc_float_start_bil: 60.0 # average USDC in circulation (billions)
opex_base_mil: 450.0 # current annual operating expense
tax_rate_pct: 22.0
beta_reserve_yield_to_fed: 0.90 # pass-through of Fed
float_interest_spread_bps: -20 # reserve yield minus fed funds
disc_to_peer_multiple_pct: 10.0 # discount vs peer median
——————————————————————–
# PER-SCENARIO ASSUMPTIONS # ——————————————————————–
scenarios:
base:
usdc_float_cagr_pct: 3.0
tx_fee_take_rate_bps: 1.5
fed_funds_path_pct:
- {year: 2025, rate: 4.25}
- {year: 2026, rate: 4.25}
- {year: 2027, rate: 4.25}
exit_multiples: ev_to_rev: 5.0 ev_to_ebitda: 7.0
opex_cagr_pct: 10.0
discount_rate_pct: 15.0
bull:
usdc_float_cagr_pct: 5.0
tx_fee_take_rate_bps: 2.0
fed_funds_path_pct:
- {year: 2025, rate: 4.50}
- {year: 2026, rate: 4.25}
- {year: 2027, rate: 4.00}
exit_multiples: ev_to_rev: 6.0 ev_to_ebitda: 9.0
opex_cagr_pct: 8.0
discount_rate_pct: 13.0
bear:
usdc_float_cagr_pct: -1.0
tx_fee_take_rate_bps: 1.0
fed_funds_path_pct:
- {year: 2025, rate: 4.00}
- {year: 2026, rate: 3.75}
- {year: 2027, rate: 3.50}
exit_multiples: ev_to_rev: 4.0 ev_to_ebitda: 6.0
opex_cagr_pct: 12.0
discount_rate_pct: 17.0

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.

Check it out here:

https://www.linkedin.com/pulse/circle-ipo-ultimate-s1-breakdown-dave-wang-nxpbe

If you made it this far, forward this to a friend who might find this helpful

Get one high impact AI prompt every week

Join thousands of smart investors.

2026 — Built by Dave Wang. Not financial advice, only for educational purposes.