cswork / libraryOpen practice workspace

Interview guides · Aqr

Aqr Data Scientist Interview Questions & Guide 2026

Data scientist prep for Aqr: practice defining a quantitative trading metric, picking its guardrails and defending the tradeoff.

The 60-second brief

At Aqr, a Data Scientist sits at the critical intersection of advanced financial theory, modern machine learning, and high-scale quantitative execution. Unlike traditional technology companies where data science might focus primarily on product analytics or user growth, at Aqr, data science is directly tied to the core investment engine. You will design, build, and stress-test mathematical models that parse massive, complex datasets to extract predictive signals, optimize portfolio construction, and manage risk across global markets.

Nearly every loop contains a round whose deliverable is a recommendation to someone non-technical. Practise stating a conclusion, the confidence attached to it, and the cost of being wrong in each direction, because that triple is the artifact being graded.

Focus areas

  • Size positions by risk contribution, not conviction
  • Separate forecast decay from execution cost
  • Model impact and borrow before claiming capacity

Overview

The impact of this role is immediate and highly visible. Aqr relies on systematic, data-driven strategies to manage billions of dollars in assets. As a Data Scientist, your research and modeling decisions directly influence the investment strategies deployed by the firm. Whether you are working with traditional market data or unstructured alternative datasets, your objective is to find repeatable, statistically sound patterns that can survive real-world market friction.

What makes this position both highly prestigious and exceptionally challenging is 's deeply academic culture. Founded by quantitative pioneers, the firm approaches financial markets with the rigor of a university research lab combined with the speed and execution of a top-tier financial institution. You will collaborate with leading researchers and engineers to solve high-dimensional problems where even a marginal improvement in predictive power can yield significant business value.

The Aqr interview process

Aqr candidates report 4 rounds · ≈ 3-5 weeks. The stages below are what candidates describe, not a published process.

HR Screening

Whoever runs this call is usually not a practitioner. They take notes, and a hiring manager skims those notes later, so the real question is whether your work survives being written down by someone outside the field. Test every project sentence against that: could a non-specialist repeat it correctly without knowing what a propensity score is? Carry a plain-language version of each project and one reason you want this particular role that you could not copy onto another application. Vagueness at this stage reads as inexperience, even when the underlying work was genuinely deep.

What to demonstrate

  • Whether a non-specialist can restate your projects accurately, since their paraphrase is what reaches the hiring manager
  • Whether your reason for wanting the role points at the work itself rather than the company's reputation
  • Whether your language signals the level being screened for: what you decided yourself versus what you were handed

How to prepare

  • Write a two-sentence, jargon-free version of each major project: the question nobody could answer, and the decision your work changed. Read it to someone outside data and have them repeat it back
  • Point your 'why this role' answer at something concrete in the job description or the product surface you would be working on, and keep it to two sentences
  • Have two questions ready about measurement: which metric the team is held to, and who acts on an analysis once it lands

Technical Phone Interview

Much of what gets scored here happens out loud while you type. Nobody can see your reasoning inside a half-written query, so five silent minutes read as being stuck even when they are not. State the plan in plain language first: which tables, what grain you are aggregating to, and the one filter that defines the population. Then write it. The narration doubles as insurance, because a wrong plan gets caught early and cheaply while a wrong query gets caught at the end with no time left to redo it. A timed statistics section, where one exists, is a separate test with its own clock.

What to demonstrate

  • Whether the query you write matches the plan you just described
  • What you do with a hint, meaning whether the correction gets absorbed or the first approach gets defended
  • Whether you can debug your own wrong output by reading the result set and naming which part of the query produced the anomaly

How to prepare

  • Solve three problems while screen-sharing into a recording, then watch it back and mark every stretch longer than thirty seconds where you said nothing
  • Practise compressing the plan into one sentence before typing, then check afterwards whether the finished query actually matched it
  • Time yourself on statistics questions that carry a business reading, such as what a confidence interval does and does not claim, rather than re-reading notes without a clock

Superday Invitation

Where a loop includes a partner from outside the data team, that conversation usually carries the same weight as the technical ones and gets the least preparation. The person opposite you will not follow a derivation and does not need to. They are working out whether having you involved would make their decisions better or slower. The failure mode is not being too technical. It is answering a question about a decision with a description of your method, leaving the translation to them. What they carry into the debrief is the sentence you handed them, not the analysis underneath it.

What to demonstrate

  • Whether a statistical result arrives as something the partner could act on, with the one caveat that would change their decision kept and the rest left out
  • Whether you can state what you need from their side, in their terms: instrumentation that does not exist yet, a definition they own, or a holdout they have to agree to
  • Whether uncertainty is given as a range someone can plan against, rather than as hedging that invites them to ignore the result
  • Whether you ask what decision is actually on the table before explaining anything

How to prepare

  • Take a result you know well and write the version for someone who stops reading after one sentence, then the three-minute version, and check the short one is not the long one with the qualifications stripped out
  • For a past project, list everything you asked a non-technical partner for and how you phrased it, then rewrite each ask so it names what goes unmeasured without it
  • Practise saying where a result does not apply, out loud, in one sentence that a partner could repeat accurately to someone else

Superday

A day of back-to-back interviews samples your floor, not your ceiling. Four hours in, the habits that carry a good answer are the first to go: restating the question before solving it, asking what the data would have to look like, checking a number before quoting it. What the day decides is whether the tired version of you is still someone to leave alone with an ambiguous problem. The round that sinks a candidate is usually not the hardest one. It is the one immediately after the round that went badly.

What to demonstrate

  • Whether the late rounds get the same clarifying questions as the first one, or whether you start answering immediately to save effort
  • Whether a weak answer stays in the room it happened in, instead of following you into the next conversation as apology or distraction
  • Whether the quality of your questions holds up, since fatigue removes curiosity about the problem before it removes knowledge of the method

How to prepare

  • Rehearse the length, not just the content: book four mock interviews of different types in one afternoon with short gaps, because the one you need to observe is the fourth
  • Put the two or three questions you ask at the start of any problem on a card in front of you, so that under fatigue it is a habit you run rather than a decision you make
  • Decide in advance what the gap between rooms is for: water, one line of notes on anything you promised to follow up, and an explicit close on the round that just ended so it does not travel
  • Prepare a different closing question for each interviewer, so the end of a long day does not produce the same one four times

Where candidates lose points

Reporting the best backtest out of many trials as if it were a single pre-registered test.

The maximum of N noisy Sharpe estimates grows roughly like the standard error times sqrt(2 ln N) even when every underlying strategy has zero edge, so with a few hundred variants an in-sample Sharpe near 1 is the expected result of pure noise. Worse, the search is rarely counted honestly: parameter sweeps, universe changes, date-range choices and feature variants all count as trials. Quote the number of configurations tried, deflate the Sharpe for it, and keep a genuinely untouched holdout period. Note also that the asymptotic standard error of a Sharpe estimate is approximately sqrt((1 + SR^2/2)/T) for i.i.d. normal returns, which for three years of daily data is roughly 0.33, so two strategies differing by 0.3 in Sharpe are not distinguishable.

Filtering on as_of_date rather than knowledge_ts, so restated fundamentals, revised index constituents and retroactively applied split and dividend adjustments enter the backtest before they were knowable.

Vendors overwrite history in place. A quarterly figure filed 45 days after period end is stored against period end, an index addition announced five business days before it takes effect is stored against the effective date, and a split applied tonight rewrites every prior close in the adjusted series. Each of those gives the strategy information it could not have had, and the resulting lift is concentrated in the highest-turnover, highest-apparent-alpha names. The signal_score table separates the two timestamps precisely so this filter can be written correctly.

Never asking what decision the analysis will inform

Open with who makes the decision, what the options are, and by when. The answer determines the precision you need, the segments worth cutting, and whether an observational read suffices or an experiment is required.

Reporting a p-value with no effect size or interval

Give the estimated difference with a confidence interval in the units the business cares about, then say whether that whole interval is worth acting on. A p-value only addresses whether you can rule out exactly zero; it says nothing about magnitude.

Questions & practice

How do you define and calculate the bias-variance tradeoff mathematically?

Medium · statistics and probability

Approach

  1. Translate the result into the decision it informs, in one plain sentence.
  2. Sanity-check the answer against a simple bound or a simulated case.
  3. Say what the estimate is of, and over what population it generalises.

Follow-up

  • How would you explain this result to someone who does not know statistics?
  • Which assumption here is most likely to be violated in practice?

Explain the concept of finite difference methods and describe how you would apply them to solve a differential equation.

Medium · statistics and probability

Approach

  1. Sanity-check the answer against a simple bound or a simulated case.
  2. Translate the result into the decision it informs, in one plain sentence.
  3. Quantify uncertainty explicitly rather than reporting a point estimate alone.

Follow-up

  • Which assumption here is most likely to be violated in practice?
  • How would you explain this result to someone who does not know statistics?

Provide a proof or intuitive explanation of the Central Limit Theorem and explain its significance in statistical hypothesis testing.

Medium · statistics and probability

Approach

  1. Quantify uncertainty explicitly rather than reporting a point estimate alone.
  2. Say what the estimate is of, and over what population it generalises.
  3. Write down the assumption the method needs before you use the method.

Follow-up

  • What sample size would you need to detect an effect half this size?
  • Which assumption here is most likely to be violated in practice?

How do you perform model selection when dealing with highly collinear features in a financial dataset?

Medium · machine learning and modelling

Approach

  1. Set a baseline first, so any model has something honest to beat.
  2. Say how the offline result would be validated online before it is trusted.
  3. Pick an evaluation metric that matches the cost of each error type, not a default.

Follow-up

  • What would you monitor after launch to know the model is still valid?
  • Where could label leakage enter this setup?

Walk me through the fundamental assumptions of Ordinary Least Squares (OLS) linear regression. What happens to your model if these assumptions are violated?

Medium · machine learning and modelling

Approach

  1. Set a baseline first, so any model has something honest to beat.
  2. Pick an evaluation metric that matches the cost of each error type, not a default.
  3. Say how the offline result would be validated online before it is trusted.

Follow-up

  • What would you monitor after launch to know the model is still valid?
  • Where could label leakage enter this setup?

What are the differences between L1 (Lasso) and L2 (Ridge) regularization, and how do they affect the sparsity of your model's coefficients?

Medium · machine learning and modelling

Approach

  1. Pick an evaluation metric that matches the cost of each error type, not a default.
  2. Check what information would not exist at prediction time, and exclude it.
  3. Say how the offline result would be validated online before it is trusted.

Follow-up

  • Where could label leakage enter this setup?
  • How would you choose the decision threshold, and who owns that choice?

Annualized information ratio with an honest standard error

Easy · performance · inference · pandas

You are given active, one row per (account_id, business_date) with active_return: the daily arithmetic portfolio-minus-benchmark return, net of all costs, as a decimal. Three accounts, roughly 750 business days each. Rows are absent on exchange holidays and on days before an account's funded_date. Per account, compute the annualized information ratio (mean times 252, divided by standard deviation times sqrt(252)) and an approximate standard error for that ratio, then report a 95% interval. Do not reindex onto a calendar. State what T you used and why.

Approach

  1. Drop null active_return per account rather than filling it. T must be the number of days the account actually traded: holidays and pre-funding days are not evidence, and treating them as such changes both the point estimate and the interval.
  2. Compute the daily mean m and the daily standard deviation s with ddof=1. The annualized IR is (m/s)*sqrt(252), because the 252 in the numerator and the sqrt(252) in the denominator collapse to a single sqrt(252) factor. Say that out loud instead of writing two separate annualizations that can drift apart.
  3. Take the standard error at the frequency the statistic is estimated at: SE(SR_daily) is approximately sqrt((1 + SR_daily^2/2)/T) for i.i.d. normal returns, then scale it by sqrt(252), the same factor as the point estimate. At daily frequency SR_daily^2/2 is of order 1e-3, so the SE is effectively sqrt(252/T) and depends only on elapsed years.
  4. Report IR plus or minus 1.96*SE per account, and check the lag-1 autocorrelation of active_return. The i.i.d. assumption behind that SE is the same assumption that justifies the sqrt(252) scaling, so if the series is autocorrelated both numbers need widening and you should say by how much.

Worked solution (20 min)

  1. groupby('account_id'), dropna on active_return, and record n per account before anything else.
  2. Per account compute m = mean, s = std(ddof=1), ir = m/s*sqrt(252).
  3. sr_d = m/s; se_ann = sqrt((1 + sr_d**2/2)/n)sqrt(252); interval = ir +/- 1.96se_ann.
  4. Compute lag-1 autocorrelation of active_return per account and print it in the same table as the interval.

Expected result: For an account with an annualized IR of 1.0 over 756 trading days the standard error is about 0.58 (sqrt(252/756) = 0.577; the SR^2/2 term moves it by under 0.1%), so the 95% interval runs roughly from -0.13 to 2.13 and the IR is not distinguishable from zero. Three years of daily data cannot establish an IR of 1.

Verify it yourself

  • sqrt(252/T) must reproduce your standard error to three decimals at daily frequency; a materially different number means you annualized the SE by 252 rather than sqrt(252).
  • Computing IR as (m252)/(ssqrt(252)) must equal (m/s)*sqrt(252) exactly.
  • Doubling the sample length should shrink the interval by sqrt(2), not by 2.

Follow-up

  • The shortest account has 14 months of history. How much of the spread between the best and worst account IR is explainable by sampling noise alone?
  • One account carries mark_source = 'vendor_eval' on 30% of days. What does that do to the denominator, and to the independence assumption behind the standard error?
  • How many years of daily data would you need to distinguish an IR of 0.8 from an IR of 1.1 at 95% confidence?

Reconstruct a point-in-time universe from effective-dated reference data

Easy · scd2 · point-in-time · temporal-join

instrument_master is effective-dated: one row per instrument_id per version, valid over [effective_from, effective_to), with effective_to NULL while the version is open. Other columns include ticker, asset_class, primary_exchange_mic, status, is_shortable, listing_date and delisting_date. Write one query returning every instrument that was a listed, shortable equity as of 2023-06-30 17:00 UTC: one row per instrument_id, carrying the ticker in force at that instant. The result must still contain names that have delisted since.

Approach

  1. Predicate on the validity window rather than on the latest row: effective_from <= :ts AND (effective_to > :ts OR effective_to IS NULL). The half-open form is what guarantees exactly one row per instrument_id when one version ends at the same instant the next begins.
  2. Read the attributes from that version, not from today's row: asset_class = 'equity', is_shortable, and status as recorded in the version. Today's status is the wrong fact for a past date.
  3. Bound the lifecycle separately: listing_date <= :ts::date AND (delisting_date IS NULL OR delisting_date > :ts::date), so pre-IPO shells and names already dead on that date drop out on that date's own terms.
  4. Probe uniqueness with GROUP BY instrument_id HAVING COUNT(*) > 1. A duplicate means the source has overlapping versions, which is a data-quality finding to escalate, not something to paper over with DISTINCT.
  5. Confirm the temporal behaviour by re-running with the timestamp moved past a known delisting and checking the name disappears then, and only then.

Worked solution (20 min)

  1. Write the range predicate as a CTE parameterised on the cutoff timestamp so the same text is reusable per date.
  2. Add the attribute filters inside the CTE, then the listing/delisting bounds in the outer select.
  3. Run the duplicate probe on instrument_id and confirm it returns no rows.
  4. Re-run with effective_to IS NULL substituted for the range predicate and diff the two result sets.
  5. Inspect the diff: every row present only in the correct version should have a non-null delisting_date or a later reference-data amendment.

Expected result: One row per instrument_id whose open version at 2023-06-30T17:00Z had asset_class = 'equity' and is_shortable = TRUE, including instruments whose current version now reads status = 'delisted'.

Verify it yourself

  • COUNT(*) equals COUNT(DISTINCT instrument_id).
  • No returned row has delisting_date <= DATE '2023-06-30'.
  • At least one returned row has a non-null delisting_date, proving the survivor-only failure did not occur.
  • The effective_to IS NULL variant returns a different set, and every row it drops is explainable by a delisting or a later amendment.

Follow-up

  • The vendor backdates a correction, so effective_from for a new version precedes an existing one and your query returns two rows for one instrument_id. How do you resolve it, and what does loaded_at let you express that effective_from cannot?
  • Someone proposes joining research panels on ticker because it is human-readable. Give a concrete failure mode with a date attached.
  • How would you turn this single-date query into one that produces the universe for every date in a range without a loop?

Order fill funnel by execution algorithm, in counts and notional

Easy · funnel · conditional-aggregation · cohorting

From parent_order (order_id, algo_name, order_qty, filled_qty, status, arrival_ts, arrival_mid_px), build a monthly funnel per algo_name over orders whose arrival_ts falls in the month: orders released, orders with any fill (filled_qty > 0), orders fully filled (status = 'filled'), and the two step conversion rates. Produce the same funnel in notional, using order_qty * arrival_mid_px. Orders with status = 'rejected' never reached the market — state how you treat them and implement that choice.

Approach

  1. Use conditional aggregation in a single pass — COUNT(*) FILTER (WHERE filled_qty > 0) and friends — rather than three subqueries joined together, so every numerator and denominator provably comes from the same row set.
  2. Make the denominator decision explicit: rejects are an order-management outcome, not an execution outcome, so exclude them from both numerator and denominator and report their count in a separate column. An exclusion you cannot see in the output is an exclusion nobody can audit.
  3. Cast before dividing. With integer counts, filled / released floors to 0 in Postgres; filled::numeric / NULLIF(released, 0) gives the rate and also handles an algo with zero orders in the month.
  4. Compute the notional funnel with the same FILTER clauses over SUM(order_qty * arrival_mid_px). Divergence between the count funnel and the notional funnel is the finding: 60 percent of orders completing but 20 percent of notional means the large orders are the ones stalling.
  5. Group by date_trunc('month', arrival_ts) and algo_name, and left-join a distinct algo list if months with zero activity must still appear as rows.

Follow-up

  • filled_qty sits on the parent but the fills live in execution_fill. How would you find parents whose filled_qty disagrees with the sum of their non-correction fills, and which side would you trust?
  • The fully-filled rate rises after participation_rate_target is lowered. Is that an improvement, and what second metric settles it?

Measure crowding in a signal you cannot observe others trading

Hard · proxy-design · crowding · bias · risk-reporting

Research suspects the edge is eroding because other participants hold the same positions. Nobody outside the firm reports their book, so the quantity of interest is unobservable. Build the measurement anyway. Propose two or three proxies from data the firm already has in position_daily (borrow_rate_bps, borrow_status, financing_cost_base_day, market_value_base), execution_fill (fill_px, prevailing_bid_px, prevailing_ask_px, liquidity_flag) and parent_order (arrival_mid_px, adv_20d, filled_qty). State the bias in each, name the single number you would put on a monthly risk report, and say what would retire it.

Approach

  1. Write the estimand down before proposing anything: the notional held by others in positions correlated with ours, or operationally, the extra cost and extra drawdown we incur when those holders unwind at the same time we do. Without a stated estimand there is nothing for a bias to be a bias relative to.
  2. Proxy A, borrow scarcity on the short leg: short-notional-weighted borrow_rate_bps and the share of short notional in borrow_status = 'hard_to_borrow'. Bias: it is confounded with lending supply, which moves with index-fund lending programmes, corporate actions and seasonal recalls, so use the spread against a broad borrow benchmark rather than the level.
  3. Proxy B, impact residual: realized implementation shortfall minus the impact model's prediction at matched participation (filled_qty over adv_20d) and matched volatility, since crowded names should cost more than the curve says. Bias: the residual absorbs every misspecification of the curve, including volatility regime and schedule changes, and it is mechanically correlated with the desk's own growth, so it cannot separate others arriving from us getting bigger.
  4. Proxy C, co-movement: correlation between the strategy's daily long-short return and a generic version of the same factor, public or internally reconstructed. Rising correlation alongside falling own-IC is what commoditisation looks like. Bias: the reference series carries its own survivorship and construction choices, and the correlation also rises for benign reasons when factor volatility rises.
  5. Pick one headline and justify the choice. A composite z-score invites false precision by averaging three different biases into one clean-looking number, so prefer a single directional series such as the benchmarked borrow spread, with the other two printed as context. State the retirement condition: a direct holdings source becomes available, or the proxy moves for six months with no matching move in the consequences it claims to predict, namely cost and drawdown.
  6. Write on the report itself what it does not claim. None of these identifies crowding; each is consistent with several explanations. The output is a prompt to review position sizing, not a measurement of a quantity.

Worked solution (40 min)

  1. Build a 36-month monthly panel of the three proxies, applying the benchmark differencing to the borrow series before anything else.
  2. Refit the impact curve on a period-matched sample and hold order size fixed when scoring the residual, so the desk's own growth in participation does not enter as crowding.
  3. Regress each proxy on the two most plausible confounders, broad volatility and the desk's own average participation, and keep the residualized series.
  4. Test all three against a known crowded-unwind episode in the sample; every proxy claiming to measure the estimand must move there.
  5. Write the one-page report: one headline series, two context series, an explicit bias sentence under each, and the retirement condition.

Expected result: A monthly one-page indicator carrying three residualized series, each with its bias stated in writing, one designated headline series, and an explicit sentence that the indicator cannot identify crowding and exists to trigger a position-sizing review rather than to estimate a quantity.

Verify it yourself

  • On the known unwind episode the three proxies should co-move. A flat one means either the episode is misdated or that proxy measures something else.
  • The impact-residual series must have mean near zero over its fitting window by construction; a persistent non-zero mean means it is being scored on a different sample than it was fitted on.
  • After benchmark differencing, the borrow proxy should be close to uncorrelated with broad market volatility. Strong residual correlation means the benchmark is not absorbing the supply-side moves it was chosen for.

Follow-up

  • The borrow spread widens 60 basis points with no move in the impact residual or in co-movement. What goes in the report?
  • How would you falsify the crowding hypothesis using an event already in your data, such as a large single-day factor reversal?
  • If you had one month of a direct holdings feed, what would you check first to calibrate or discard these proxies?

Size an execution algorithm test on implementation shortfall

Easy · power · mde · execution

Per-order implementation shortfall against arrival price, computed from parent_order (order_qty, filled_qty, arrival_mid_px, avg_fill_px, adv_20d) and execution_fill (commission_amt, exchange_fee_amt, rebate_amt), has averaged 12.4 bps with a standard deviation of 35 bps over the trailing twelve months. The desk releases roughly 1,900 parent orders a month. An execution team proposes a new child-order scheduler and claims a 1.5 bps improvement. Size a two-arm, order-level randomised test at 80 percent power and a two-sided 5 percent level, and say how long it has to run.

Approach

  1. Pin the response variable to the exact metric definition before touching the arithmetic: shortfall in bps versus arrival_mid_px, with commission, exchange fee and rebate included and the unfilled remainder (order_qty minus filled_qty) charged at the terminal mid. The sigma you plug in has to be the standard deviation of that quantity, not of a convenient proxy.
  2. Estimate sigma from the trailing twelve months of the same order population rather than from a remembered number. Shortfall is heavy tailed, so also compute a winsorised sigma and quote the sample size both ways, because the difference tells you how much of your power calculation rests on a handful of orders.
  3. Apply the two-sample difference-in-means formula, n per arm = 2 * sigma^2 * (z_{0.975} + z_{0.80})^2 / delta^2, which under equal allocation reduces to 15.7 * sigma^2 / delta^2.
  4. Decide whether the shipping decision is made on the equal-weighted per-order mean or the notional-weighted mean, because they have different variances. For a weighted mean the effective sample size is (sum of weights)^2 / (sum of squared weights), and notional weights in a book with a long tail of large orders can cut that well below the row count.
  5. Convert to calendar time at realised flow and check the answer against the business horizon. If nine months is unacceptable, the legitimate levers are a larger delta, lower power accepted explicitly, or variance reduction; shortening the test while keeping the same stopping rule is not one of them.

Follow-up

  • What happens to the required sample size if the committee decides on the notional-weighted mean instead of the equal-weighted mean?
  • At 1,900 orders a month, what effect size can you detect in a single month, and would you run that test at all?
  • If the real goal is 'no worse than the incumbent', how do you set the non-inferiority margin and what changes in the test?

Turnover doubled in a week with unchanged positions

Medium · definition drift · turnover · data semantics · reconciliation

Annualized one-way turnover for a strategy reads 368 percent this month against 180 percent last month. Position_daily shows end-of-day quantities and market_value_base following their usual pattern, and neither the signal nor portfolio construction was touched. Tables: execution_fill (fill_id, order_id, side, fill_qty, fill_px, is_correction, corrects_fill_id, exec_ts, currency) and position_daily (business_date, account_id, instrument_id, quantity, market_value_base). The catalogue definition is: monthly sum of min(total buy notional, total sell notional), over average end-of-day gross market value, times 12. Find the cause and prove it.

Approach

  1. Split the ratio and chart the numerator and the denominator as separate monthly series before interpreting either. A ratio that moved tells you nothing about which side moved, and the two sides have unrelated failure modes.
  2. Read the magnitude as evidence. A jump close to a factor of two, in a book whose buy and sell notional are nearly balanced, is the signature of min(buy, sell) having become buy plus sell. No strategy change produces a suspiciously round multiple in a week.
  3. Reconstruct the numerator yourself from the catalogue definition and compare it with the reported figure for both months. If your recomputation matches last month and not this month, the expression changed, and the scheduled job's query or its version history says when.
  4. Rule out the competing mechanism before closing. Correction rows arrive as new rows referencing corrects_fill_id, so a naive SUM(fill_qty) counts the correction and never removes the original. Size the corrected notional separately instead of assuming it is small.
  5. Reconcile to the book of record. Day-over-day change in position_daily.quantity per instrument must equal that day's net signed fills, which bounds true traded quantity independently of whichever expression the report used.

Follow-up

  • Correction rows turn out to be 0.8 percent of notional. Write the numerator expression that handles them correctly in one pass.
  • Your reconciliation against position_daily leaves a residual on two instruments. Which legitimate causes would you rule out before calling it a data bug?
  • What would you add to the pipeline so a metric definition cannot change without the change being visible in the report itself?

Suggested practice checklist

Instead of guessing where the week should go, day one measures it under a fixed rubric and allocates the remaining hours in proportion to the gaps. The method is deliberately rigid: the allocation is written down before any studying starts and is not renegotiated when a topic turns out to be unpleasant.

Day 1 — Diagnostic, scored before you study anything

  • Sit a 100-minute timed diagnostic in four blocks: 30 minutes of SQL across three prompts, 25 minutes of short-answer statistics, 25 minutes on one modelling or case prompt, and 20 minutes delivering one behavioural story aloud.
  • Score each block from 0 to 3 on a fixed rubric where 3 is correct and fluent, 2 is correct but slow or prompted, 1 is partially correct, and 0 is stuck, grading the output rather than how the attempt felt.
  • Allocate the hours for days two to five roughly in proportion to 3 minus the score in each block, write the allocation down, and commit to not revising it midweek.

Deliverable: A scored rubric and a fixed hour allocation for the rest of the week.

Day 2 — Largest gap: find the boundary rather than the subject

  • Break the weakest area into five named sub-skills (for query work: grain control, window frames, date arithmetic, set logic with NULLs, and reading a query plan) and rate each one, so the rest of the week targets a sub-skill instead of a subject.
  • Solve three problems chosen to sit just above where the rating drops off, and for each write the first move you failed to make.
  • Re-solve one of them from memory four hours later, on paper, with nothing open.

Deliverable: A five-item sub-skill map with the two blocking sub-skills circled.

Day 3 — Largest gap: drill the blocking sub-skill

  • Do eight short repetitions of the same shape rather than eight different problems, so what you practise is the pattern and not the puzzle.
  • Write the rule you now hold in one sentence, then test it against a case built to break it: a ranking function over a column with ties, or a two-sample test on observations that are obviously dependent.
  • Have someone else read your one-sentence rule and find the precondition you left out.

Deliverable: One rule statement with its preconditions attached and one counterexample that would have caught the incomplete version.

Day 4 — Second gap, plus maintenance on your strongest area

  • Run the same sub-skill map and boundary protocol on the second-largest gap, compressed into half the day.
  • Spend 25 timed minutes on your strongest area to stop it decaying, choosing the hardest problem you can still finish rather than an easy warm-up.
  • Compare how the two areas fail: whether you lose time on recall, on setup, or on arithmetic, because the fix differs for each.

Deliverable: A second sub-skill map plus a one-line diagnosis of how each area fails you.

Day 5 — The gap that is not a skill

  • Record yourself answering one technical and one behavioural prompt, then count two things in the playback: how many seconds before your first clarifying question, and how many sentences you started without knowing where they ended.
  • Rewrite your three most-used stock phrases into shorter versions, and practise saying "I do not know, here is how I would find out" without softening it into a guess.
  • Deliver one answer again with a hard 90-second limit to force structure before detail.

Deliverable: Two recordings with a counted improvement in time-to-first-question.

Day 6 — Retest under day-one conditions

  • Sit the same 100-minute diagnostic structure with new prompts of comparable difficulty and score it on the identical rubric.
  • Compare block by block, and for any block that did not move, change the method rather than adding hours: a block stuck at 1 usually means the practice was too varied, not too short.
  • Write which single block you would still lose the offer on.

Deliverable: A second scored rubric placed next to the first, with one named remaining risk.

Day 7 — Full loop under interview conditions

  • Run a 60-minute mock covering the two blocks that moved least, with an interviewer instructed to interrupt and change direction.
  • Write your recovery script for the moment you go blank: restate the question, state your assumption, name the first thing you would check.
  • Reduce the week to the rule statements you wrote, each with its preconditions attached, then say every one of them out loud without reading it and cut any you cannot state in a single sentence, since a rule you have to reconstruct mid-answer will not survive being interrupted.

Deliverable: A one-page card holding the recovery script and only the rules you could state from memory.

Stories where someone disagreed with you

Have two ready. In one, the data was on your side and you had to move someone who outranked you. In the other, the pushback was correct and you changed position. The second is the harder story and it lands better, because it shows you separate being right from being attached to an answer. Name the person's actual objection.

How do you handle a situation where your model performs exceptionally well on backtested data but fails to generalize to live, out-of-sample data?

Medium · behavioural and stakeholder questions

Approach

  1. Quantify the outcome, including what you would not claim credit for.
  2. State the situation in two sentences and spend the rest on your reasoning.
  3. Name the disagreement or constraint, and how you resolved it with evidence.

Follow-up

  • How did you know the outcome was caused by your change?
  • What would you do differently if you ran that project again?

Walk me through a research project or thesis you have recently completed. Why did you choose your specific data handling and validation techniques?

Medium · behavioural and stakeholder questions

Approach

  1. Pick a story where you drove the decision, not one where you observed it.
  2. Name the disagreement or constraint, and how you resolved it with evidence.
  3. Quantify the outcome, including what you would not claim credit for.

Follow-up

  • What did you decide not to do, and why?
  • How did you know the outcome was caused by your change?

Ranking three quarters of requests into one quarter of capacity

Hard · prioritisation · expected value · stakeholder management

You are the only data scientist supporting three groups for one quarter. The execution desk wants the market-impact curve recalibrated; the last fit is fourteen months old and predates a volatility regime change. A portfolio manager wants a new signal researched. The client team wants a Brinson attribution that reconciles to reported active return, because it currently leaves an unexplained residual of roughly 40 bps a year. Each group believes theirs is first. Produce a ranked plan, the decision rule you used, and what you tell the two groups who do not go first.

Approach

  1. What is probed: whether you can price work in the firm's units rather than in the requester's urgency, and whether the rule you used survives being stated out loud to the people it ranks last.
  2. Convert each request into expected basis points of net active return per year with an explicit range, then divide by weeks of your time. The impact recalibration applies to every order: at 150 percent annualized one-way turnover the book trades roughly three times average gross per year counting both sides, so a 2 bps shortfall improvement is about 6 bps of gross annually. Small, high confidence, and applies whether or not any research succeeds.
  3. Price the signal as an expected value rather than a hoped-for one. Most researched signals do not survive deflation for the number of configurations tried, since the maximum of many noisy Sharpe estimates grows roughly like the standard error times the square root of twice the natural log of the number of trials even with no true edge. A plausible 0.2 information-ratio contribution at a one-in-five survival rate is a large number heavily discounted, with a long right tail that is the reason to do it at all.
  4. Price the attribution request by what it protects rather than by what it earns. A 40 bps unexplained residual is a number clients see, and attribution that does not reconcile is a credibility cost that surfaces later in the dollar redemption rate. Defensive work can rank first without generating a single basis point of alpha.
  5. Rank, then sequence for parallelism. Put the short, high-confidence item first if it unblocks somebody else's work, and schedule the long-tailed research where a failure is cheap and discoverable early. State the rule before the numbers, so the groups who lose can argue with the inputs rather than with your loyalties.
  6. Give each deferred group something real: a date, the specific input that would change the ranking, and the smallest useful piece you will do now, such as a one-day bisection of the 40 bps residual that tells the client team whether it is pricing, cash or trade timing.

Follow-up

  • The portfolio manager escalates to your manager's manager. What do you say, and what do you not say?
  • The quarter shortens by four weeks. Which item do you drop entirely rather than shrink?
  • How do you avoid becoming the person who always picks the execution desk's work because it is the easiest to quantify?