Unique Quant Projects With Downloadable Notebooks
A full list of quantitative finance projects that are actually worth building. Not random “predict the stock market” projects that every first year discovers after one YouTube video. These are projects that teach you real theory, force you to write actual code, and give you something genuinely interesting to talk about in interviews.
Introduction
If you are trying to break into quant finance, projects are one of the cleanest ways to prove that you are not just saying you are interested in markets, mathematics, and programming. They show that you can take an open-ended problem, learn the theory, write the code, test assumptions, and explain the result clearly.
A good quant project is not just “I trained a model and got high accuracy”. A good project has a question, a model, a simulation or backtest, a reason the approach makes sense, and a section where you are honest about what does not work.
This guide is designed for students who want something more interesting than another moving average crossover strategy. Some of these are beginner friendly. Some are more cooked. But every project below gives you a real quant concept to learn and a clean way to turn that concept into code.
How to Use This Guide
Do not try to build all of these at once. That is how you end up with eleven half-finished GitHub repos and nothing good enough to show anyone. Pick one project, finish the simple version, then add one or two extensions that make it genuinely yours.
For each project below, we include the idea, why it is useful, what you should build, a starter code snippet, and a notebook link. The notebooks are meant to become the clean downloadable versions you can edit, extend, and eventually turn into a proper portfolio project.
- Beginner: good if you are early and want to build confidence.
- Intermediate: good if you already know Python, probability, and basic finance.
- Advanced: good if you want something closer to research, trading, or production infrastructure.
The goal is to be able to explain exactly what you built and why the assumptions matter.
Project 1: Options Pricing Toolkit
Difficulty: Beginner to Intermediate
Build a small options pricing toolkit that can price European calls and puts, estimate Greeks, solve for implied volatility, and compare Black-Scholes prices against Monte Carlo prices. This is one of the cleanest first projects because it combines probability, calculus, numerical methods, and finance in a way that is easy to explain.
The boring version is just implementing Black-Scholes. The better version is turning it into a mini toolkit where users can change volatility, expiry, strike, and interest rates, then see how the option price and Greeks move.
Build:
- Black-Scholes call and put pricing.
- Delta, gamma, vega, theta, and rho.
- Implied volatility solver using binary search or Newton-Raphson.
- Monte Carlo price comparison.
- A short write-up explaining where Black-Scholes breaks down.
Starter snippet:
import math
from statistics import NormalDist
N = NormalDist().cdf
def black_scholes_call(S, K, T, r, sigma):
d1 = (math.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
return S * N(d1) - K * math.exp(-r * T) * N(d2)
def black_scholes_put(S, K, T, r, sigma):
d1 = (math.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
return K * math.exp(-r * T) * N(-d2) - S * N(-d1)
price = black_scholes_call(S=100, K=105, T=0.5, r=0.04, sigma=0.25)
print(round(price, 4))
Good extensions:
- Plot option price against spot price and volatility.
- Add dividends.
- Add binomial tree pricing for American options.
- Compare implied volatility across strikes to visualise a volatility smile.
Project 2: Weather Derivatives Pricer
Difficulty: Intermediate
Weather derivatives are a very underrated project because they are finance-adjacent without being another stock strategy. Instead of pricing an option on Apple or Nvidia, you price a contract based on temperature, rainfall, or heating and cooling degree days.
This is a good project because it forces you to think about non-tradable underlyings. You cannot just delta hedge the weather. You need to model the distribution, simulate outcomes, define the payoff, and think carefully about risk premium and model assumptions.
Build:
- Load historical daily temperature data.
- Calculate heating degree days or cooling degree days.
- Define a weather derivative payoff.
- Price the contract using historical simulation or Monte Carlo.
- Run sensitivity analysis across strike, cap, and seasonal assumptions.
Starter snippet:
import numpy as np
import pandas as pd
temps = pd.Series([18.2, 19.1, 21.4, 24.0, 26.5, 28.1, 25.7])
base_temp = 18.0
strike_cdd = 30.0
notional = 1000.0
cooling_degree_days = np.maximum(temps - base_temp, 0).sum()
payoff = notional * max(cooling_degree_days - strike_cdd, 0)
print("CDD:", round(cooling_degree_days, 2))
print("Contract payoff:", round(payoff, 2))
Good extensions:
- Model seasonality using a sinusoidal temperature component.
- Add random temperature shocks and simulate thousands of seasons.
- Compare historical simulation against parametric Monte Carlo.
- Explain why weather derivatives are different from standard equity options.
Project 3: Prediction Market Arbitrage Scanner
Difficulty: Intermediate
Prediction markets are a surprisingly good place to learn arbitrage, market making, and probability. The idea is simple: if a set of mutually exclusive outcomes has prices that add up to less than 100%, there may be an arbitrage. If they add up to more than 100%, the market may be overpriced.
The project is to build a scanner that checks markets, converts prices into implied probabilities, detects mispricings, and accounts for fees. This is much better than just saying “I found an arbitrage” because you are forced to deal with liquidity, fees, and position sizing.
Build:
- Represent prediction market contracts and outcome prices.
- Convert prices into implied probabilities.
- Detect underrounds and overrounds.
- Calculate the trade size and expected locked-in return.
- Add filters for liquidity, fees, and stale markets.
Starter snippet:
outcomes = {
"candidate_a": 0.42,
"candidate_b": 0.37,
"candidate_c": 0.18,
}
fee_rate = 0.01
total_cost = sum(outcomes.values())
net_cost = total_cost * (1 + fee_rate)
if net_cost < 1.0:
edge = 1.0 - net_cost
print("Potential arbitrage found")
print("Net cost:", round(net_cost, 4))
print("Locked return:", round(edge, 4))
else:
print("No clean underround after fees")
Good extensions:
- Add a live data connector or CSV upload workflow.
- Rank opportunities by edge after fees.
- Flag stale prices and low-liquidity traps.
- Build a dashboard showing implied probability by market.
Project 4: Avellaneda-Stoikov Market Maker Simulator
Difficulty: Advanced
If you want a market making project that sounds less like a toy and more like actual quant trading, build an Avellaneda-Stoikov simulator. The core idea is that your quotes should depend on your fair value, volatility, inventory, risk aversion, and time remaining.
This project is good because it gives you a real framework for thinking about the trade-off market makers face. You want to earn spread, but you do not want to accumulate a giant inventory position right before the market moves against you.
Build:
- A simulated mid-price process.
- Reservation price that shifts based on inventory.
- Optimal bid and ask quotes around the reservation price.
- Probabilistic fills based on quote distance.
- PnL decomposition into spread capture, inventory PnL, and final liquidation value.
Starter snippet:
import math
mid_price = 100.0
inventory = 8
risk_aversion = 0.1
sigma = 0.25
time_remaining = 0.5
k = 1.5
reservation_price = mid_price - inventory * risk_aversion * sigma ** 2 * time_remaining
optimal_spread = risk_aversion * sigma ** 2 * time_remaining + (2 / risk_aversion) * math.log(1 + risk_aversion / k)
bid = reservation_price - optimal_spread / 2
ask = reservation_price + optimal_spread / 2
print("Reservation price:", round(reservation_price, 4))
print("Bid:", round(bid, 4))
print("Ask:", round(ask, 4))
Good extensions:
- Compare low and high risk aversion settings.
- Show how inventory changes quote placement.
- Add adverse selection after fills.
- Run 1,000 simulations and plot PnL distribution.
Project 5: Lead-Lag Effect Detection in HFT
Difficulty: Advanced
Lead-lag effects are a very clean way to explore high-frequency trading without pretending you have a full production HFT stack in your bedroom. The question is simple: does movement in one asset or venue consistently occur before movement in another?
This project teaches you about time alignment, lagged correlation, microstructure noise, timestamp quality, and false discoveries. It also looks much more serious than a basic “predict tomorrow’s close” model.
Build:
- Load high-frequency or simulated tick data for two related assets.
- Calculate short-horizon returns.
- Shift one return series across multiple lags.
- Measure lagged correlation and predictive power.
- Visualise which asset appears to lead at different horizons.
Starter snippet:
import pandas as pd
returns = pd.DataFrame({
"asset_a": [0.001, -0.002, 0.0015, 0.0005, -0.001, 0.002],
"asset_b": [0.0002, 0.0011, -0.0018, 0.0012, 0.0004, -0.0008]
})
lag_results = {}
for lag in range(-3, 4):
shifted_b = returns["asset_b"].shift(lag)
lag_results[lag] = returns["asset_a"].corr(shifted_b)
for lag, corr in lag_results.items():
print(f"Lag {lag}: {corr:.4f}")
Good extensions:
- Test multiple assets or venues.
- Add statistical significance tests.
- Control for bid-ask bounce and microstructure noise.
- Use results to build a very simple short-horizon signal.
Project 6: Gaussian vs Non-Gaussian Copulas for Pairs Trading
Difficulty: Advanced
This is the more interesting version of a pairs trading project. Instead of only asking whether two assets are cointegrated, you model their dependence structure using copulas. The whole point is to ask whether the relationship between two assets is actually captured by a Gaussian assumption, or whether the tails behave differently.
This project sounds intimidating, but the build can be made very manageable. Convert returns to ranks, map them into uniform variables, compare dependence structures, and then test whether tail dependence changes the way you would trade the pair.
Build:
- Load two related return series.
- Transform returns into percentile ranks.
- Compare Gaussian copula assumptions against heavier-tailed alternatives.
- Estimate tail dependence.
- Backtest simple pair signals using dependence-based mispricing.
Starter snippet:
import numpy as np
import pandas as pd
from scipy.stats import norm, rankdata
returns = pd.DataFrame({
"asset_a": [0.01, -0.02, 0.015, 0.003, -0.011, 0.02, -0.025],
"asset_b": [0.008, -0.018, 0.011, 0.004, -0.014, 0.017, -0.03]
})
def to_uniform(x):
ranks = rankdata(x)
return ranks / (len(x) + 1)
u = returns.apply(to_uniform)
gaussian_scores = u.apply(norm.ppf)
correlation = gaussian_scores.corr().iloc[0, 1]
print("Gaussian copula correlation:", round(correlation, 4))
Good extensions:
- Compare Gaussian, t-copula, Clayton, and Gumbel-style dependence.
- Estimate lower-tail and upper-tail dependence.
- Show cases where linear correlation misses the relationship.
- Explain why tail dependence matters during market stress.
Project 7: Volatility Forecasting Lab
Difficulty: Intermediate
Volatility forecasting is a much better project than pure price prediction. Prices are brutally noisy. Volatility is still difficult, but it has structure: clustering, mean reversion, spikes, and persistent regimes. This gives you more to analyse and a much better story to tell.
The project is simple: use historical returns to forecast future realised volatility, then compare a few methods. Start with rolling volatility and EWMA. Then add GARCH if you want to make it more advanced.
Build:
- Calculate log returns from price data.
- Estimate rolling realised volatility.
- Forecast volatility using EWMA.
- Compare forecasts against future realised volatility.
- Evaluate using MAE, RMSE, and plots.
Starter snippet:
import numpy as np
import pandas as pd
prices = pd.Series([100, 101, 99, 98, 102, 104, 103, 105, 101, 100])
returns = np.log(prices / prices.shift(1)).dropna()
window = 5
realised_vol = returns.rolling(window).std() * np.sqrt(252)
def ewma_vol(returns, lam=0.94):
variances = []
var = returns.var()
for r in returns:
var = lam * var + (1 - lam) * r ** 2
variances.append(var)
return pd.Series(np.sqrt(variances) * np.sqrt(252), index=returns.index)
forecast_vol = ewma_vol(returns)
print(pd.DataFrame({"realised_vol": realised_vol, "ewma_forecast": forecast_vol}))
Good extensions:
- Add a GARCH model and compare it to EWMA.
- Forecast volatility for multiple assets.
- Use volatility forecasts to size positions.
- Analyse what happens during crisis periods.
Project 8: Order Book Imbalance Model
Difficulty: Intermediate to Advanced
Order book imbalance is one of the cleanest ways to start thinking about market microstructure. Instead of using daily candles, you look at bid volume, ask volume, spread, and short-term mid-price movement.
The core question is: when there is much more size on the bid than the ask, does that say anything about where the mid-price moves next? The answer is not always simple, which is exactly why this is a good project.
Build:
- Represent top-of-book bid and ask prices and sizes.
- Calculate spread and mid-price.
- Create order book imbalance features.
- Predict short-horizon mid-price direction.
- Evaluate performance against a simple baseline.
Starter snippet:
import pandas as pd
book = pd.DataFrame({
"bid_price": [99.9, 100.0, 100.1, 100.0],
"ask_price": [100.1, 100.2, 100.3, 100.2],
"bid_size": [120, 180, 240, 130],
"ask_size": [100, 90, 80, 160]
})
book["mid"] = (book["bid_price"] + book["ask_price"]) / 2
book["spread"] = book["ask_price"] - book["bid_price"]
book["imbalance"] = (book["bid_size"] - book["ask_size"]) / (book["bid_size"] + book["ask_size"])
book["next_mid_change"] = book["mid"].shift(-1) - book["mid"]
print(book)
Good extensions:
- Use multiple levels of the order book.
- Add queue imbalance and spread features.
- Compare logistic regression, random forest, and gradient boosting.
- Connect the model to a simple market making simulator.
Project 9: Optimal Execution Simulator
Difficulty: Advanced
Optimal execution is about how to trade a large order without destroying your own price. If you buy everything instantly, you may pay too much market impact. If you trade too slowly, the market may move away from you. This project is about modelling that trade-off.
A clean version compares three approaches: execute immediately, split evenly through time, and use an impact-aware schedule. Then you compare the average execution cost across many simulated price paths.
Build:
- Simulate a price path.
- Define a large parent order.
- Split it into smaller child orders.
- Add temporary and permanent market impact.
- Compare execution schedules by cost and variance.
Starter snippet:
import numpy as np
shares_to_buy = 10000
steps = 10
initial_price = 100.0
temporary_impact = 0.00005
schedule = np.repeat(shares_to_buy / steps, steps)
prices = initial_price + np.cumsum(np.random.normal(0, 0.1, steps))
execution_prices = prices + temporary_impact * schedule
total_cost = np.sum(schedule * execution_prices)
average_price = total_cost / shares_to_buy
print("Average execution price:", round(average_price, 4))
print("Arrival price:", initial_price)
print("Slippage:", round(average_price - initial_price, 4))
Good extensions:
- Compare TWAP, VWAP, and front-loaded schedules.
- Add risk aversion and volatility.
- Run Monte Carlo simulations of execution cost.
- Visualise the trade-off between market impact and timing risk.
Project 10: Contributing to C++ Financial Libraries
Difficulty: Intermediate to Advanced
If you are aiming for quant dev or trading software roles, this is one of the most underrated project directions. You do not always need to invent a completely new trading strategy. Sometimes the better signal is that you can read an existing codebase, understand financial abstractions, write clean C++, add tests, and improve performance.
The project is to pick an open-source financial library or build a tiny one yourself, then contribute a pricing model, performance improvement, test suite, documentation improvement, or numerical method. It is less flashy than a dashboard, but it can be much closer to what software work in trading firms actually feels like.
Build:
- Choose a financial library or create a small C++ pricing library.
- Implement a pricing model, instrument class, or numerical method.
- Add unit tests and benchmarks.
- Write clear documentation and examples.
- Open a pull request or publish a clean GitHub repo.
Starter snippet:
#include <cmath>
#include <iostream>
class EuropeanCall {
public:
EuropeanCall(double spot, double strike, double maturity, double rate, double vol)
: S(spot), K(strike), T(maturity), r(rate), sigma(vol) {}
double payoff(double ST) const {
return std::max(ST - K, 0.0);
}
private:
double S, K, T, r, sigma;
};
int main() {
EuropeanCall call(100.0, 105.0, 0.5, 0.04, 0.25);
std::cout << call.payoff(112.0) << std::endl;
}
Good extensions:
- Add Black-Scholes pricing and Greeks in C++.
- Add a Monte Carlo engine with reproducible random seeds.
- Benchmark performance against a Python implementation.
- Create tests for edge cases like zero maturity and deep in-the-money options.
Two Week Build Plan
Most students do not need a six-month research project. They need one finished project that is clean, readable, and deep enough to discuss in an interview. Here is a simple two-week structure you can use for almost any project in this guide.
Days 1-2: Understand the theory
- Read the basic theory behind the model.
- Write down the assumptions in plain English.
- Find one or two simple papers, lecture notes, or blog references.
Days 3-5: Build the simple version
- Use toy data first.
- Make sure the core logic works.
- Do not overcomplicate the project before the base version is finished.
Days 6-9: Add realism
- Add costs, noise, fees, slippage, inventory, constraints, or train/test splits.
- Start tracking useful metrics.
- Visualise the most important result.
Days 10-12: Stress test it
- Change parameters and see when the model breaks.
- Test edge cases.
- Write down what assumptions are unrealistic.
Days 13-14: Make it presentable
- Clean the notebook.
- Add a README.
- Add charts and explanations.
- Write 3-5 bullet points you could put on a resume.
Resume Bullets
The way you describe the project matters. “Made a trading bot” is not good. “Built a market making simulator with inventory-aware quoting and PnL decomposition” is much better.
Better examples:
- Built an options pricing toolkit implementing Black-Scholes, Greeks, implied volatility inversion, and Monte Carlo pricing.
- Created a weather derivatives pricer using historical temperature simulation, degree-day payoffs, and strike sensitivity analysis.
- Developed a prediction market arbitrage scanner detecting underround opportunities after fees, liquidity filters, and stale price checks.
- Implemented an Avellaneda-Stoikov market making simulator with inventory-aware reservation prices, stochastic fills, and PnL decomposition.
- Analysed lead-lag effects in high-frequency return series using lagged correlations, timestamp alignment, and short-horizon signal testing.
- Compared Gaussian and non-Gaussian copula models for pairs trading, with a focus on tail dependence and stress-period behaviour.
- Contributed to a C++ financial library by implementing pricing functionality, unit tests, benchmarks, and documentation examples.
Notice the difference: these bullets tell the reader what you actually implemented. They make the project sound like engineering and research, not like a weekend notebook that says “buy low sell high”.
Closing Remarks
The best quant project is not necessarily the most complicated one. It is the one you can explain deeply. What did you assume? What did you test? Where did it fail? What would you improve if you had more time?
If you are early, build the options toolkit, weather derivatives pricer, or volatility lab. If you want trading, build the prediction market scanner, Avellaneda-Stoikov simulator, or order book model. If you want research, build the lead-lag project or copula pairs trading project. If you want quant dev, contribute to a C++ financial library.
Projects are not a replacement for probability, statistics, coding, and interview prep. But they give you proof that you can actually build things. And in a field where everyone says they are passionate about quant finance, proof is pretty useful.
We hope you found this guide helpful! :)