Power Purchase Agreements (PPAs) are the financial backbone of renewable energy projects, yet pricing them accurately requires understanding multiple layers of risk. I recently built an open-source Python framework to tackle this challenge, and I want to share what I learned about the complexities of valuing these critical instruments.
What’s the Problem?
When a wind or solar developer signs a PPA, they’re essentially locking in a fixed price for electricity that will be produced over 10-15 years. Sounds simple, right? Just compare the PPA strike price to expected market prices and you’re done.
Not quite.
The reality is far more nuanced. Renewable PPAs carry three distinct types of risk that traditional power traders often underestimate:
- Shape Risk – Wind and solar don’t produce power when we want it; they produce when nature allows
- Merchant Tail Risk – Futures markets dry up after 2-3 years, leaving projects exposed to long-term price uncertainty
- Hedging Costs – Bid-ask spreads on futures contracts create real transaction costs
My framework quantifies each of these risk components separately, giving a complete picture of a PPA’s true economic value.
The Technical Challenge
Building this required combining several quantitative finance techniques:
1. Shape Risk Modeling
Offshore wind generates more power at night when electricity demand (and prices) are lowest. This creates negative shape risk – you’re selling power at exactly the wrong times.
I modeled this by:
- Loading actual hourly wind/solar generation profiles
- Volume-weighting spot prices against production patterns
- Comparing to baseload (flat) delivery schedules
The result? A €45/MWh offshore wind PPA can carry a €1.2M shape risk penalty over 10 years compared to baseload delivery.

Figure 1: Offshore wind generation characteristics. Top left shows hourly volatility over one week. Top right reveals seasonal patterns (winter months generate 60-80% more than summer). Bottom left shows the distribution is bimodal, and bottom right demonstrates capacity degradation over the project lifetime.
2. Merchant Tail Risk via Monte Carlo
Futures markets for electricity are liquid for maybe 2-3 years forward. Beyond that? You’re on your own.
I implemented geometric Brownian motion with mean reversion to simulate thousands of price scenarios for years 4-10, then calculated:
- Value at Risk (VaR): What’s the 95th percentile worst case?
- Conditional VaR (CVaR): If things go really bad, how bad?
For a typical PPA, merchant tail risk can represent €3-5M of exposure.
3. Optimal Hedge Ratios
Not all exposure needs to be hedged. I used variance minimization to calculate optimal hedge ratios based on:
- Futures bid-ask spreads
- Expected basis risk (futures vs spot divergence)
- Transaction costs
The framework recommends hedging 85-95% of near-term exposure when spreads are tight, backing off when transaction costs get too high.
Key Insights
After running hundreds of scenarios, three patterns emerged:
Solar PPAs are less risky than wind PPAs – Solar shape risk is actually slightly positive in many markets (generating during high-demand daylight hours), while wind carries 10-15% negative shape risk.
Merchant tail risk dominates for long-tenor contracts – For PPAs longer than 5 years, unhedgeable price exposure becomes the largest risk component by far.
Transaction costs matter more than most models assume – Hedging costs of €0.5-1.0/MWh may seem small, but over 10 years and millions of MWh, they compound to significant NPV impacts.

Figure 2: Profit & Loss attribution for a Pay-As-Produced PPA. Shape risk (+€7.9M) is the largest value driver, offset by volume risk (-€7.9M), hedging costs (-€2.2M), and basis risk (-€2.0M).
Real-World Application
Here’s what the framework outputs for a 10-year offshore wind PPA at €45/MWh:
PPA Valuation Summary
==================================================
Net Present Value: € 12.50M
Expected Revenue: € 450.00M
Hedging Cost: € -1.25M
Shape Risk Premium: € -1.20M
Merchant Tail VaR (95%): € -3.80M
Merchant Tail CVaR (95%): € -4.50M
==================================================
Translation: This PPA is worth €12.5M more than selling power in merchant markets, but you’re accepting €1.2M of shape risk penalty and up to €3.8M of tail risk exposure.

Figure 3: Annual cashflow decomposition showing undiscounted vs. discounted (5%) cashflows. Early years show larger negative cashflows due to higher volume risk and hedging costs, improving in later years as uncertainty resolves and production stabilizes.
Technical Stack
The framework is built with production-grade practices:
- NumPy/Pandas for vectorized time-series calculations
- SciPy for optimization (hedge ratios)
- Matplotlib/Seaborn for risk visualization
- Pytest with 90%+ coverage
- Type hints throughout for maintainability
What’s Next
I’m currently considering exploring:
- Incorporating weather forecast uncertainty into volume risk
- Adding correlation structures for multi-asset portfolios
- Integrating GARCH volatility models for better short-term hedging
Try It Yourself
The full framework is open source on GitHub. You can run a complete PPA valuation in three lines of code:
from ppa_valuation import PayAsProducedPPA
from data_loader import load_wind_profile
ppa = PayAsProducedPPA(strike=45.0, volume_profile=load_wind_profile())
summary = ppa.value_ppa(spot_prices, futures_curve)
Want to explore PPA risk yourself? Check out the repository and let me know what you find.






Leave a Reply