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
004Given a biased coin with probability p, how would you generate n independent fair coin tosses, and what is the lower bound on the number of biased tosses you need?Tower Research CapitalTrading · Princeton · 2018D.E. ShawResearch · New York · 2026
Say this
The bound is information-theoretic. Each biased flip carries H(p) bits of entropy, where H(p) is minus p log2 p minus (1-p) log2 (1-p), and each fair flip you output consumes exactly one bit. So you need at least n divided by H(p) biased flips on average, and no scheme can beat that.
Then walk it
- The argument is conservation of randomness. You cannot manufacture entropy, only repackage it, so expected input entropy must be at least expected output entropy.
- At p equal to a half, H is 1 and the bound is n flips, which is obviously right. At p equal to 0.1, H is about 0.47, so you need roughly 2.1 flips per fair bit at best.
- Von Neumann pairing achieves 1/(2p(1-p)) flips per bit, which at p equal to 0.1 is about 5.6. Miles off the 2.1 floor.
- To get close, you recycle the discarded information. Elias's and Peres's extractors take the sequence of discarded HH/TT outcomes and the positions of the successes, both of which still carry entropy, and feed them back in recursively. Peres's construction converges to the entropy bound as the block length grows.
- What I would actually say on a desk: for n fair bits I would use pairing because it is three lines of code and provably correct, and I would only reach for a Peres extractor if the biased source were expensive, which in practice it never is.
Where candidates lose it
Answering only with the construction and not the bound, or quoting the bound as n/H(p) without being able to say why entropy is the right currency. Also do not claim von Neumann is optimal. It is unbiased and simple, and it is provably wasteful, and saying so is the difference between having read the trick and understanding it.
Expect next
- Where exactly does the discarded entropy live in the von Neumann scheme?
- Now the reverse problem: simulate a p-coin from fair coins.
- What if p is unknown but you need to hit the entropy bound?
Reported by candidates at Tower Research Capital (Trading, Princeton, 2018); D.E. Shaw (Research, New York, 2026). Source: Wall Street Oasis.
041Explain the structure of a probabilistic graphical model you have worked with.Tower Research CapitalQuantitative Research · New York · 2015
Say this
Pick one model you actually built and describe it in four parts: the variables, the graph and what the missing edges assert, how you did inference, and how you checked it. The missing edges are the interesting part, because a graphical model is a set of conditional independence claims.
Then walk it
- Name the class first. A directed model, a Bayes net, factorises the joint as a product of each node given its parents and encodes causal or generative structure. An undirected model, a Markov random field, factorises into potentials over cliques and is better when the interactions have no natural direction.
- Then say what the graph buys you. Without structure, a joint over n binary variables needs 2 to the n minus 1 parameters. With a sparse graph it needs a handful per node. That reduction is the whole point, and the missing edges are the assumptions you are making.
- Inference: exact by belief propagation or the junction tree if the graph is a tree or has small treewidth, otherwise approximate by variational methods, loopy BP or MCMC. Say which you used and why, and say what the cost was.
- A concrete example is worth more than the taxonomy. A hidden Markov model is the simplest useful case: a latent state that evolves as a Markov chain with observations conditionally independent given the state. In markets people use it as a regime model, with the latent state as calm or stressed, fitted by Baum-Welch, and decoded with Viterbi.
- Then the honest part: on financial data the latent states are unstable, the number of regimes is not identified, and the fitted model will happily tell you the regime changed last week when it changed two months ago. So I used it as a descriptive overlay, never as a standalone signal.
Where candidates lose it
Reciting textbook definitions of Bayes nets and MRFs without ever describing a model you built. This question is a depth probe, and the interviewer will go three levels down on whichever model you name, so name the one you know cold. Be able to state the conditional independence your graph asserts and how you validated it.
Expect next
- What conditional independences does your graph assert, and did you test them?
- How did you do inference, and what was the complexity?
- How would you learn the graph structure from data?
Reported by candidates at Tower Research Capital (Quantitative Research, New York, 2015). Source: Wall Street Oasis.
042Derive the update rules for alternating least squares in a matrix factorisation.Tower Research CapitalQuantitative Research · New York · 2015
Say this
Fix one factor and the objective becomes an ordinary ridge regression in the other, so each update is a closed-form normal equation. With R approximated by U times V transpose and an L2 penalty, the update for a row of U is (V'V plus lambda I) inverse V'r.
Then walk it
- Objective: minimise the sum over observed entries of (r_ij minus u_i dot v_j) squared plus lambda times the sum of the squared norms of u and v. It is non-convex jointly in U and V, but convex in each one separately. That is the entire reason alternating minimisation works here.
- Differentiate with respect to u_i holding V fixed. The gradient is minus 2 times the sum over observed j of (r_ij minus u_i dot v_j) v_j plus 2 lambda u_i. Set it to zero.
- Rearranged: (sum over observed j of v_j v_j' plus lambda I) u_i equals the sum over observed j of r_ij v_j. So u_i equals that Gram matrix inverse times the weighted sum. Symmetric for v_j with U fixed.
- Cost per update is k cubed for the k by k solve plus k squared per observed entry, and it parallelises perfectly by row, which is exactly why ALS beat SGD for large recommender systems.
- Say the limitations. It converges to a local optimum only, so initialisation matters, usually small random or SVD-based. The lambda is essential because otherwise the Gram matrix is singular for users with fewer than k observations. And it monotonically decreases the objective every half-step, so if your loss ever goes up you have a bug in the derivation, which is a useful debugging fact.
Where candidates lose it
Writing down the gradient-descent update instead of the closed-form solve. ALS is defined by exploiting the per-block convexity to solve exactly, not by stepping. Also do not forget the lambda I, since without it the system is singular for sparse rows, and do not sum over all j when only observed entries enter the loss.
Expect next
- Why does ALS converge, and to what?
- When would you prefer SGD over ALS?
- How would you handle implicit feedback where you only see the ones?
Reported by candidates at Tower Research Capital (Quantitative Research, New York, 2015). Source: Wall Street Oasis.
082Something in your C++ program is overwriting memory it should not. How do you find it?Tower Research CapitalForeign Exchange · London · 2019
Say this
Reach for the sanitisers first. AddressSanitizer catches out-of-bounds writes and use-after-free with roughly a two times slowdown and tells you both the write site and the allocation site. If the corruption is timing-dependent, add ThreadSanitizer for data races.
Then walk it
- Order of tools: compile with -fsanitize=address,undefined and run the failing case. That resolves most buffer overruns and use-after-free immediately. Valgrind memcheck is slower but needs no recompile and catches uninitialised reads that ASan misses.
- If the corrupted location is known but the writer is not, set a hardware watchpoint in gdb on that address with watch, and let it break when something writes. Four watchpoints on x86, which is usually enough.
- If the corruption is not reproducible, make it reproducible before anything else. Record the inputs, pin the threads, disable randomisation, and consider record-and-replay with rr. A bug you cannot reproduce cannot be fixed, only guessed at.
- Common causes to check by inspection while the tools run: writing past the end of a fixed buffer, a dangling reference into a vector that reallocated, a stale pointer into an object that moved, a struct written with memcpy at the wrong size, and two threads writing the same cache line without synchronisation.
- And the systems answer for a production trading process where you cannot run ASan in the hot path: build with sanitisers in a test environment and in a canary, add canary values or guard pages around suspect buffers, and turn on the allocator's own debug checks. I would also say plainly that the fastest fix for a class of these bugs is to stop using raw buffers, because bounds-checked containers and spans eliminate the whole category.
Where candidates lose it
Answering add print statements. That is the answer of someone who has never used a sanitiser, and at a firm running C++ in production it is disqualifying. Name ASan specifically, name the gdb watchpoint technique for a known address, and say how you would make an intermittent bug reproducible before you try to find it.
Expect next
- What does AddressSanitizer not catch?
- How would you debug this in production where you cannot run sanitisers?
- What is a data race and why is it undefined behaviour?
Reported by candidates at Tower Research Capital (Foreign Exchange, London, 2019). Source: Wall Street Oasis.
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.

