Open-source quant infrastructure for Korean equities — built so that the rejections get published too.
PhD in mechanical engineering (mathematical optimization) · ML & perception engineer @ Doosan Robotics by day.
The through-line is optimization: strategy search is an optimization problem, and every trial is paid for.
한국어 · English
Three things the data taught me, each with the code that found it:
- KRX price limits are not symmetric. The +30% cap is floored to the tick of the target price, the −30% floor to the tick of the base price, so the two moves differ by up to 0.26 points depending on where you start. → krx-quant-core
- 31% of the Korean stocks that ever traded are delisted. Drop them and a 2008 backtest loses 37% of its universe. The pipeline keeps them. → quant-airflow
- Pure noise passes "5 of 6 folds positive" about half the time. So a strategy has to beat its own randomized version, not a fold count. → swing-it
Three stacks, one shape — collect → store → research. Korean equities get the most of it: client libraries feed one Airflow pipeline into TimescaleDB, a shared core fixes the market rules, and the research and trading repos read from there. The search itself is treated as optimization with a bill attached: grid sweeps, Optuna TPE and a CMA-ES evolutionary engine write every config to a run ledger, Deflated Sharpe and PBO charge for the number of trials, and the out-of-sample window opens once.
%%{init: {"flowchart": {"useMaxWidth": false, "nodeSpacing": 12, "rankSpacing": 18, "padding": 6}, "themeVariables": {"fontSize": "11px"}}}%%
flowchart TB
subgraph KR ["🇰🇷 Korean equities"]
direction LR
SRC["kiwoom-client<br/>krx-news-client<br/>krx-fundamentals-client"] --> AF["quant-airflow"] --> DB[("TimescaleDB")] --> RS["swing-it · daytrade-it · scalp-it"]
KC["krx-quant-core"] --> RS
end
subgraph US ["🇺🇸 US equities"]
direction LR
SH["Sharadar"] --> DD[("DuckDB")] --> PR["portfolio-research · macro-sector-agent"]
end
subgraph CX ["🪙 Crypto"]
direction LR
EX["Exchange APIs"] --> CR["binance-quant-engine"] --> CI["crypto-quant-insights"]
end
KR ~~~ US ~~~ CX
classDef source fill:#2563EB,stroke:#1E40AF,color:#FFFFFF
classDef move fill:#B45309,stroke:#78350F,color:#FFFFFF
classDef out fill:#059669,stroke:#065F46,color:#FFFFFF
class SRC,SH,EX source
class AF,DB,DD move
class RS,KC,PR,CR,CI out
style KR fill:#0F172A08,stroke:#64748B
style US fill:#0F172A08,stroke:#64748B
style CX fill:#0F172A08,stroke:#64748B
Blue — data sources · amber — collection & storage · green — research & engines. fin-checkup stands alone; scalp-it and daytrade-it are private.
| Project | What it is | |
|---|---|---|
![]() |
kiwoom-client |
Kiwoom Securities REST API wrapper — every domestic-equity endpoint, real-time WebSocket, sync + async, auto token refresh. Ships an MCP server so AI agents call the same API as tools, real orders opt-in only · pip install kiwoom-client |
![]() |
krx-news-client |
Korean market news and disclosures — DART filings and Toss Securities — as one schema, article bodies and per-company history included · pip install krx-news-client |
![]() |
krx-fundamentals-client |
Korean corporate fundamentals — DART statements and dividends, Naver valuation (PER, PBR, yield), screening — as Pydantic models. No standing server |
![]() |
quant-airflow |
The one pipeline behind both equity stacks: Korean prices, supply/demand, earnings, consensus, news and disclosures into TimescaleDB, with delisted stocks backfilled so downstream backtests aren't survivorship-biased. The US Sharadar rebuild into DuckDB is paused since the subscription lapsed |
![]() |
krx-quant-core |
Where the Korean-equity systems agree on market mechanics — tick sizes, asymmetric price limits, a dated transaction-tax schedule, order guards, DART disclosure classes, a kill switch — plus the validation statistics and a research layer (grid sweeps, Optuna TPE, BIPOP CMA-ES) whose run ledger records every trial and hard-locks the out-of-sample window. No strategies; all three consumers pin the same version |
![]() |
fin-checkup |
Risk-disclosure alerts (rights offerings, CB issues, audit opinions, delistings) routed to Telegram, plus a traffic-light financial checkup over DART & SEC EDGAR. Facts and measurements only — never a recommendation |
![]() |
swing-it |
KOSPI/KOSDAQ swing research on two axes: an observation screen of where money went by sector, and a judgment track where alpha hypotheses face walk-forward, random null controls, purged CV and Deflated Sharpe enforced as CI guardrails. The rejections are the product |
![]() |
portfolio-research |
US equity factor engine — strategy parameters walk-forward optimized on point-in-time, survivorship-bias-free data, with Deflated Sharpe & PBO charging for the search; tactical ETF allocation goes through the same gate · writeup |
![]() |
macro-sector-agent |
Top-down US sector-cycle research that asks which industry has been forgotten, not what to buy. An LLM judge argues from evidence at one narrow waist only; the machine never picks — it only excludes |
![]() |
binance-quant-engine |
Strategy-agnostic Binance USDT-M futures backtest & execution engine — zero lookahead, backtest↔live parity, exits placed as exchange-side algo orders at entry, optional MCP server |
![]() |
crypto-quant-insights |
Chart-backed research notes from validating a live futures system — crash stress tests, win rate vs. reward-to-risk, in- vs. out-of-sample divergence, Kelly leverage vs. what's actually run, backtest vs. live fills. The strategy stays private; the findings don't |
![]() |
automated-stock-trading-systems |
Backtester for Bensdorp's seven non-correlated trading systems (educational reimplementation) — runs offline on a synthetic universe, no data vendor, no API key |
Strategies and parameters stay closed. Only structure and discipline are written down. Happy to walk through any of these on request.















