TEJAS PANDYA — quantitative finance
Résumé
Tejas Pandya · Quantitative finance

Nothing is free. The work is pricing the trade-off.

Every model is a bet on what you can safely ignore. I spent three years at Nomura watching those bets meet production, and I'm finishing an MS in Financial Engineering at NYU Tandon to make better ones. I lag every input to the date it was published, test before I trust, and publish what didn't work.

Open to full-time quant roles from 2027: research, trading, development, risk · New York
MS Financial Engineering · NYU Tandon '27 ex-Nomura market risk Python · C++20 · SQL
paths 0hover to add paths
3 yrsmarket risk · Nomura
12tested, CI'd repositories
3.84MSFE GPA · NYU Tandon
~21Mmsg/s · C++20 matching engine
Amihud t-stat5.32ML combo Sharpe0.79Equal-weight Sharpe−0.57Wrong-way risk+16.9% CVAPeak PFE$13.5MTWAP vs AC4.7 / 7.5 bpsRL vs closed form0.060 bpsMatching engine~21M msg/sBS · MC · FDwithin 0.6%Ridge, refit yearly0.65 → 0.35Multi-period net Sharpe0.50–0.70EIA events112 / 79 corroboratedBasel 2.5 / FRTB100% reconciledManual work removed50+ h / month
What I bring

Four quant tracks, each backed by shipped work

One profile, four seats. Research, trading, development and risk draw on the same habits: careful data, honest statistics and code that is tested before it is trusted. Here is the evidence for each, with the résumé written for it.

Researchsignals · inference · ML

Claims I can defend under scrutiny

Cross-sectional alpha on 495 names, scored with Newey–West inference and false-discovery control. Purged walk-forward learning. A look-ahead found in a published regime backtest, then measured. Every t-statistic here is a claim that had to survive its own robustness check.

Tradingexecution · options · market making

Models that meet a real order book

Almgren–Chriss calibrated to a live Deribit book and stress-tested against a learning agent. SABR fitted to the BTC volatility smile. A Deribit options market maker in progress, with latency-aware fills, delta hedging and P&L after fees.

DevelopmentC++20 · Python · data

Systems built for the hot path

A zero-allocation C++20 matching engine clearing ~21M messages a second. An options library that prices three independent ways and agrees to within 0.6%. Python and SQL pipelines at Nomura that removed 50+ hours of manual work a month.

Riskmarket · regulatory · counterparty

Three years of numbers that had to reconcile

Three years owning VaR and sensitivity models across equities, rates, FX and commodities at Nomura, with Basel 2.5 and FRTB submissions reconciled 100% to front-office systems. Since then, a historical CVA that measures wrong-way risk by experiment rather than assuming it.

Now building

Work in progress, reported as it goes

Market making · derivatives

Deribit BTC options market maker

A C++20 engine that replays recorded Deribit order books, runs several quoting strategies side by side, simulates fills with latency, hedges delta on the BTC perpetual, and reports P&L after fees and adverse selection. The same engine then runs live on paper. If a strategy loses money after costs, that is the result. Three milestones are done: the engine replays a full recorded day, 15.9M events, in 120 seconds, and per-expiry SABR fits on recorded data (β = 0.5, chosen over 1.0 across 98,799 fits) price every quote.

In progress
  1. M1 · Recorderwebsocket recorder, book rebuild check, fee schedule
  2. M2 · C++ coreevents, order books, exchange-time clock; a day replays in 120 s
  3. M3 · PricingBlack-76, IV solver, SABR fits on recorded data
  4. M4 · Simulatorfills with latency, fees, accounts, first strategies
  5. M5 · Resultshedgers and the full strategy grid
  6. M6 · Livepaper-trading dashboard and demo video
7-day recording
2026-09-28 21:42 → 2026-10-05 21:42 UTC
C++20Pythonwebsockets ~120 options + BTC-PERPETUAL at 100 msrepository goes public at M6
Selected work

Six studies, each with its limitation stated

Every figure below is reproducible from its repository, covered by tests in CI, and reported with the assumption that could break it. Where a published effect failed to replicate, I say so. That is the standard a desk should expect: a number that can be defended in front of a risk committee, not one that only survives a slide.

01 — Signal research

Averaging your alpha signals loses money

Eight cross-sectional signals on 495 S&P 500 names, 2010–2026, six built from prices and two from the tone of 15,575 SEC filings, are scored by Spearman rank information coefficient with Newey–West t-statistics, then Benjamini–Hochberg across all eight tests. One survives: Amihud illiquidity. Low volatility and the lottery signals come out with the wrong sign.

So the obvious move, z-score everything and average, loses 7.8% a year at a Sharpe of −0.57. Learning the combination with LightGBM under purged walk-forward CV with a one-month embargo, charging 10 bps a side, reaches 0.79 out of sample: within a quarter-point of the best single signal at two-thirds of its drawdown.

The text factor was the filing calendar. A 10-K reads more negative than a 10-Q (median net tone −0.0164 against −0.0097), so differencing tone across form types hands every 10-Q→10-K transition a −0.0081 "signal". Differencing within form takes its t-statistic from 1.37 to 0.46 and its standalone Sharpe from +0.35 to −0.14. Both versions stay in the repo.
Limitation: the universe is current index members extended backward, so it is survivor-only. I would want point-in-time constituents before defending any single t-statistic.
github.com/tejaspandya9598/equity-xs-alpha ↗
SignalMean ICNW tHitBH q
amihud0.0325.3262%0.000
tone_chg_naive0.0071.3757%0.46
mom_12_10.0080.6954%0.60
strev_1m0.0060.6448%0.60
tone_chg0.0030.4655%0.65
skew_120d−0.004−0.7046%0.60
max5−0.015−1.1648%0.49
lowvol_60d−0.023−1.5047%0.46
Portfolio, netAnn. retVolSharpeMax DD
amihud8.5%8.2%1.03−13.5%
ml_combo7.3%9.3%0.79−9.1%
mom_12_12.0%16.0%0.12−36.7%
equal_weight−7.8%13.7%−0.57−69.1%
Tables as of September 3, 2026: 139 out-of-sample months from 2015-02. Standalone Amihud beats the learned combination on Sharpe, on 0.14 turnover where the combination needs 1.07. The combination's claim is the drawdown and honest signal selection, not a higher number.
02 — Execution

The optimal schedule, and the agent that rediscovered it

Calibrated to a live Deribit BTC-PERPETUAL book, with volatility, volume and the touch spread taken from the feed and impact scaled as 1/ADV, Almgren–Chriss takes 38% off TWAP's cost risk and pays for it. On a 10%-of-ADV order, $49.0M over five days on the October 2, 2026 book, that is 7.5 bps of expected impact against 4.7.

A policy-gradient agent trained on 207,361 real five-minute bars, cut into 5,752 three-hour episodes and split chronologically, sees only inputs estimated from bars that closed before each episode opened. It was never shown the closed form and converged to it anyway: 0.060 bps apart out of sample, paired t = 0.10.

Nothing beat TWAP, the closed form included. Almgren–Chriss costs 0.107 bps more (t = 0.38), because its theoretical edge is 0.6% of cost against a 49 bps per-episode standard deviation. What the agent did win was dispersion: 33.8 bps against TWAP's 49.2.
github.com/tejaspandya9598/optimal-execution ↗
Fig. 1 — Efficient frontier of execution
BTC-PERPETUAL, Oct 2, 2026 · 575 contracts (10% of ADV, $49.0M) · 5 days · 20 slices
drag or hover
Risk aversion λ—
Expected cost—
Cost risk σ—
Half-life—
Out of sample, bpsShortfallRiskObjectiveσ / episode
TWAP1.4990.0471.54649.2
Almgren–Chriss1.6230.0301.65339.8
REINFORCE agent1.6860.0261.71333.8
1,726 test episodes. A control variate, subtracting TWAP's cost on the identical price path, is what made the agent trainable: 1.993 → 1.713 bps. Gradients are hand-derived in NumPy and checked against central differences in CI.
03 — Portfolio construction

A look-ahead in my own published backtest, found and measured

Macro regimes from 120+ FRED-MD indicators, reduced by PCA and clustered by two-step K-Means, drive an MSCI sector allocation with every macro input lagged by its publication delay. The published backtest fitted the regime detector once on 1959–2023 data, so every month it traded before 2024 carried a label fitted with hindsight. Refitting the detector every January, on only the data available then, takes the headline Ridge book from a Sharpe of 0.65 to 0.35, below equal weight, while the simpler regime-mean forecaster holds up as the best long-short book in both universes: 0.77 in developed markets and 0.73 in emerging.

Position sizing is a convex program with trading costs inside the objective: an L1 turnover penalty, a Cholesky second-order-cone risk term and a quadratic impact term, re-solved monthly over a receding horizon. The impact coefficient is assumed, not fitted, so the useful test is sweeping it. Under walk-forward regimes the multi-period book holds a net Sharpe between 0.50 and 0.70 from 0 to 100 bps of linear cost, while the frictionless book falls to −0.28.

Where it does not hold: in emerging markets the frictionless book still leads at 10 bps, and the cost-aware book wins there only at high cost.
Audit of my own detector: against NBER dating and two alternatives on the same 798-month panel, the K-Means regime model calls a new regime every 3.8 months where NBER changes its mind every 44.7. It wins the cluster-quality scores only because they measure the Euclidean separation it optimizes. It is too jumpy, and that is the next thing to fix.
github.com/tejaspandya9598/macro-regime-allocation ↗
Fig. 2 — Net Sharpe vs. linear cost, walk-forward, developed
10 bps
Frictionless—
Cost-aware—
Multi-period—
04 — Rates & counterparty risk

P&L attribution that has to add up, and a CVA that tests its own assumption

A discount curve bootstrapped from FRED Treasury constant-maturity par yields marks a ten-swap, $255M book from 2 to 30 years. Every par instrument reprices to under 1e-9. Daily P&L splits into carry, roll-down and level, slope and curvature moves through key-rate durations, with convexity booked as an explicit residual so the parts reconcile to a full revaluation.

The same curves then drive counterparty exposure: 8,478 joint daily observations of the curve and Moody's credit spreads (1986–2026), block-bootstrapped into 20,000 thirty-year paths. Peak EPE $2.35M, peak PFE $13.5M. Wrong-way risk was priced by experiment: resampling rates and credit from the same days keeps their −0.38 correlation, resampling them from different days destroys it. The coupling is worth $89,553, 16.9% of CVA, and both runs share their curve paths bit-for-bit, so the difference cannot be Monte Carlo noise.

Scope: a Treasury curve, not SOFR fixings (ICE swap rates are licensed); one curve; a historical CVA rather than a risk-neutral desk reserve; no CSA. On a quiet day the residual is 0.9% of P&L. On April 16, 1980, when the curve fell 51–76bp, it is 9% — the honest limit of a first-order attribution.
github.com/tejaspandya9598/sofr-swap-pnl-attribution ↗
Fig. 3 — Attribution, Aug 31 → Sep 1, 2026
2–6bp sell-off
Reconciles to1e-6
Total P&L−237,106
Wrong-way risk+16.9% CVA
05 — Derivatives pricing

Three methods, one interface, and the gap between them documented

A dependency-free C++20 engine values the same contract three independent ways: closed-form Black–Scholes with analytic Greeks, Monte Carlo with exact terminal sampling, and a Crank–Nicolson finite-difference solver on a 400×400 grid — Thomas algorithm for Europeans, projected SOR on the early-exercise complementarity problem for Americans.

They agree to roughly 0.6% on an at-the-money call, pinned as regression tests. On barriers they don't, and that disagreement is the interesting part.

Where they diverge: checking a barrier only at each time step misses crossings between samples, so discretely monitored Monte Carlo overprices a 50-step up-and-out by more than $0.25 against the PDE. Weighting each step by the Brownian-bridge survival probability brings it within $0.05 at the same 50 steps, where naive monitoring is still wrong at 3,200. Both are asserted in tests.
github.com/tejaspandya9598/options-pricing-engine ↗
ContractBlack–ScholesMonte CarloCrank–Nicolson
European call10.450610.479410.4481
European put5.57355.56165.5711
American put——6.0875
Up-and-out call—3.51623.3326

Early-exercise premium

0.5139 — American 6.0875 less European 5.5735

Test tolerance

< $0.02 FDM · < $0.06 MC against a ~$10.45 price
06 — Market microstructure

The O(1) claim, with its fine print

A deterministic limit order book and matching engine in C++20 enforces strict price–time priority. Resting orders sit in intrusive doubly-linked lists per price level, so cancelling is a pointer splice rather than a search. A pre-warmed memory pool means the matching loop never allocates — which is what keeps the tail flat, not just the mean.

Prices are fixed-point unsigned integers with no floating point on the hot path, because float comparison in a price-priority book is a correctness defect rather than a slowdown.

The qualifier: "O(1) for everything" isn't true. Inserting at a new price level is O(log L) — the ordered map has to track the touch. Four of five hot-path operations are O(1); the fifth fires whenever the book opens a level it didn't have.
github.com/tejaspandya9598/hft-matching-engine ↗
OperationCostWhy
Add — existing levelO(1) avghash + tail append
Add — new levelO(log L)ordered-map insert
CancelO(1) avgintrusive splice
Execute at bestO(1) / fillFIFO head pop
Best bid / askO(1)map front

Throughput

~21M msg/s — Apple M2, dependency-free core~36M msg/s — Linux aarch64, same silicon

Not measured

Per-message latency. Only throughput was benchmarked, so no latency figure is quoted.
Further work

Six more studies, held to the same standard

07Volatility

SABR calibration to the live BTC smile

The calibration recovers α, ρ and ν to within 0.01 of the truth under 30bp of injected quote noise. On Deribit's 18SEP26 expiry it fits 21 strikes at 0.43 vol points RMSE, with the worst fit in the 95,000-strike wing.

Python · SciPy · Deribit API
08Surveillance

Spoofing and layering detection without labels

There are no labels, so it ranks rather than classifies. Isolation Forest and ECOD over 27 order-flow features agree on 76% of their top-5% flags; the ensemble exists for the other quarter.

Python · ECOD · Isolation Forest · PyTorch
09Commodities

34 years of futures settlement anomalies

Across WTI and Henry Hub settlements from EIA (1990–2024), the detector flags 112 events, 79 of them corroborated by an Isolation Forest. It had been blind to the −$37.63 WTI print because a log transform turned it into NaN.

Python · Streamlit · Plotly · EIA API
10Stat arb

A pairs backtester that rejects its own pairs

Five crypto perpetuals give 10 Engle–Granger tests, run on the first 60% of the sample only and put through Benjamini–Hochberg. Two pairs clear a raw p < 0.05 and none survives the correction, and the raw survivors change with the training window. The honest result is that there is nothing to trade.

Python · statsmodels · Deribit API
11Prediction markets

An arbitrage scanner that checks the basket is whole

It scans Polymarket multi-outcome events whose prices don't sum to 1, net of the quoted spread. A completeness bug once made 32 live legs of a 71-leg event, priced at 0.613, look like a 32% riskless arbitrage; two tests now pin the fix. On the October 2, 2026 snapshot, 8 of 200 events stay positive after the spread, the largest 1.7%.

Python · Polymarket Gamma API
12Machine learning

ML algorithms from scratch in NumPy

Trees, ensembles, SVM, MLP, LSTM and PCA, all written by hand in NumPy. Logistic regression, linear SVM and a decision tree match scikit-learn's test accuracy to four decimals; the random forest does not (0.937 against 0.958), and the README says so.

Python · NumPy · SciPy
Journey

Engineering, then finance, then production risk, then research

05/26 — 08/26

Quantitative Researcher — QWIM Industry Capstone

NYU Tandon · industry-hosted by Bank of America · five-person team, one model each
  • Owned the Regime Risk Budgeting model: equal risk contribution and hierarchical ERC on Conditional Drawdown-at-Risk over the S&P 500, US aggregate bonds, gold and commodities, built as a four-level ablation (regime-conditioned covariance, quantile-regression tail covariance, then an LPPLS bubble-confidence tilt) so each layer's contribution is measured rather than asserted.
  • Over 1999–2025 the full model lifts Sharpe to 0.55 against 0.37 for 60/40 and cuts maximum drawdown from −37% to −24% at about half the volatility, and it holds 0.56 against 0.50 on the 2008–2025 robustness window. Absolute return is lower, 5.4% against 5.7%: the win is risk, not return.
  • Aligned each leading-indicator series to its first release using ALFRED vintages, so data enters on the date it was published. Where the vintage archive starts late, earlier values are revised data lagged 35 days.
  • Wrote the research pipeline (4,777 lines of Python, 45 tests), the team dashboard tab and a Typst client-report exporter. Found the team test suite was running zero tests on macOS while reporting success, and fixed 13 faults to get 10,423 passing, with 22 pre-existing failures documented.
09/25 — 10/26

Graduate Teaching Assistant

NYU Tandon · Finance and Risk Engineering · three courses
  • FRE-GY 7811 Value Investing (Fall 2026): grade exams and homework, answer students' questions in office hours, and help the professor prepare course materials.
  • FRE-GY 6811 Financial Software Laboratory (Spring 2026): graded exams and homework and resolved students' questions on C++ and financial-software concepts in office hours.
  • FRE-GY 6023 Financial Economics (Fall 2025): graded exams and homework and resolved students' questions on micro-, macro- and financial economics in office hours.
08/22 — 07/25

Senior Risk Analyst — Market Risk Infrastructure

Nomura
  • Built Python and SQL pipelines reconciling daily P&L, positions and market data feeding VaR and sensitivity dashboards, removing 50+ hours a month of manual processing.
  • Owned the production lifecycle of VaR and sensitivity models across equities, rates, FX and commodities — daily backtesting and P&L attribution.
  • Built Python anomaly-flagging that attributed each exception to its cause — upstream data, a stale mark, a booking error — rather than merely raising it, cutting investigation time roughly 40%.
  • Partnered with front-office and regulatory teams on quarterly Basel 2.5 / FRTB stress testing and capital submissions, with rules-based validation reconciling 100% against front-office systems.
  • Led a three-person workstream that cut overnight batch runtime 35% and built the VaR and exception dashboard used by senior stakeholders.
Background

Education & tools

Education

MS Financial Engineering
NYU Tandon · expected 05/27 · 3.84/4.0
MBA, Finance
NMIMS Mumbai · 2022 · 3.3/4.0
BTech Mechanical Engineering
VIT · 2020 · 8.9/10.0

Languages & libraries

Python — NumPy, Pandas, Polars, SciPy, statsmodels, scikit-learn, LightGBM, PyTorch, cvxpy C++20 — STL, Boost, CMake, CTest SQL · MOSEK · Linux · Git · pytest

Domains

Market risk · VaR & sensitivities · FRTB · CVA Execution · market making · market microstructure Portfolio construction · risk budgeting · convex optimization Derivatives pricing · volatility calibration Statistical learning · econometrics · time series

Certifications

CFA Level IC++ for Financial Engineering — Baruch College Bloomberg Market ConceptsCFI FMVA