Back to Case Studies
Options Strategy Analysis

PDS Trader: Options Strategy Analysis and Portfolio Modeling

Web app for retail options traders to design multi-leg strategies as strike ranges, generate every viable spread combination, rank them by entry cost and four risk metrics, and project a P/L graph per spread. Selected positions move into portfolios with real-time pricing and exit tracking, and round-trip cleanly to the sister TradePartner platform for execution.

The Spyrol Group LLC logoClient: The Spyrol Group LLC (US)Ryan Jones, CEO13+ year client

30+

API Endpoints

2

Integrated Products

Live 2025

In Production

The Challenge

Building multi-leg spreads strike by strike in broker UIs is slow and combinatorial. There is no way to see every viable spread across a strike range in one view

No single grid for Entry Cost, Downside Risk, Upside Risk, Downside Potential, and Upside Potential across every spread variant

No way to project a Black-Scholes-shaped P/L curve per spread without exporting to a separate tool

Selected positions could not move cleanly between an analysis tool and the execution platform without re-keying

Without a personal risk filter, the spread matrix is overwhelming and traders cannot narrow to spreads inside their risk budget

Our Approach

Greenfield .NET 10 and Angular 18 build delivered to the same Spyrol Group team behind TradePartner, SuperSeasonals, and SmartTrading.com. We owned the full stack: Angular 18 SPA, ASP.NET Core 10 API with Dapper on hot paths and EF Core for migrations, SQL Server for persistence, SignalR for real-time price streaming, and integrations with Intrinio for market data plus the internal cache server for cached option chains. SSO federates through the existing SmartTrading identity provider, so subscribers reach PDS Trader with the same login that drives the rest of the product family. The app issues a second JWT scoped to TradePartner on sign-in, letting one session drive both products and both SignalR hubs.

Key Features

Pattern Spread Generator: define each leg as a strike range (Side, Type, Qty, Expiration, Start Strike, End Strike), then auto-generate every valid Cartesian combination of strikes across all legs

Spread matrix with Entry Cost, Downside Risk, Upside Risk, Downside Potential, and Upside Potential per row, each row expandable into an inline risk-graph chart with a favourite toggle

Max Downside Risk and Max Upside Risk filter inputs narrow the matrix to spreads inside a personal risk budget without re-running the generator

Inline Black-Scholes-shaped risk graph per spread that plots Projected P/L across a price sweep of the underlying, including correct piecewise payoff for legs that have already expired at the projection point

Favourite spreads persist as row indexes against the strategy and auto-invalidate when leg definitions change, so favourites cannot drift to a different surface

Portfolios track selected spreads as multi-leg positions per symbol with Current Price, Total Entry Cost, Total Closed P/L, leg-level Volatility, and a per-position risk graph

Per-leg actions: refresh quote from cache, delete leg, add to trade group, enter exit details (qty and price), copy leg to another symbol within the same portfolio

Send to TradePartner pushes a portfolio position into TradePartner as a watchlist; TradePartner can post a trade back into PDS Trader and have a portfolio created automatically

Federated SmartTrading SSO drops free users at the door with a subscribe prompt and provisions paid users into PDS on first sign-in. Real-time symbol prices stream over SignalR with auto-reconnect and resubscription on hub closure

Tech Stack

.NETAngularSQL ServerSignalRRedisDapperIntrinio

Technical Challenges We Solved

Combinatorial spread enumeration

Strategies define each leg as a strike range, not a single strike, so the engine generates every valid (leg1, leg2, ..., legN) combination. One cached option chain fetch feeds all legs, reversed ranges are normalized, empty filtered sets short-circuit, and a List-aggregating Cartesian product returns an empty list rather than crashing on misconfigured inputs.

Hand-rolled options pricing for the risk graph

The projection sweeps the underlying price by ten percent in either direction per spread, including legs that have already expired at the projection point. We built the normal CDF on top of an Abramowitz and Stegun erf approximation, a Black-Scholes-shaped curve for pre-expiry legs, and a piecewise payoff for at-expiry legs, with adaptive sweep step size for low and high priced names.

Atomic strategy save with favourite invalidation

Favourites are stored as comma-separated indexes into a deterministically ordered Cartesian product, so any change to leg count, expiration, strike range, qty, or option type silently invalidates them. The save runs the strategy update, the legs delete-and-reinsert, and the favourite-reset decision inside a single SQL transaction, so partial saves cannot leave dangling favourites pointing at a different surface.

Compressed cross-service option chain transport

Option chains are heavy. The internal cache server returns gzipped Base64 payloads, which the API decompresses, JSON-deserializes, and either Base64 decodes or treats as raw bytes depending on payload shape. The Generate Spread endpoint in turn gzip-compresses the full spread plus risk-graph payload before returning it to the SPA, keeping wire size manageable for large strike grids.

Dual-product SSO and bi-directional TradePartner sync

PDS Trader does not own its user store. Login federates to the SmartTrading identity provider, mirrors a local AppUser row on first sign-in, derives Free vs Paid from the latest subscription, blocks Free users at the door, and issues two JWTs in the response (one scoped to PDS, one to TradePartner) so the same SPA session can talk to both products and both SignalR hubs. TradePartner can POST a trade into PDS via API-key auth and have a portfolio auto-created; PDS can push a selected portfolio back to TradePartner as a watchlist.

The Result

Traders define a multi-leg strategy as strike ranges instead of one combo at a time, get every viable spread ranked by entry cost and four risk metrics, and see a projected P/L curve per spread without leaving the platform.

Selected positions move into portfolios with real-time prices and per-leg exit tracking, and round-trip cleanly to TradePartner for execution.

Built on .NET 10 and Angular 18 alongside the same client's existing TradePartner, SuperSeasonals, and SmartTrading.com platforms, sharing identity, telemetry, and option-chain infrastructure across the family.

Need a quant-style analysis tool for traders?

Spread engines, risk-graph projections, multi-product integrations, real-time price layers. We've built these for production use. Tell us what you're working on.

Start the conversation