DEV Community

Okeke Jenny
Okeke Jenny

Posted on

A challenge fee is a geometric series, not a price

The advertised price of a trading challenge is a fee. The real cost is a random variable, and its expectation is not the fee. It is the fee divided by your probability of passing — and that division is where the interesting arithmetic lives.

The model, stated before it is used

Assume you retry until you pass, then collect one payout. Then:

attempts needed until the first pass  ~  Geometric(p),   E[attempts] = 1/p
E[total fees]   =  fee * (1/p)  =  fee / p
E[net]          =  payout - fee / p
break-even p    =  fee / payout
Enter fullscreen mode Exit fullscreen mode

Two things follow immediately, and both are easy to skip past:

  1. The cost multiplier is exactly 1/p. If you pass one time in three, you will on average pay for three challenges. The multiplier is not a small correction — at p = 0.35 it is 2.8×.
  2. There is a break-even pass rate that does not depend on your skill at all. With a $500 fee and a $3,000 first payout it is 500/3000 = 16.67%. Below that, the arithmetic is negative no matter how good the strategy is; above it, positive. It is a property of the price list.

Point 2 is the useful one, because it inverts the usual question. Traders ask "can I pass?" The arithmetic asks "what is the cheapest rulebook whose pass rate clears the break-even by the widest margin?"

The measurement

Four rulebooks, one generator, 50,000 accounts each, $50,000 account, $2,500 drawdown, $6,000 target. Fee $500, first payout $3,000.

Rulebook p(pass) E[attempts] E[fees paid] Cost vs fee E[net] after fees
static drawdown 78.31% 1.28 $638 1.28× $2,362
trails to breakeven 70.33% 1.42 $711 1.42× $2,289
trails, above breakeven 60.46% 1.65 $827 1.65× $2,173
trails intraday 35.66% 2.80 $1,402 2.80× $1,598

Everything clears the 16.67% break-even. That is worth being suspicious of, and the suspicion is correct — I will come back to it, because it is the most important limitation in this article.

The defensible finding is the spread: the same trader on the same strategy pays an expected $638 under one rulebook and $1,402 under another. That is a 2.2× difference in expected cost, driven entirely by the floor of the drawdown — not by the strategy, not by the trader, and not by the advertised fee, which is identical across all four columns.

The mechanism, in one function

The whole difference between the columns is a single expression for the floor:

const floor = () => {
  if (mode === 'static') return cfg.start - cfg.dd;          // never moves
  const f = peak - cfg.dd;                                    // follows the peak
  return mode === 'trailing_lock' ? Math.min(f, cfg.start)    // stops at breakeven
                                  : f;                        // keeps trailing
};
Enter fullscreen mode Exit fullscreen mode

Three lines, and the pass rate moves from 78.31% to 35.66%. The rest of the simulator — the target, the trade generation, the iteration — is byte-identical. When a single expression moves an expected cost by 2.2×, that expression is the thing to understand, not the marketing copy around it.

There is a bug in this neighbourhood worth flagging because I shipped it and it produced a plausible-looking table. I first wrote the lock as:

return Math.max(f, cfg.start - cfg.dd);   // WRONG - does nothing
Enter fullscreen mode Exit fullscreen mode

peak >= start always, so peak - dd >= start - dd always, so the max always returns f. The clamp was a no-op and "trails to breakeven" came out identical to the unclamped trailing rule — 35.66% on both rows. Two rulebooks, one number, and nothing in the output to suggest a problem. A rule that clamps the floor at breakeven is a minimum:

return Math.min(f, cfg.start);            // correct
Enter fullscreen mode Exit fullscreen mode

Same character count. Opposite direction. One row in the table above.

Why the naive model is too generous

The table says all four rulebooks are profitable. That follows from the assumptions, and the assumptions are doing more work than the measurements:

  • Unlimited retries. E[attempts] = 1/p requires that attempts are independent draws. If a blown account teaches you something, the attempts are not independent and the geometric model is wrong about the variance — usually optimistically.
  • No time cost. Each attempt consumes weeks of calendar time. The model prices the fee and ignores the opportunity cost entirely.
  • The payout is collected once and never lost. Real funded accounts can be breached after passing, which ends the sequence with fees paid and no payout. Adding a funded-account failure probability is the single change most likely to invert the ordering in the table, because it interacts with the drawdown mode.
  • The fee is constant. Many firms scale the fee with account size and discount on repeat purchases, so fee/p is a weighted average, not a simple division.
  • p is treated as known. It is estimated from a model. At the bottom of the table, a plausible error bar on 35.66% spans a large multiple of 1/p, and the cost is a reciprocal function, so estimation error in p is amplified non-linearly into cost.

The honest summary: the spread across rulebooks is a robust finding, because all four share the same assumptions. The absolute profits are an artifact of assuming unlimited retries of an unbreached, fee-only challenge.

The code for the cost side

const FEE = 500, PAYOUT = 3000;

const cost = (p) => ({
  attempts: 1 / p,
  fees: FEE / p,
  multiplier: 1 / p,
  net: PAYOUT - FEE / p,
  clearsBreakEven: p > FEE / PAYOUT,
});
Enter fullscreen mode Exit fullscreen mode

Five lines, and every number in the table is a call to it with a p that came from a simulation rather than an estimate. That separation is the discipline worth keeping: the simulation produces p; the cost model consumes it. They are different models with different assumptions, and merging them into one script is how a modelling assumption in the price logic gets attributed to the strategy.

Where this model is wrong

  • Single seed per rulebook. Reproducible, not an ensemble; unquantified sampling error on every p.
  • One trade per day, 80 days maximum. A real challenge spans longer, and the tail of the attempt-length distribution — the traders who take six attempts — is exactly the tail the geometric model is being used to price.
  • p measured in isolation. The pass rates come from four separate runs with the same generator, not from a paired comparison, so part of the spread could be seed noise rather than the floor rule. The ordering is monotone and large enough to be convincing; the individual values are not precise.
  • The payout is $3,000 for everyone. Firms tie the first payout to account size and profit share, so the break-even pass rate is rulebook-specific in reality and not the single 16.67% used here.

The practical takeaway is not "pick the static drawdown" — that ignores every other difference between firms. It is that cost is a function of 1/p, so the cheapest rulebook is the one you are most likely to pass, and the difference is multiplicative, not additive. A 20-point swing in pass rate is a 2.2× swing in expected spend on an identical fee.

I broke down what a prop firm challenge actually costs end to end — fee tiers, reset pricing and the payout schedule that sets the break-even — for anyone who wants the price-list side of this rather than the simulation.

Top comments (0)