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.
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
named cardlisted in the appinsufficient data · 0 this run
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.
They are written into the code, and every page of the app follows them.
01
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.
02
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.
Pre-registered costs per side, and the stress case
Venue
Per side
2× stress
KRX ETF
3 bp
6 bp
KRX stock
35 bp
70 bp
US shares via KIS
50 bp
100 bp
Crypto
10 bp
20 bp
Futures
5 bp
10 bp
FX
10 bp
20 bp
03
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.
PassReviseRejectInsufficient 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.
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.
Model
Assumes
Captures
Misses
GBM runs on this page
Constant drift and volatility, normal daily returns.
The baseline every other model must beat.
Clustering, fat tails, jumps.
Jump diffusion
GBM plus Poisson jumps, calibrated from days beyond 3σ.
Gap risk and a fat left tail.
Clustering. Needs outliers in the window.
Block bootstrap
The 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.
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
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.
KRW-BTC every out-of-sample window stitched into one P&L series
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
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
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
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
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
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
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
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.
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 studyresultsmd5 on every cardcostspre-registeredmanualsrebuilt from code · 42 + 17 pplicenseto be announced
Fixed settings of the simulator and the gate
Monte Carlo paths
5,000 default · 200 to 100,000
Horizon
5 to 1,260 sessions
Walk-forward
756 / 126 · embargo = holding
Bootstrap
2,000 × 10-session blocks, 90%
Deflated Sharpe
≥ 0.95
Benchmark test
one-sided p ≤ 0.10
Cost stress
2× · Sharpe > 0
Plateau
≥ 50% of neighbours keep half
Calendar years
≥ 60% positive
Live haircut
60% 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.
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.
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.