Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Korean market quotes (KOSPI / KOSDAQ / SK Hynix / Samsung) with capitulation-reversal detection. Use whenever reading the US memory/storage complex (MU / DRAM / SNDK / WDC / STX / SMH) — Korea is the SOURCE market and leads the US tape; Longbridge does not cover KRX. Triggers: 韩国 / 韩股 / KOSPI / 海力士 / SK Hynix / 三星 / Samsung / 韩国爆仓 / 韩国追保 / 存储板块见底了吗 / 洗盘结束了吗 / capitulation / Korean margin calls / has the flush ended.
.claude/skills/kansoku-trade-korea-market/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 146% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 34% | 0% |
| case-12 | ✗→✓ | ▲ Improved | -19% | 0% |
Korean quotes + a capitulation-reversal test, from the Yahoo Finance chart API. Stdlib only, no third-party deps, goes through _shared/client.py (cache + throttle + output contract).
Longbridge does not cover KRX. It returns [] for 000660.KS / 005930.KS.
The tempting workaround — read Korea through the US-listed proxies EWY (Korea ETF) and KORU (3× Korea) — lies to you:
The 2026-07-14 proof. Reading the proxies, EWY looked ~flat (−0.13%) — nothing to see. The real Seoul tape that same session:
| | Seoul (real) | Proxy said | | -------- | -------------------------------------------------------------------------------------- | ---------- | | SK Hynix | low −9.1% intraday → closed +2.9% on 1.55× volume (heaviest of the entire selloff) | EWY "flat" |
That was a textbook capitulation bottom, and the proxy hid it completely. Anyone watching EWY would have missed the exact session they were waiting for.
Rule: when the question is about Korea, read Korea.
bashpython3 .claude/skills/korea-market/scripts/quote.py --smoke # connectivity self-test python3 .claude/skills/korea-market/scripts/quote.py # default: KOSPI, KOSDAQ, SK Hynix, Samsung python3 .claude/skills/korea-market/scripts/quote.py --fresh # bypass 5-min cache (use intraday) python3 .claude/skills/korea-market/scripts/quote.py 000660.KS # single name python3 .claude/skills/korea-market/scripts/quote.py --range 6mo # longer history
Yahoo symbols: KRX stocks are NNNNNN.KS (SK Hynix 000660.KS, Samsung 005930.KS); indices are ^KS11 (KOSPI), ^KQ11 (KOSDAQ).
A capitulation bottom BY DEFINITION prints a new low. Testing for "no new low for two sessions" — the obvious naive rule — skips the exact session you are waiting for. That mistake was made on 2026-07-13 and corrected the next day by the data.
Look for exhaustion instead: heaviest selling _into_ a new low, then buyers taking the other side.
| Condition | Field | Reference | | ---------------------------------------------------------------- | --------------- | ------------------------------------ | | New low — sellers pushed below the prior floor | made_new_low | low < prior low | | Heavy volume — selling was maximal, not a drift | heavy_volume | rel_volume ≥ 1.3× (20-session avg) | | Green close — buyers won the session | green_close | close > prev_close | | Closed strong — decisively, not on a last-minute bell bounce | closed_strong | (close−low)/(high−low) ≥ 0.6 |
A washout on light volume is not capitulation — it is a drift lower with nobody home, which has no natural floor. Volume is what separates _"sellers are done"_ from _"buyers left."_
The script deliberately does not emit a verdict. It reports each measurement next to the reference it is being read against, plus a conditions_cleared tally — and stops there.
Why: collapsing this into a boolean throws away the distinction that actually matters. On 2026-07-14, Samsung cleared 3 of 4 with volume at 1.11× against a 1.3× reference — a near-miss. A hard threshold reads that as an identical outcome to KOSDAQ's 1 of 4 (still red, still no bid). Those are not the same animal, and a script that says so is lying to you.
Read the numbers. Weigh them against the tape. Then decide.
--min-rel-volume / --min-close-position tune the references if a name's normal volume profile warrants it.^KS11 / ^KQ11) are context, not evidence. Index volume is a poor exhaustion gauge — it dilutes the memory names across ~900 constituents. Weight the individual names much more heavily.journal/lessons.md.stocks/_leveraged-etf-mechanics.md.Standard repo envelope — success → {"ok": true, "data": {...}, "meta": {...}}, exit 0; failure → {"ok": false, "error": ..., "hint": ...}, non-zero.
data.symbols[] carries close, change_pct, high, low, volume, rel_volume, recovery_from_low_pct, close_position_in_range, drawdown_from_20d_high_pct, is_index, a conditions_cleared tally, and exhaustion_evidence — where each condition reports its value, the reference it is read against, whether it clears, and why that condition matters.
There is no verdict field, by design. See "These are references, not a rule" above.
Cache TTL 300s; pass --fresh when polling intraday.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 15,873 | 19,994 | +26% | 1 | 1 | 0% | 3,172 | 2,014 | -37% | 0 | 0 | — |
case-02 | fail→fail | 18,447 | 4,477 | -76% | 1 | 1 | 0% | 3,726 | 1,899 | -49% | 0 | 0 | — |
case-03 | fail→fail | 15,029 | 4,974 | -67% | 1 | 1 | 0% | 1,956 | 2,017 | +3% | 0 | 0 | — |
case-04 | fail→fail | 14,412 | 18,594 | +29% | 1 | 1 | 0% | 1,894 | 4,449 | +135% | 0 | 0 | — |
case-10 | pass→pass | 15,035 | 6,264 | -58% | 1 | 1 | 0% | 2,375 | 2,702 | +14% | 0 | 0 | — |
case-05 | fail→pass | 7,486 | 7,603 | +2% | 1 | 1 | 0% | 1,176 | 2,891 | +146% | 0 | 0 | — |
case-06 | fail→fail | 14,411 | 6,141 | -57% | 1 | 1 | 0% | 2,463 | 2,093 | -15% | 0 | 0 | — |
case-07 | pass→pass | 16,977 | 9,435 | -44% | 1 | 1 | 0% | 2,511 | 3,234 | +29% | 0 | 0 | — |
case-08 | fail→pass | 11,066 | 5,296 | -52% | 1 | 1 | 0% | 1,875 | 2,666 | +42% | 0 | 0 | — |
case-09 | fail→pass | 8,884 | 3,487 | -61% | 1 | 1 | 0% | 1,613 | 2,398 | +49% | 0 | 0 | — |
case-11 | fail→pass | 14,490 | 7,282 | -50% | 1 | 1 | 0% | 2,142 | 2,867 | +34% | 0 | 0 | — |
case-12 | fail→pass | 14,889 | 1,424 | -90% | 1 | 1 | 0% | 2,431 | 1,964 | -19% | 0 | 0 | — |
case-13 | pass→pass | 5,738 | 2,378 | -59% | 1 | 1 | 0% | 1,071 | 2,070 | +93% | 0 | 0 | — |
case-14 | fail→pass | 9,793 | 3,448 | -65% | 1 | 1 | 0% | 1,497 | 2,208 | +47% | 0 | 0 | — |
case-15 | pass→pass | 15,860 | 7,005 | -56% | 1 | 1 | 0% | 2,499 | 2,850 | +14% | 0 | 0 | — |
case-16 | pass→pass | 14,159 | 9,681 | -32% | 1 | 1 | 0% | 2,138 | 3,096 | +45% | 0 | 0 | — |
case-17 | pass→pass | 22,268 | 26,199 | +18% | 1 | 1 | 0% | 2,557 | 7,134 | +179% | 0 | 0 | — |
case-18 | pass→pass | 12,075 | 6,929 | -43% | 1 | 1 | 0% | 1,808 | 2,757 | +52% | 0 | 0 | — |
case-19 | pass→pass | 16,935 | 8,555 | -49% | 1 | 1 | 0% | 2,474 | 2,998 | +21% | 0 | 0 | — |
case-20 | fail→pass | 9,520 | 2,036 | -79% | 1 | 1 | 0% | 1,536 | 2,051 | +34% | 0 | 0 | — |
case-21 | fail→pass | 10,988 | 2,277 | -79% | 1 | 1 | 0% | 2,036 | 2,135 | +5% | 0 | 0 | — |
case-22 | fail→pass | 13,123 | 2,400 | -82% | 1 | 1 | 0% | 2,446 | 2,108 | -14% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 18 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.