Loading market data…
Trade one stock for five years without knowing which stock it is.
Real prices, one month at a time, with calls and puts. The name comes off at the end.
Scored on Sharpe ratio, maximum drawdown and IRR against six benchmark strategies on the same prices. How it works
Loading market data
Mystery stock
This month's orders
How stock positions work
A percent of your equity. Long up to 150% (on margin), short up to 100%. Each stock trade costs 0.05% of the amount traded. If you leave this alone, your share count stays the same.
| Strike | Implied vol | Call | Put | ||
|---|---|---|---|---|---|
| Sell (bid) | Buy (ask) | Sell (bid) | Buy (ask) | ||
How options work here
Each option expires at the end of the month (21 trading days) and settles in cash. Selling at the bid writes the option; buying at the ask buys it. Written calls must be covered by shares you hold, and written puts need cash equal to the strike value. Implied vol rises for lower strikes: puts are priced richer than calls. Calls below 100% and puts above 100% are in the money; their prices are shaded.
Autopilot
Let a rule play the remaining months for you.
Your account
Daily value of your account next to simply holding the stock
Your account line starts after month 1.
The tape is revealed
–
–
Head-to-head
Same stock, same months, same pricesScorecard
?
Every strategy is ranked on three numbers and ordered by the average of those ranks: Sharpe ratio, return per unit of drawdown (IRR above T-bills divided by max drawdown), and IRR. The small chip beside each value is its rank. Equal averages go to the higher Sharpe ratio, then the higher IRR; only exact ties share a place. Every strategy pays the same costs on the same prices.
| Place | Strategy | Sharpe | Return per drawdown | IRR | Max drawdown | Ending value | Total return | Sortino | Volatility | Beta |
|---|
Growth of $100,000
Drawdown
How far below its own peak each account fellYour net exposure by month
Stock plus option delta; long above zero, short belowYou stayed in cash every month, so there is nothing to plot.
Coach's debrief
Month-by-month log
| Month | Stock move | Net exposure | Options | Option P&L | Your return | Equity |
|---|
How it works
A trading game on real daily prices, scored the way a portfolio manager is judged.
By the numbers
A turn
Each turn is one month. You place your orders at the month's first close, then 21 trading days play out and your options (contracts that give the right, but not the duty, to buy or sell the stock at a set price) expire.
- You decidestock and options, at the month's first close
- 21 trading daysmarked to market daily
- Options expiresettled in cash
- Next monthyou decide again
Day by day
At every daily close:
- Your positions are marked to market (valued at that day's close: the stock at its closing price, options at the model price).
- Cash earns a day of interest. Borrowed cash pays a day of interest, and short shares a day of fees.
- The margin check runs, on the last day too.
On the 21st trading day your options expire and are settled in cash (paid out in cash, not shares). A call pays how far the price ends above its strike, a put how far it ends below. Otherwise it pays nothing. If you wrote the option, you pay that amount. Then you decide again.
Rules
You start with $100,000 and trade one stock and its options. You can go up to 150% long (owning shares, so you gain when the price rises) or 100% short (selling borrowed shares, so you gain when the price falls), and a margin call (a forced close of positions when the account's equity gets too thin for them) closes everything if losses go too deep.
All the rules
- Stake. $100,000, fixed. No deposits or withdrawals.
- The stock. Drawn at random from a pool with very different histories, including the S&P 500 itself. You can also pick one, which turns blind mode off. In blind mode the name and dates are hidden and the price starts at 100. Returns are unchanged.
- Window. The full challenge is the most recent 60 months (1,260 trading days), ending at the latest close. A quick round is a random 12-month slice of it. Each turn is 21 trading days.
- Stock. Set as a percent of equity (what the account is worth: cash plus positions, minus loans), from −100% (short) to +150%, which is long on margin (owning more stock than the account is worth, with borrowed cash). Each trade costs 0.05% of the amount traded. Leave it alone and your share count stays the same.
- Options. Calls (the right to buy the stock at a set price) and puts (the right to sell the stock at a set price) at strikes (the price an option lets you buy or sell at) of 90, 95, 100, 105 and 110% of the price. They are European (the right can be used only at expiry, not before): they expire at the end of the month and settle in cash. Size is a percent of equity: 100% means options on as many shares as your equity would buy. Up to four option trades a month, at most 200% of equity in total.
- Leverage includes options. Net exposure (your total bet on the stock, as a percent of equity), the stock plus each option's delta (how strongly an option moves with the stock: 0 to 1 for calls, 0 to −1 for puts), must stay between −100% and +150% when you place an order.
- Writing options. Written (sold to someone else: you collect the option's price and owe whatever it pays out) calls must be covered by shares you hold. Written puts need cash equal to the strike value after the whole order, not counting short-sale proceeds.
- Financing. Cash earns the 13-week T-bill (Treasury bill: short-term US government debt, the usual near-riskless return) rate. Borrowing pays the T-bill rate + 1.5%. Short positions pay 0.5% a year. An order can't take borrowing above 50% of equity.
- Drift and margin. Limits apply to orders. Between orders, positions drift with the market. If equity falls below 25% of the gross stock position at any daily close, a margin call closes every position. At zero equity the game ends and the account ranks last.
Option pricing
Options are priced with the Black-Scholes (a standard formula for an option's fair price) formula, on a volatility built from that day's real market data. You buy a little above the model price and sell a little below it.
The pricing model
There are no free historical option quotes for every stock, so the game prices options with a model. Its implied volatility (the yearly size of price swings that an option's price assumes) comes from that day's market data:
IVatm² = RV63(stock)² + [ (0.88 × VIX/100)² − RV63(S&P 500)² ]
IV(K) = IVatm × (1 − slope × ln(K/S))
- Inputs. RV63 is the trailing 63-day realized volatility (how much the price actually swung, measured from daily returns and put in yearly terms). K is the strike and S the stock price.
- The bracket is the market's volatility risk premium (the extra that option buyers pay over the volatility that actually happens) that day. The VIX (an index of the volatility priced into S&P 500 options for the next 30 days) is a variance-swap level that includes the skew, so at-the-money (with the strike at today's price) index volatility is taken as 0.88 × VIX. Adding the bracket once prices at-the-money S&P 500 options at 0.88 × VIX and gives single stocks a small premium over their own realized volatility.
- Smile. A smile (how implied volatility changes from one strike to the next) makes lower strikes richer. The index smile has slope 3.0 on both sides. Single stocks get 1.25 below the money and a flat call wing, because out-of-the-money (would pay nothing if it expired today) stock calls aren't cheap in real markets.
- Guard rails. Each smile is clipped to between 0.5 and 2 times at-the-money volatility. At-the-money volatility is floored at 75% of realized. Every IV stays between 8% and 250%.
- Bid and ask. You buy at the ask (the price you pay to buy) and sell at the bid (the price you get to sell): a half-spread of 2.5% of the premium (the option's price), at least 0.05% of the stock price.
- Rates and dividends. The risk-free rate is the T-bill yield. Prices include dividends, so the stock is treated as paying none.
Why this model. Three earlier versions were replaced after reality checks on real data. One made covered calls beat buy and hold on almost every stock. One let a 5%-out-of-the-money S&P 500 covered call beat the index by 46 points. One made out-of-the-money stock calls so cheap that call buyers profited even after delta hedging (offsetting an option's stock exposure with shares). With this version, delta-hedged buyers of out-of-the-money stock options lose on average, as the evidence says they should, and in our checks the S&P 500 buy-write (a covered call: own the index and write calls on it) finished within about 5 points of the index.
Scoring
You and six benchmarks are ranked on three numbers: Sharpe ratio (return above T-bills for each unit of ups and downs), return per unit of drawdown (a fall from the account's highest value so far), and IRR (internal rate of return: your growth rate per year). Places go by the average rank.
How each score works
- Sharpe ratio. Mean daily return above the T-bill rate, divided by its standard deviation (the typical size of swings around the average), × √252 to put it in yearly terms.
- Maximum drawdown. The largest fall from a peak in the daily account value.
- IRR. The money-weighted return per year, computed as XIRR (IRR using the exact date of each cash flow). With a fixed stake it equals the compound annual growth rate (the steady yearly rate that turns the start value into the end value).
- Return per unit of drawdown. IRR above T-bills divided by max drawdown (floored at 1%).
- Overall place. Each strategy is ranked on Sharpe, return per unit of drawdown, and IRR, and ordered by the average rank. Equal averages go to the higher Sharpe, then the higher IRR, and only exact ties share a place. Drawdown enters per unit of return, so a tiny position can't win just by being small. A wiped-out account ranks last.
- Also shown. Sortino ratio (like Sharpe, but counting only the downside swings), which is excess return over downside deviation; volatility; and beta (how much the account tends to move for each 1% move in the S&P 500; 1 means 1%, on average) against the S&P 500.
Benchmarks
Six simple strategies play the same window with the same costs: buy and hold the stock or the S&P 500, a covered call (own the stock and write calls on it: you collect premium but give up gains above the strike), a protective put (own the stock and buy puts on it: insurance against a big fall), a 200-day trend rule and T-bills only.
The six strategies
- Buy and hold the stock. Buys 100% once and never trades again.
- Buy and hold the S&P 500. The same, on the S&P 500 ETF (a fund that trades like a stock).
- Covered call. Long 100%, writes 105% calls every month.
- Protective put. Long 100%, buys 95% puts every month.
- 200-day trend. Long 100% when the price is above its 200-day average (the average close of the last 200 trading days), otherwise in T-bills.
- T-bills only. All cash, earning the T-bill (Treasury bill: short-term US government debt, the usual near-riskless return) rate.
They run through the same engine as you, with the same rules and costs.
Head-to-head challenges
After a game, Challenge a friend copies a link to your exact game. Your friend plays the same tape without seeing your result, and then you are ranked side by side.
How a challenge works
The link holds your stock, your window and every order you placed, so no server or login is involved. Your friend starts from month 1. When they finish, the engine replays your orders on the same prices and ranks you side by side, with the six benchmarks. They can challenge you back.
Data and updates
Prices are real daily closes, refreshed automatically every weekday after the US market close. A new full challenge always ends at the latest close.
Where the data comes from
A scheduled GitHub Actions job downloads daily closes for every stock and the S&P 500 ETF (adjusted for dividends and splits), the VIX and the 13-week T-bill yield each weekday after the close. It validates every series and commits only real changes, and the site redeploys. Adding a stock is one entry in config/tickers.json. See the Data page for current status.
The engine has unit tests (Black-Scholes against textbook values and put-call parity, margin calls, settlement, the trading rules and every metric), and a separate pandas script recomputes every metric on real data and checks it against the game engine's own numbers.
Limits
- Option prices come from a model, not historical quotes.
- Trades fill at the daily close, and you decide once a month.
- Blind mode is honor-based: there are ways to peek, and a challenge or replay link can be decoded to show the stock.
- A replay can differ by a few dollars if the data provider revises adjusted prices.
The fine print
- Model prices. The smile is a simple shape, and earnings days aren't modeled.
- Simple fills. Fractional shares are allowed, and market impact is ignored beyond the fixed costs.
- Ways to peek. A careful look at the chart's shape or the T-bill rate can hint at the stock or era. The S&P 500's steeper option smile (its out-of-the-money calls are cheaper) sets it apart from the stocks. The browser's developer tools can show the price file.
- Replays. Replay links reproduce a game exactly on the same data.
About
Built for Duke's FMKT 256 (Fall 2026) AI extra-credit project with Claude (Anthropic) as the AI pair-programmer. Claude wrote the engine, tests, data pipeline and this site, and drafted its text; we chose the prompt, approved the game design, directed the work and reviewed it. Source: github.com/cartermburke/FMKT256-AI-Proj.
Academic exercise, not investment advice. Past performance on historical data says nothing about future results.
Data status
Loading
| Series | Source | Rows | First close | Last close | Status |
|---|
How updates work
A GitHub Actions workflow (.github/workflows/update-data.yml) runs every weekday at 22:30 UTC, after the US market close, when the config changes, or on demand. It tries yfinance, then the Yahoo Finance chart API, then Nasdaq's historical API (and FRED for T-bills), validates every series, and commits only changed files; the site redeploys from that commit. If a source fails, the last good data is kept and this page flags it as stale.