Quant interview preparation
Prop market making and quantitative research, weighted the way the interviews actually are: probability and expected value, statistics and machine learning, market making logic, programming and options. Every question is either traced to a named firm from a public candidate report, or tagged at desk level when we could not trace it, and every probability answer shows the reasoning path rather than just the number.
100 questions, mapped to the firms that asked them
- Questions
- 100
- Traced to a firm
- 53
- Firms
- 15
- Updated
- September 2026
078Given a stream of numbers, return the median after each element arrives.Old Mission CapitalEquities · Boston · 2024
Say this
Two heaps. A max heap for the lower half and a min heap for the upper half, kept balanced so their sizes differ by at most one. The median is the top of the larger heap, or the average of the two tops. Insert is O(log n), query is O(1).
Then walk it
- Insert rule: if the new value is at most the max of the lower heap, push it there, otherwise push to the upper heap. Then rebalance by moving one element across if the sizes differ by more than one.
- Query: if the sizes are equal, the median is the average of the two tops. Otherwise it is the top of the larger heap. Constant time either way.
- Total cost for n elements is n log n, and memory is O(n) because you must retain everything. That memory cost is the honest limitation, and it is the first thing an interviewer will probe.
- If the median must be over a sliding window rather than the whole prefix, the two-heap approach needs deletions from the middle. Use an indexed multiset or two heaps with lazy deletion and a hash of pending removals. That is the version that comes up in practice on a tick stream.
- And if approximate is acceptable, which on a trading system it usually is, the right answer is a streaming quantile sketch: t-digest or the Greenwald-Khanna algorithm, giving you any quantile in bounded memory rather than O(n). Naming that unprompted is what turns a correct interview answer into a practical one.
Where candidates lose it
Sorting on every element, which is O(n squared log n) overall, or maintaining a sorted list with insertion, which is O(n) per element because of the shifting even though the binary search is fast. Say two heaps immediately, then volunteer the sliding-window and bounded-memory variants, because that is where the conversation is heading.
Expect next
- Now do it over a sliding window of the last thousand values.
- What if you cannot store all the data?
- How would you get the 99th percentile instead of the median?
Reported by candidates at Old Mission Capital (Equities, Boston, 2024). Source: Wall Street Oasis.
079How would you store key-value pairs, and what are the tradeoffs between the implementations?Jump TradingEngineering · Cambridge · 2019
Say this
Hash table for O(1) average lookup with no ordering, balanced tree for O(log n) with ordered iteration and range queries, and a flat sorted array if the data is static and you care about cache behaviour. The choice is driven by whether you need ordering and what your access pattern looks like in memory.
Then walk it
- Hash table: O(1) average, O(n) worst case on collisions, no ordering, and rehashing causes an occasional large latency spike. That spike is a real problem on a trading hot path and it is why people pre-size their maps.
- Balanced tree, red-black or B-tree: O(log n) guaranteed, ordered traversal, range queries, and predictable latency. Worse constants and worse cache locality because of pointer chasing.
- The tradeoff that matters most in practice is memory layout, not big-O. C++ unordered_map uses separate chaining with nodes scattered across the heap, so every lookup is potentially a cache miss. An open-addressing flat hash map keeps everything in one array and is commonly two to three times faster in real workloads at the same asymptotic complexity.
- For a mostly-static table, a sorted array with binary search beats both: contiguous memory, no pointers, and for small n a linear scan beats binary search because it is branch-predictable and prefetchable. Under about 16 to 32 entries, linear wins.
- And on disk the answer changes completely: B-trees for read-heavy workloads because of the branching factor against block size, LSM trees for write-heavy because they turn random writes into sequential ones. I would want to know the read-write ratio and whether the working set fits in cache before choosing anything.
Where candidates lose it
Answering hash map, O(1), done. The question says tradeoffs, so it is a systems question and the interviewer at a trading firm cares about tail latency and cache behaviour more than asymptotic complexity. Mention rehashing spikes and pointer chasing, and ask what the access pattern is.
Expect next
- Why is std::unordered_map often slow in practice?
- How would you avoid latency spikes from rehashing?
- What changes if the data lives on disk?
Reported by candidates at Jump Trading (Engineering, Cambridge, 2019). Source: Wall Street Oasis.
080Can you implement a linked list, and when would you actually use one on a trading system?Jump TradingProp Trading · Remote · 2022
Say this
Yes, a node with a value and a next pointer, plus a head, and the usual care about the empty list and about updating head when you insert or delete at the front. But the honest answer to the second half is: rarely, because pointer chasing destroys cache performance.
Then walk it
- The implementation: struct with value and next, insert at head in O(1), search in O(n), delete given the previous node in O(1). Use a dummy head node and most of the edge cases disappear, which is the trick worth knowing for interviews.
- The standard edge cases they will check: empty list, single element, deleting the head, and not leaking the node you unlinked. In C++ that means being explicit about ownership, and in a real codebase it means a unique pointer or an arena.
- What a linked list genuinely buys you: O(1) splice of a node from the middle if you already hold a pointer to it, and stable addresses so a pointer stays valid across insertions. That is exactly the requirement in a limit order book, where you need to cancel an arbitrary resting order in constant time, so orders at a price level are typically an intrusive doubly linked list with a hash from order id to node.
- What it costs: every traversal is a potential cache miss, and a vector beats a list for iteration by an order of magnitude even when the asymptotics say otherwise.
- So the real-world answer is an intrusive list over a pre-allocated node pool, not a textbook list with individual heap allocations. Saying that is the difference between having done the exercise and having written low-latency code.
Where candidates lose it
Writing the code correctly and having nothing to say about why you would use one. At a trading firm the interesting half is the memory and cache discussion, and the order book cancel case is the one concrete example where a linked list is genuinely the right structure. Also do not forget the dummy head trick, it removes most of the bugs.
Expect next
- Reverse it in place.
- Detect a cycle in constant space.
- Why would a vector usually beat a list even when the complexity says otherwise?
Reported by candidates at Jump Trading (Prop Trading, Remote, 2022). Source: Wall Street Oasis.
081Write me an unordered_map class. What is actually inside a hash map?Old Mission CapitalTrading · Chicago · 2021
Say this
An array of buckets, a hash function mapping keys to bucket indices, a collision resolution strategy, and a resize policy driven by load factor. The three decisions that define the implementation are the hash, the collision handling, and when you grow.
Then walk it
- Core operations: index equals hash of key modulo bucket count, then search within that bucket comparing keys for equality. Insert, find and erase all follow that pattern, and all are O(1) expected under a good hash.
- Collision resolution, and this is the main design choice. Separate chaining stores a list per bucket, which is simple and is what the C++ standard effectively mandates for unordered_map because of its iterator and reference stability guarantees. Open addressing stores entries inline and probes forward, which is far more cache-friendly but complicates erase, since you need tombstones or backward shifting.
- Resize: track load factor as elements over buckets, and when it exceeds a threshold, typically 0.75 for chaining or 0.5 to 0.7 for open addressing, allocate a bigger array and rehash everything. Use a power-of-two bucket count so the modulo is a bitmask, but then your hash must mix the high bits or a weak hash collides badly.
- The correctness details an interviewer will probe: key equality is separate from the hash, two equal keys must hash the same, iterator invalidation on rehash, and what happens when the key type has a bad hash. A hash that is the identity on integers plus power-of-two buckets means sequential keys with a stride collide catastrophically.
- If I were writing this for a trading system I would use open addressing with linear probing over a pre-allocated power-of-two array, reserve capacity up front so no rehash ever happens in the hot path, and store keys and values in separate arrays if the values are large. The reason is tail latency: one rehash mid-session is a millisecond spike, and a millisecond is forever.
Where candidates lose it
Describing the interface rather than the internals. The question is about buckets, hashing, collisions and resizing. Also be ready for why is std::unordered_map slow, whose answer is node-per-element allocation and the standard's stability guarantees forcing chaining. And never forget that erase under open addressing needs tombstones, which is the bug candidates ship.
Expect next
- How does erase work under open addressing?
- What load factor would you choose and why?
- What makes a good hash function, and what happens with a bad one?
Reported by candidates at Old Mission Capital (Trading, Chicago, 2021). Source: Wall Street Oasis.
083Write an algorithm to find all the primes from one to n, and then optimise it.AQR Capital ManagementResearch · Greenwich · 2015
Say this
Sieve of Eratosthenes. Mark every multiple of each prime as composite, and the unmarked survivors are the primes. Time is n log log n, which is essentially linear, and memory is n bits.
Then walk it
- The baseline to reject first: trial division on each number up to its square root is about n times root n over log n, far worse. Say why the sieve wins before you write it.
- The sieve itself: start at p equal to 2, mark 4, 6, 8 and so on, then advance to the next unmarked number. Two optimisations that come free: start marking at p squared rather than 2p, because smaller multiples are already marked, and stop the outer loop at root n.
- Memory optimisations: store only odd numbers, halving memory, use a bit array rather than bytes for an eightfold saving, and if n is large, sieve in cache-sized blocks. That last one matters more than anything else in practice, because a naive sieve over 10 to the 9 is dominated by cache misses, and segmenting it can be several times faster at identical complexity.
- Further refinements if pushed: a wheel sieve skipping multiples of 2, 3 and 5 removes about 77 percent of the candidates, and the sieve of Atkin is asymptotically better at n over log log n but is slower in practice and much harder to get right.
- And the answer to a different question they may be asking: if you want to test whether one large number is prime rather than enumerate a range, the sieve is the wrong tool entirely and you want Miller-Rabin, which is probabilistic and fast. Recognising that enumerate and test are different problems is worth saying.
Where candidates lose it
Giving trial division and calling it done, or giving the sieve with no optimisation when the question explicitly asks for one. The optimisations they want in order are: start at p squared, skip evens, use a bit array, then segment for cache. Naming cache blocking is what marks you out, because it is the one that matters at scale and it is not in the textbook answer.
Expect next
- What is the memory cost for n equal to a billion, and how would you reduce it?
- How would you parallelise the sieve?
- Now test whether one very large number is prime.
Reported by candidates at AQR Capital Management (Research, Greenwich, 2015). Source: Wall Street Oasis.
085C++ or Python? Where does each belong in a quant stack?Quant researchQuant development
Say this
Both, in different places. Python for research, where iteration speed and the data-science ecosystem dominate. C++ for anything on the critical path, where you need deterministic microsecond latency and control over memory. The split is a question of which cost dominates, developer time or machine time.
Then walk it
- Python's real advantage is not the language, it is pandas, numpy, scipy, statsmodels and scikit-learn plus notebooks. A research idea gets tested in an afternoon. The performance is acceptable because the heavy loops sit in vectorised C underneath.
- Python's disqualifying weakness for execution is non-determinism: garbage collection pauses, the global interpreter lock, and unpredictable allocation. A tail latency you cannot control is worse than a mean latency that is higher.
- C++ gives you no garbage collector, control of memory layout and cache behaviour, zero-cost abstractions, and access to kernel bypass networking. The cost is development speed and a large surface for undefined behaviour.
- How real stacks resolve it: C++ or Rust for the gateway, book building and order entry, Python for research, signal development and analysis, with the shared logic compiled once and bound into Python through pybind11 so research and production use the same code. That last point matters, because a research-production mismatch is a reliable source of live losses.
- And I would name the middle ground rather than pretend the choice is binary. Numba, Cython, JAX and polars cover a lot of ground where Python is too slow but full C++ is unjustified, and Rust is genuinely taking share on the systems side. The judgement I would offer is: write it in Python until you have measured that it is too slow, then move only the measured hot spot.
Where candidates lose it
Picking a side as a matter of taste. It is a judgement question about where each tool fits, and a candidate who says C++ is better shows they have only worked on one side of the stack. Mention the research-to-production consistency problem, because it is the practical issue this split creates and few candidates raise it.
Expect next
- How would you keep research and production code consistent?
- What specifically makes Python unsuitable for the critical path?
- Where would you use Rust?
086Explain how you would price an option.DRWQuantitative Trading · Chicago · 2025
Say this
The core idea is replication. If I can build a portfolio of the underlying and cash that matches the option's payoff in every state of the world, then no-arbitrage says the option must cost what that portfolio costs. Everything else, Black-Scholes included, is a way of computing that cost.
Then walk it
- Start with one period and two states, because it makes the logic visible. Stock at 100 goes to 110 or 90, a call struck at 100 pays 10 or 0. Hold delta shares plus B in cash and solve two equations: delta is (10 minus 0) over (110 minus 90), which is 0.5, and then B falls out. The option price is 0.5 times 100 plus B. No probabilities were used anywhere.
- That is the key insight to state explicitly: the price does not depend on the real-world probability of the up move, only on the size of the moves. Rearranging gives the risk-neutral probability, which is the probability that makes the discounted stock a martingale, and pricing becomes a discounted expectation under that measure.
- Extend the tree to many steps and you get the binomial model, which handles American exercise naturally because you compare intrinsic against continuation at each node. Take the limit with the step size going to zero and you get Black-Scholes.
- Black-Scholes in words: the price is the discounted risk-neutral expectation of the payoff when the stock follows geometric Brownian motion with constant volatility. The formula's two N terms are the risk-neutral probability of finishing in the money and the delta-weighted version of it.
- Then the practical truth, which is the answer a trading firm actually wants: nobody uses Black-Scholes to find the price, because the price is on the screen. You use it as a translator from price to implied volatility, then you trade the volatility surface. Constant vol is false, the smile proves it, so the real work is interpolating and extrapolating the surface consistently and hedging the Greeks it implies.
Where candidates lose it
Reciting the Black-Scholes formula. Anyone can memorise it. The interviewer wants replication and no-arbitrage, and specifically wants to hear that the real-world probability drops out. Then close by saying the formula is used backwards, to extract implied vol from a market price. That last move is what marks a trader rather than a student.
Expect next
- Why does the real-world probability not appear in the price?
- What are the assumptions, and which one fails hardest?
- How would you price an American put?
Reported by candidates at DRW (Quantitative Trading, Chicago, 2025). Source: Wall Street Oasis.
088Walk me through the Greeks, and tell me which one a market maker actually worries about.Prop trading firmsDerivatives
Say this
Delta is sensitivity to spot, gamma to how delta changes, vega to volatility, theta to time and rho to rates. A market maker hedges delta continuously and almost mechanically, so the risks they actually carry are gamma and vega.
Then walk it
- Delta: first derivative of price with respect to spot, between 0 and 1 for a call, and at the money roughly 0.5. It is also approximately the risk-neutral probability of finishing in the money, which is a useful intuition.
- Gamma: the second derivative, highest at the money and rising sharply as expiry approaches. Gamma is why a hedge goes stale, and it is the reason a delta-hedged book still has P&L. Long gamma means you buy low and sell high while hedging; short gamma means the opposite.
- Vega: sensitivity to implied vol, largest for longer-dated at-the-money options. So near-dated options are a gamma trade and far-dated ones are a vega trade. That distinction drives which expiry you use to express a view.
- Theta: the cost of owning optionality. For a delta-hedged long option position, theta is what you pay and gamma is what you earn, and the two balance exactly when realised vol equals implied vol. That relationship is the single most useful thing in the list.
- So: delta gets hedged away because it is free to hedge and carries no edge. Gamma and vega are the positions a desk actually runs, and the third risk that does not appear in the standard list but dominates in practice is the correlation and skew risk across strikes, because you are never long one option, you are long a surface.
Where candidates lose it
Listing definitions without connecting gamma and theta. The relationship, that a delta-hedged option earns gamma and pays theta and breaks even when realised equals implied, is the answer that shows you understand what a vol trader does all day. Also be clear that delta is hedged precisely because there is no edge in it.
Expect next
- What is the relationship between gamma and theta?
- Which expiry would you use to express a pure vega view?
- What are the second-order Greeks and when do they matter?
089What is put-call parity, and what would you do if you saw it violated?Prop trading firmsDerivatives
Say this
For European options on a non-dividend-paying stock, call minus put equals spot minus the discounted strike. It is pure arbitrage, no model, because a long call plus a short put plus the discounted strike in cash replicates the stock exactly. If it breaks, you trade both sides and lock a riskless profit.
Then walk it
- The proof is a payoff table. At expiry, long call plus short put pays S minus K in every state, whether S is above or below K. Adding K in cash held to expiry gives you S. So the cost today of call minus put plus K discounted must equal S.
- With dividends, subtract the present value of dividends from the spot. With a cost of carry or borrow cost on the short, use the forward: C minus P equals the discounted difference between the forward and the strike.
- If I saw a violation, say the call is too expensive: sell the call, buy the put, buy the stock, and borrow the discounted strike. That is a conversion, and the reverse is a reversal. Lock the difference and hold to expiry.
- Then the reasons an apparent violation is usually not one, and this is what the question is really testing. Stale quotes on one leg. You are looking at mid prices but must trade at the bid and offer, and the parity gap is usually smaller than the combined spreads. Hard-to-borrow stock making the short leg expensive. American exercise, where early exercise of the put breaks the equality. Discrete dividends you have modelled wrong.
- So my actual answer: I would first check whether the apparent edge survives crossing four spreads and paying the borrow. Ninety-nine times out of a hundred it does not, and that is the point of the question. The hundredth time, borrow cost is usually the explanation, and the implied borrow rate you back out of the parity relationship is itself the useful information.
Where candidates lose it
Giving the formula and saying you would arbitrage it, with no mention of transaction costs, borrow or American exercise. A trading interviewer asks this specifically to see whether you treat a screen-level inefficiency as free money. Also know that parity holds for European options only, and be able to say why American puts break it.
Expect next
- Why does it not hold exactly for American options?
- How would you back out the implied borrow rate from the option prices?
- What does a persistent parity gap tell you about the stock?
090What is the difference between implied and realised volatility, and what does the gap between them tell you?DerivativesProp trading firms
Say this
Implied vol is the market's forward-looking price of volatility, backed out of option prices. Realised vol is a backward-looking statistic computed from returns. Implied sits above realised on average by a few points, and that gap is the variance risk premium, not a free lunch.
Then walk it
- Implied comes from inverting a pricing model on a traded price, so it is a price expressed in volatility units. Realised is the annualised standard deviation of returns over a window, and how you compute it matters: close-to-close, high-low estimators like Parkinson or Garman-Klass, or sums of intraday squared returns.
- On the S&P, VIX has historically averaged around 19 to 20 against realised vol nearer 15 to 16. That three to four point gap is persistent and it is compensation to option sellers for taking gap risk and for providing crash insurance.
- So the gap does not mean options are overpriced. It means there is a premium for bearing the risk that variance spikes, and that risk is exactly the risk that hurts most when it materialises, since vol spikes coincide with equities falling.
- Where the gap becomes information: the term structure, which is normally upward sloping and inverts in a crisis, and the spread between implied and a good realised forecast. If implied is unusually high relative to a GARCH or HAR forecast, that is a candidate signal, but it has to clear the premium first.
- And the practical trap to name: implied vol from a monthly option is a forecast of realised vol over the next month, so comparing today's VIX to the last month's realised vol is comparing a forecast to the wrong period. Aligning the horizons correctly makes a lot of apparent signal disappear.
Where candidates lose it
Concluding that because implied exceeds realised you should always sell vol. That trade works for years and then loses everything in a week, and interviewers ask it to see whether you know the premium exists for a reason. Also mismatching horizons, which is the technical error that generates fake signals.
Expect next
- Why does the variance risk premium exist?
- How would you actually forecast next month's realised vol?
- What does an inverted vol term structure tell you?
Firm tags come from public, anonymous candidate reports on Wall Street Oasis: strong signal, not sworn testimony. Firms are named as the places a question was reported, not as partners of Fin Maverick. Answers are written for this page to show how to think out loud; they are not scripts to recite.

