Check Fee Assumptions in Prediction Market Backtest Results
A fee audit asks whether the result includes costs, which model it uses and which rules were applicable to the tested market and period. An experiment may deliberately omit costs to isolate a signal, but it must label that output as gross. There is no universal location where every strategy trades or every venue charges its maximum fee.
First question: were fees modeled at all?
Inspect the result model and per-fill accounting. If fees are not modeled, label that component gross rather than treating it as an exact net result. Check entry and any exit separately. A missing fee alone does not make the entire simulated result a guaranteed upper bound: other fill and valuation assumptions can err in either direction.
Execution role and market rules matter on both venues. A limit request can execute immediately, and a partial execution should retain its assumed or observed role. Do not infer fee-free maker treatment merely from the word limit. For an early exit, apply the relevant rule to that sale; for settlement, inspect the payout and any actual adjustment rather than pretending a second trade occurred.
Second question: which fee schedule, and from when?
A coefficient-times-quantity-times-price-times-one-minus-price component appears in the current published schedules, but multipliers, execution roles, exceptions and rounding still matter. A stale constant can be a declared historical or sensitivity assumption; it is wrong to present it as an exact current rule without checking the market.
Kalshi’s official PDF checked October 13, 2026 identifies a general taker coefficient of 0.07, market multipliers and a separate maker schedule. It states no general settlement fee. Its FIX settlement documentation separately describes a balance-rounding adjustment in a scalar example; that is not evidence for a list of unspecified fee-bearing series. Preserve the specific rule and actual report instead of inventing exceptions.
Polymarket international’s current fee page calculates a raw component using shares, price and a market/category rate, with separate maker treatment. Use the current market parameters for a current-rule experiment. Do not assert a universal effective date for every historical market or transfer these rules to the separate US venue.
Current category tables are useful references, but a reproducible backtest needs a market-specific, dated fee assumption:
- Save the exact venue, product and market identifiers.
- Record schedule date, role, rate, multiplier and quantity units.
- State whether rebates are excluded or separately evidenced.
- Preserve the rounding operation and any reported charged amount.
- Keep unknown historical rules visible instead of substituting an undocumented blended rate.
A current fee table can support a declared sensitivity test. It cannot reconstruct which parameters applied to an old fill without historical evidence. Changing only fees also leaves queue position, timing and available liquidity unresolved.
Third question: how is rounding handled?
Kalshi’s current PDF describes rounding fee plus position cost to centicent precision. Its displayed cents are not the full operation. The public Banger 0.1.7 standard Kalshi helper instead rounds the fee component up to a whole cent. Record this model mismatch explicitly; do not claim the current venue rule is reproduced exactly. The sign of a broader simulation error depends on more than rounding alone.
Do not take a blog's rounded example as the rule. Pull the venue's own schedule, which is where the rounding behavior is actually specified, and reproduce it in the simulator.
Fourth question: what does the fee do to a small edge?
For a fixed quantity and coefficient, the raw price-times-one-minus-price component peaks at 0.50. That is a dollar-component observation, not a universal effective percentage of capital. Compare expected gross outcomes with fees, spread, slippage and fill uncertainty under declared units; avoid deducting spread twice if executable prices already include it.
A maker scenario and a taker scenario can be useful comparisons, but neither is automatically the correct forecast. Eligibility for rebates is separate from fee treatment. Preserve unavailable passive fills and partial quantities, and show what a changed execution assumption does to the same strategy and dataset.
A quick audit checklist
- Is the result gross or fee adjusted, and which named model produced it?
- Are entry, exit and settlement paths represented separately?
- Do the rule, role and market settings match the experiment’s date and units?
- Does rounding match the intended rule, or is an implementation difference disclosed?
- Is the assumed fill model independently justified?
- Are spread, slippage and other costs recorded once, with unknowns visible?
Where Banger fits
Banger’s public beta is paper-only. Its packaged 0.1.7 forward-paper fee policy selects a named standard Kalshi model; it does not implement every current venue/category schedule. Hosted historical backtesting is a separate path. Inspect the actual result model and source rather than assuming a visible setting exists to enable exact current fees in every mode.
from decimal import Decimal
def raw_fee_feature(contracts, price, rate):
# A raw arithmetic component, NOT an exact venue invoice or rounding rule.
c, p, r = map(lambda x: Decimal(str(x)), [contracts, price, rate])
if not all(x.is_finite() for x in [c, p, r]):
raise ValueError("inputs must be finite")
if c < 0 or r < 0 or not 0 <= p <= 1:
raise ValueError("invalid quantity, price or rate")
return c * r * p * (1 - p)
print(raw_fee_feature("100", "0.50", "0.07")) # 1.7500
# Assumed rate and quantity. Rounding, role and market rules are separate.The snippet calculates a raw arithmetic feature only. Its illustrative fixtures were validated offline; it is not an exact invoice or an instruction to place a real trade. Preserve the current official rule, the simulator’s actual implementation and the declared experiment assumptions together. Banger’s non-crossing forward-paper fill assumption also needs review before interpreting net P&L.