Open source · Read-only · Quant research desk

5,000 paths.One gate.No trades.

QUANTGEN is an open-source research desk for individual investors. It simulates prices, tests strategies against a statistical gate fixed before the test, and publishes what fails. It has no order path, so it cannot place a trade.

GARCH(1,1)-tα 0.183β 0.645ν 3.1half-life 3.7 sessions
seed 75,000 paths126 sessionszero drift
page checksumcomputing
calm normal elevated stressed

Path colour is each path's conditional-volatility quartile.

Computed in your browser from the Models Primer's worked AAPL fit (504 daily closes).1 Spot rebased to 100, zero drift. Lighter band: 90 of 100 simulated outcomes. Darker band: the middle 50.

The record · study run 2026-09-27 · seed 11

34 hypotheses. 5 survived.

Every idea became a model card with a pre-registered rule, costs and seed. The gate returned 5 PASS, 11 REVISE and 18 REJECT. The 29 that did not pass are still listed.2

  • 5Pass
  • 11Revise
  • 18Reject
  • 0Insufficient data

Each square is one model card. Hover or focus a square to read it. Dotted squares are cards this page does not name; the app lists them.

See the strategy cards in full

Three rules

Three rules that never bend.

They are written into the code, and every page of the app follows them.

  1. Read-only by construction.

    QUANTGEN can look at markets. It cannot act on them. There is no code path that sends an order, on any venue, and nothing to switch on.

    Paths that do not exist

    • order
    • cancel
    • withdrawal
    • deposit address
    • transfer

    Never requested, never stored

    • private key
    • seed phrase
    • wallet secret

    What it asks for

    • A KIS Open API app key, for quotes.
    • Optional: an Upbit key limited to the asset-inquiry scope, to read a balance.
    • Optional: a Claude API key for the interpretation panel. The written narrative needs no key.
  2. Decide at the close of day t. Earn from day t+1.

    A signal never trades on the price that created it. Costs are charged on every unit of turnover at a rate fixed before the test, and every result is shown again at twice the cost.

    close of t · signal t − 1 t t + 1 · earns
    Pre-registered costs per side, and the stress case
    VenuePer side2× stress
    KRX ETF3 bp6 bp
    KRX stock35 bp70 bp
    US shares via KIS50 bp100 bp
    Crypto10 bp20 bp
    Futures5 bp10 bp
    FX10 bp20 bp
  3. The gate decides, not the author.

    Four outcomes are defined once, in code. A strategy the author likes gets no easier ride, and a rejected one is not deleted. It stays in the app, labelled as a refusal.

    Pass Revise Reject Insufficient data
    • Revise names the first failed check and the only permitted fix: widen the grid, lengthen the holding period or extend the history. Lowering the cost is never allowed.
    • Every revision is logged on the card and counted as another trial, so a re-run is harder to pass, not easier.

Quant Lab

Four ways to be wrong about the future.

The Quant Lab fits a price-path model to up to 504 daily closes and draws thousands of seeded futures. The default is GARCH(1,1) with Student-t shocks, fitted by maximum likelihood with guardrails and intervals.

Model
Drift
Horizon, sessions
Paths

Same seed, same paths. A new seed shows how much of a number is the dice.

Spot
335.92
Median terminal
·
90% range
·
P(loss)
·
VaR 95
·
CVaR
·
Drift (ann.)
·
Vol (ann.)
·

Across 5,000 simulated GARCH-t paths over 126 sessions, the Quant Lab reports a median, a 90% range, the probability of finishing below spot, VaR and CVaR, then explains its calibration in plain sentences.

This panel is a compact browser re-implementation. It is seeded, but uses its own random generator (not NumPy's) and a constant drift in place of the app's per-path convexity correction, so it lands near the app's figures, not on them. It uses the Models Primer's worked AAPL fit (FMP closes, 2024-09-20 to 2026-09-24).1 The app itself fits live data, adds jump diffusion and the block bootstrap, and prints guardrail chips and intervals. Illustration of the method, not a forecast.

The four models, side by side.

ModelAssumesCapturesMisses
GBM
runs on this page
Constant drift and volatility, normal daily returns.The baseline every other model must beat.Clustering, fat tails, jumps.
Jump diffusionGBM plus Poisson jumps, calibrated from days beyond 3σ.Gap risk and a fat left tail.Clustering. Needs outliers in the window.
Block bootstrapThe future is the past, reshuffled in 5-session blocks.The empirical tails, with no formula.Anything the window never showed.
GARCH(1,1)-t
default · runs on this page
Variance follows its own recursion; Student-t shocks.Clustering, fat tails, a fan that starts from today's volatility.Jumps as such, and asymmetry.

The lab grades itself.

Share of days a one-day 5% VaR was breached, out of sample. Target 5.0%. Kupiec, Christoffersen, coverage, PIT and Diebold-Mariano tests decide each card, so equal breach rates can end differently: GARCH-t and GJR on SPY both sit at 6.6%, but a PIT p below 0.01 (0.003 against 0.014) makes the first a REJECT.4

Card5%6%7%Decision

GARCH-t is still the Quant Lab's fan, and it now carries its own study result: on SPY, 5% VaR breached on 6.6% of days and PIT failed at p 0.003: REJECT. A fan whose left tail is known to be thin is labelled as such. On SPY the skewed-t brings the breach rate to 5.2% but still fails PIT; on KODEX 200 (6.3%) and bitcoin (5.8%) the count is still off, so it stays out of the menu until it passes.

Why the default drift is not the sample mean. Across 17 tickers since 2005 and 3,135 forecasts, the trailing two-year mean had a correlation of −0.010 with the next year's return.3 So the default is the risk-free rate plus a premium you choose, less the convexity correction. Zero is kept for stress tests.

The gate

The author doesn't decide.

Nine steps, fixed before the test, lead to PASS, REVISE, REJECT or INSUFFICIENT DATA. Follow one card through them.

Card C3 · crypto trend

KRW-BTC, long or flat

Verdict: Pass
rule
sign votes over 7–28 day lookbacks plus price / MA ratios, with a hysteresis band
costs
10 bp per side, fixed before the test
seed
11
walk-forward
756 / 126 sessions, embargoed
OOS Sharpe
1.22 [0.62, 1.77]
deflated Sharpe
1.00 ≥ 0.95
PBO / loses OOS
0.27 / 0% of splits
vs buy-and-hold
0.79 · p 0.04
at 2× costs
1.17 · turnover 13.7× a year
plateau
met · best setting inside the grid
years positive
75% · top year 29% of P&L
expected live
Sharpe 0.73 · reported, not gated
−0.5 0.5 1.0 1.5 2.0 0 buy & hold 0.79 2× costs 1.17 OOS 1.22 live 0.73
  1. 01 / 09

    Choose in the past, test in the future.

    A picks the best configuration on 756 sessions, then holds it for the next 126 it has not seen. An embargo as long as the holding period sits between them.

    in-sample 756out-of-sample 126

    KRW-BTC every out-of-sample window stitched into one P&L series

  2. 02 / 09

    The interval must clear zero.

    The Sharpe ratio gets a Lo (2002) standard error and a 90% interval: 2,000 resamples of 10-session blocks.

    KRW-BTC 1.22 [0.62, 1.77], clear of zero

  3. 03 / 09

    Count every try.

    The asks whether the best of N configurations beats the best of N coin flips. It must reach 0.95, and every revision adds to N.

    KRW-BTC 1.00

  4. 04 / 09

    Not over-searched.

    The is read together with how often the in-sample winner loses out of sample.

    KRW-BTC PBO 0.27, the winner loses in 0% of splits

  5. 05 / 09

    Beat the benchmark, on the same days.

    A claim of outperformance is a claim about a difference. The difference of Sharpe ratios is bootstrapped in blocks; the one-sided p must be 0.10 or less.

    KRW-BTC buy-and-hold 0.79, p 0.04

  6. 06 / 09

    Survive twice the costs.

    The whole test is rebuilt with costs doubled. The Sharpe ratio must stay positive, and annual turnover is printed so you can see what it is buying.

    KRW-BTC 1.17 at 20 bp per side · 13.7× a year

  7. 07 / 09

    A plateau, not a peak.

    Half of the neighbouring configurations must keep at least half the Sharpe, and the best one may not sit at the end of an axis that was not searched far enough.

    KRW-BTC met · best setting inside the grid

  8. 08 / 09

    Most years, not one lucky year.

    At least 60% of calendar years must be positive. The share of the P&L carried by the largest year is printed beside it.

    KRW-BTC 75% of years · largest year 29% of P&L

  9. 09 / 09

    Then take 40% off.

    Published anomalies decay by about that much after publication (McLean and Pontiff). A rule taken from a paper is a published anomaly, so the is 60% of the out-of-sample one.5

    KRW-BTC 1.22 becomes 0.73, reported beside the verdict, not gated

    0.73 sits below buy-and-hold's 0.79. The PASS is about the out-of-sample record, not a forecast of beating it live.

Same gate. Same weight.

A REJECT gets the same card, the same size and the same place on the record as a PASS. A strategy known not to work is useful information at the desk.

  • The KRW-BTC benchmark is a bull decade.
  • Its largest year carries 29% of the P&L.
  • 10 bp per side is the Upbit fee plus modest slippage.

Card E1 · trend switch

US ETF sleeves, long or cash

Reject

Out-of-sample Sharpe 0.84 [0.47, 1.20] against buy-and-hold 0.95, p 0.75. It protects; it does not outperform, and the claim was outperformance.

trend switch−15%
buy-and-hold−27%

The app keeps it on the ETF page as a descriptive sleeve with its verdict, because the drawdown line is worth seeing. It is not offered as a signal.

Purged walk-forwardCross-validation with the folds forced into time order, the only order a trading rule will ever see. The gap between training and test windows stops a position opened in-sample from leaking its outcome into the test.
Block bootstrapResampling contiguous blocks of days rather than single days, so that the clustering of volatility survives the resampling.
Deflated Sharpe ratioBailey and López de Prado's correction for trying many configurations: the probability that the best one beats what the maximum of the same number of pure-noise trials would reach, after adjusting for skewness and kurtosis.
PBO, via CSCVCombinatorially symmetric cross-validation splits history into blocks, picks the best configuration on half of them and ranks it on the other half. PBO is the share of splits where that winner lands in the bottom half. On a flat plateau it reads 0.5 by construction, so the gate also asks how often the winner actually loses.
The haircutThe expected live Sharpe is 60% of the out-of-sample Sharpe. The 40% cut matches the post-publication decay McLean and Pontiff measured across published anomalies. It is reported beside the verdict, not gated.

Strategy Lab · 16 of 34 cards

It says no. In public.

Each card holds a hypothesis, a rule, a data span, pre-registered costs, a seed, every test line, the decision and an md5 of the results. Here are the 16 trading strategies from the study, with the numbers the gate saw.

Show

Check rows: the 90% interval lies above zero · deflated Sharpe ≥ 0.95 · not over-searched (PBO ≤ 0.05, or the winner loses in ≤ 10% of splits) · beats its benchmark at p ≤ 0.10 · Sharpe positive at 2× costs. A dash means the test does not apply to that card. A failed deflated Sharpe, a failed benchmark test, or PBO above 0.2 with the winner losing means REJECT. Losing money at 2× costs is a REJECT only when the interval also includes zero; otherwise it is a REVISE, as for the KODEX/TIGER pair. Plateau and calendar-year checks are on each card in the app.

Also on the record: the Diebold-Li curve forecast beat the random walk at 0 of 5 maturities, so the Rates page shows the factors as a description, not a forecast.

The desk

Every page reads. None of them trades.

Korea, the US and crypto, from index options to yield curves. Each page says what it offers and what it holds back, and why.

Quant Lab

GBM, jump diffusion, block bootstrap and GARCH(1,1)-t. Fan, VaR, CVaR, probability of loss and target, three charts and a written narrative. Seeded, so every run can be repeated.

WithheldThe skewed-t fan as a model choice, until it passes the gate.

Derivatives

KOSPI 200 basis and fair value, the parity-implied forward, a Black-76 smile against KIS's own vols, static-arbitrage counts, SVI with its no-butterfly check, model-free implied variance, the risk-neutral density and pricing kernel, the box-spread rate and hedging P&L.

Basis & fair value

WithheldThe short-volatility strategy, until a history of boards exists. A board read while the market is closed is marked indicative.

Crypto

Kimchi premium, perpetual funding carry, a six-part regime score, an ETH/BTC unit-root test, a weekday table and an optional read-only Upbit balance.

Funding carryKimchi premium

WithheldAny order or transfer, the ETH/BTC pair, and the premium as a trade.

ETF

NAV premium with its half-life, tracking error, constituents, leveraged-fund drag, and the trend and vol-target sleeves shown with their verdicts.

Drag forecast

WithheldTrend, vol target, risk parity and sector momentum as signals.

Rates & FX

A KRW curve panel from KIS yields, Diebold-Li factors, a PCA-neutral 2-5-10 fly, bond carry and the Fama regression.

PCA fly

WithheldThe Diebold-Li forecast, the fly as a trade, and FX momentum and dollar carry as signals.

Volatility products

A VIX term-structure drift monitor. With b = VIX3M / VIX − 1, a 30-day long VIX product is expected to drift by −b/2 a month.

WithheldThe VIX roll-down trade. It was tested and rejected: out-of-sample Sharpe −0.14.

Strategy Lab

Every card with every test line. The crypto trend rule, which passed, runs on live data. Any family can be run ad hoc through the same gate.

WithheldREJECT families as recommendations. They still run, labelled.

Data

Borrowed eyes. No hands.

QUANTGEN quotes. It never needs a futures or options trading account, because it never trades. Crypto comes from public exchange data only.

With your KIS Open API app key, quotes only

  • KRX stocks, and ETFs with NAV, premium, tracking error and holdings
  • KOSPI 200 futures and every listed option
  • KTB and USD futures, KRW benchmark yields
  • US yields, indices and stocks
  • USD/KRW fixing, investor flows, short-sale data

Public data

  • FRED 3-month T-bill for the risk-free rate
  • FMP daily closes
  • Upbit public candles, KRW-BTC from 2017
  • Binance public spot, funding and open interest, as data only
  • CoinGecko and Yahoo Finance

Reproducibility

Same seed. Same answer.

A simulation that repaints on every refresh cannot be reasoned about. Every number in QUANTGEN comes from a fixed seed, so the same settings give the same result.

seed7 Monte Carlo · 11 study resultsmd5 on every card costspre-registered manualsrebuilt from code · 42 + 17 pp licenseto be announced
Fixed settings of the simulator and the gate
Monte Carlo paths5,000 default · 200 to 100,000
Horizon5 to 1,260 sessions
Walk-forward756 / 126 · embargo = holding
Bootstrap2,000 × 10-session blocks, 90%
Deflated Sharpe≥ 0.95
Benchmark testone-sided p ≤ 0.10
Cost stress2× · Sharpe > 0
Plateau≥ 50% of neighbours keep half
Calendar years≥ 60% positive
Live haircut60% of out-of-sample
core of run_monte_carlo · Python
log_paths = np.cumsum(shocks, axis=1)   # (n_paths, horizon)
paths = spot * np.exp(np.hstack([np.zeros((n_paths, 1)), log_paths]))
fan = {p: np.percentile(paths, p, axis=0) for p in FAN_PERCENTILES}  # 5,25,50,75,95
terminal = paths[:, -1].copy()

The model decides what goes into shocks. Everything after is the same code for all four models, so their risk numbers are directly comparable.

Acceptance tests, among others

  • test_mc_is_seeded_and_reproducible
  • test_garch_scaled_t_shocks_have_unit_variance
  • test_lr_is_nonnegative_and_correctly_sized_under_the_null
  • test_interval_coverage_on_simulated_t_garch

Open source · Python · numpy / scipy

Bring a hypothesis. Expect the gate.

QUANTGEN is written to be read. The models live in core/quant/, and two manuals explain every number on screen.

Quick start repository link pending
git clone <repository URL> quantgen
cd quantgen
# self-check: scaled t draws have unit variance
python -m core.quant.garch
# rebuilds the Models Primer, offline
python docs/build_models_primer.py
# re-runs the study, one JSON card per model
python docs/asset_expansion_study.py
  • Challenge a verdict.Re-run a card on your own data. If the gate was wrong, show where.
  • Add a market or a model.It goes through the same gate as everything else, and its REJECT stays on the record too.
  • Report a silent failure.A fit that converges to plausible nonsense is the worst bug a quant tool can have. The guardrail chips exist to catch it.
  • Translate the manuals.The primers are written so each statistic can be read without the paper it came from.
Get the code GitHub link will appear here

Questions

Can QUANTGEN place trades for me?

No. There is no order, cancel, withdrawal, deposit-address or transfer path on any venue. It is a research desk.

Will it ask for a private key or seed phrase?

Never. No private key, seed phrase, keystore or wallet secret is requested or stored. An optional Upbit key is limited to the asset-inquiry scope.

Do I need a brokerage account?

For Korean and US quotes, yes: the KIS Open API app key is issued against a KIS securities account, and a plain stock account is enough. No derivatives account, overseas agreement or course is needed. Crypto and the risk-free rate come from public data, and a synthetic demo runs with no key at all.

Does the Claude panel make decisions?

No. The gate decides. The written narrative is deterministic and needs no key. When a Claude key is set, the panel receives the same numbers and adds an interpretation.

Why show strategies that failed?

Because a hidden REJECT is how backtests mislead. Knowing that a popular rule did not survive its costs, its benchmark or its own grid search is useful information.

Is any of this investment advice?

No. QUANTGEN explains what it computes, how it was checked, and why some of it is deliberately not offered. Past out-of-sample results do not guarantee future ones.