finchal / app /i18n.py
SeaWolf-AI's picture
show received entries before scoring begins
cab04ab verified
Raw
History Blame Contribute Delete
16.3 kB
# -*- coding: utf-8 -*-
"""์ด์ค‘์–ธ์–ด ๋ฌธ๊ตฌ โ€” ์„œ๋ฒ„๊ฐ€ ๋‚ด๋ ค์ฃผ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์šฉ ๋ฌธ์žฅ์ด ์—ฌ๊ธฐ ์žˆ๋‹ค.
๐Ÿ”ด ํ™”๋ฉด ๋ฌธ๊ตฌ๋งŒ ๋ฒˆ์—ญํ•˜๋ฉด ๋ฐ˜์ชฝ์ด๋‹ค. ์ทจ์ง€ยท๊ทœ์น™ยท์ฑ„์  ํžŒํŠธยท๊ฒฝ๊ณ ๋Š” ์„œ๋ฒ„๊ฐ€ ๋งŒ๋“ค์–ด
๋‚ด๋ ค๋ณด๋‚ด๋ฏ€๋กœ, ์ด์ชฝ์„ ์•ˆ ํ•˜๋ฉด ์˜์–ด ํ™”๋ฉด์— ํ•œ๊ตญ์–ด๊ฐ€ ์„ž์ธ๋‹ค.
๐Ÿ”ด MCP ๋„๊ตฌ ์„ค๋ช…๋„ ์–ธ์–ด๋ฅผ ํƒ„๋‹ค. ์—์ด์ „ํŠธ๋Š” ๊ทธ ์„ค๋ช…์„ ์ฝ๊ณ  ํŒ๋‹จํ•˜๋ฏ€๋กœ
์˜์–ด๊ถŒ ์—์ด์ „ํŠธ์—๊ฒŒ๋Š” ์˜์–ด๋กœ ์ค˜์•ผ ํ•œ๋‹ค.
ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ํ•œ๊ตญ์–ด๋กœ ๋–จ์–ด์ง„๋‹ค. ์กฐ์šฉํžˆ ๋นˆ์นธ์ด ๋˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค.
"""
DEFAULT = "ko"
LANGS = ("ko", "en")
def pick(accept_language, explicit=None):
"""์–ธ์–ด ๊ฒฐ์ •. ๋ช…์‹œ ์„ ํƒ์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒŒ ์ด๊ธด๋‹ค.
Accept-Language ๋Š” "en-US,en;q=0.9,ko;q=0.8" ๊ฐ™์€ ๋ชจ์–‘์ด๋‹ค.
์•ž์—์„œ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ์–ธ์–ด๊ฐ€ ๋‚˜์˜ค๋Š” ์ฒซ ํ•ญ๋ชฉ์„ ์“ด๋‹ค.
"""
if explicit in LANGS:
return explicit
for part in (accept_language or "").split(","):
code = part.split(";")[0].strip().lower()[:2]
if code in LANGS:
return code
return DEFAULT
def t(d, lang):
"""{"ko": ..., "en": ...} ์—์„œ ํ•˜๋‚˜ ๊ณ ๋ฅธ๋‹ค. ์—†์œผ๋ฉด ํ•œ๊ตญ์–ด."""
if not isinstance(d, dict):
return d
return d.get(lang) or d.get(DEFAULT)
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์ข…๋ชฉ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
ASSET = {
"NVDA": {
"label": {"ko": "์—”๋น„๋””์•„", "en": "NVIDIA"},
"why": {"ko": "AI ๊ทธ ์ž์ฒด. ์ด ์‹œ์žฅ์„ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์ด ์ด ๋Œ€ํšŒ์˜ ์ƒ์ง•",
"en": "AI itself. Predicting this market is what this contest is about."},
},
"BTC": {
"label": {"ko": "๋น„ํŠธ์ฝ”์ธ", "en": "Bitcoin"},
"why": {"ko": "AI๊ฐ€ ํ”๋“  ์ƒˆ ํ™”ํ. 24์‹œ๊ฐ„ ๊ฑฐ๋ž˜ยทํœด์žฅ ์—†์Œ",
"en": "The new money AI shook. Trades 24/7, never closes."},
},
"GOLD": {
"label": {"ko": "๊ธˆ", "en": "Gold"},
"why": {"ko": "์ธ๋ฅ˜๊ฐ€ 5,000๋…„ ๋ฏฟ์–ด์˜จ ๊ฐ€์น˜. ๋ฐฉํ–ฅ์ด ์—†์–ด ์šด์œผ๋กœ ๋ฒŒ๊ธฐ ๊ฐ€์žฅ ์–ด๋ ต๋‹ค",
"en": "What humanity trusted for 5,000 years. Nearly directionless, "
"so luck alone gets you the least here."},
},
"OIL": {
"label": {"ko": "์œ ๊ฐ€", "en": "Crude Oil"},
"why": {"ko": "์„ธ์ƒ์„ ๊ตด๋ ค์˜จ ์‚ฐ์—…์˜ ์‹ฌ์žฅ. AI๋Š” ์˜› ์‹œ์žฅ๋„ ์˜ˆ์ธกํ•˜๋Š”๊ฐ€",
"en": "The industrial heart that moved the world. Can AI read the old markets too?"},
},
}
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๊ทœ์น™ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
RULES = {
"prize": {"ko": "์ข…๋ชฉ๋ณ„ ์ตœ์ข… ์ˆ˜์ต๋ฅ  1์œ„ %d๋‹ฌ๋Ÿฌ ยท ์ด %d๋‹ฌ๋Ÿฌ",
"en": "$%d to the top final return in each asset ยท $%d total"},
"leverage": {"ko": "ํฌ์ง€์…˜ -1.0 ~ +1.0. ๋ ˆ๋ฒ„๋ฆฌ์ง€ 1 ๊ณ ์ •. ๋ฒ—์–ด๋‚˜๋ฉด ์ž˜๋ฆผ",
"en": "Position -1.0 to +1.0. Leverage fixed at 1. Values outside are clipped."},
"update": {"ko": "๋งค์‹œ๊ฐ„ ๊ฐฑ์‹  ๊ฐ€๋Šฅ. ๋‹ค์‹œ ๋‚ผ ๋•Œ๊นŒ์ง€ ์ง์ „ ํฌ์ง€์…˜์ด ์œ ์ง€๋จ",
"en": "Update hourly if you like. Your last position stands until you replace it."},
"fee_note": {"ko": "ํฌ์ง€์…˜ ๋ณ€๊ฒฝ๋ถ„์—๋งŒ ๋ถ€๊ณผ. ์ž์ฃผ ๋’ค์ง‘์œผ๋ฉด ์ˆ˜์ˆ˜๋ฃŒ๋กœ ์žƒ๋Š”๋‹ค",
"en": "Charged on position changes only. Flip often and the fees eat you."},
"scoring": {"ko": "์ข…๋ชฉ๋ณ„ ์ตœ์ข… ์ˆ˜์ต๋ฅ ๋กœ ์ˆœ์œ„. ์˜†์— '์šด์œผ๋กœ ์ด๋Ÿด ํ™•๋ฅ '์„ ํ•จ๊ป˜ ํ‘œ์‹œ",
"en": "Ranked by final return within each asset, shown next to the odds "
"of getting there by luck."},
"participation": {"ko": "ํ•ด๋‹น ์ข…๋ชฉ ๊ฐœ์„ค~๋งˆ๊ฐ ๊ธฐ๊ฐ„์˜ 70% ์ด์ƒ ํฌ์ง€์…˜์ด ์œ ํšจํ•ด์•ผ ์ƒ๊ธˆ ๋Œ€์ƒ",
"en": "A valid position for at least 70% of the asset's season "
"to be eligible for prizes."},
"luck_note": {"ko": "์‹ค๋ ฅ 0์ธ ์ฐธ๊ฐ€์ž๋ฅผ ์‹œ์ฆŒ ๊ธธ์ด๋งŒํผ 20,000ํšŒ ๋Œ๋ ค ๋‚ธ ์ƒ์œ„ 5% ์ง€์ . "
"์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ๋˜‘๊ฐ™์ด ๋ฌผ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด ์„ ์„ ๋„˜์–ด์•ผ ์‹ค๋ ฅ์˜ ์ฆ๊ฑฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.",
"en": "The 95th percentile of 20,000 zero-skill players run over the "
"same season length, charged the same fees. Clear this line "
"before calling a result skill."},
"warning": {"ko": "์—”๋น„๋””์•„ ์‹ค์ ์ด 2026-08-26์ด๋‹ค. ์‹ค์ ์ผ ๋ณ€๋™์€ ํ‰์ƒ์ผ์˜ 2.7๋ฐฐ์ด๊ณ  "
"87%๊ฐ€ ์‹œ๊ฐ€ ๊ฐญ์ด๋ผ ์žฅ์ค‘ ๋Œ€์‘์ด ์•ˆ ๋œ๋‹ค. ์‹œ์ฆŒ ์ค‘ 1ํšŒ๋‹ค.",
"en": "NVIDIA reports on 2026-08-26. Earnings-day moves run 2.7x a normal "
"day and 87% of that lands in the opening gap, so you cannot react "
"intraday. It happens once this season."},
"durability_warn": {"ko": "์›์žฅ์ด ์žฌ์‹œ์ž‘์„ ๊ฒฌ๋”˜๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. "
"๋ฏธ๋Ÿฌ๋‚˜ ์˜์† ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋ถ™์ด์‹ญ์‹œ์˜ค.",
"en": "No evidence the ledger survives a restart. "
"Attach a mirror or persistent storage."},
}
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์ฑ„์  ํžŒํŠธ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
HINT = {
"pending": {"ko": "์ง‘๊ณ„ ์ „", "en": "not scored yet"},
"have_pos": {"ko": "ํฌ์ง€์…˜์€ ์ ‘์ˆ˜๋์Šต๋‹ˆ๋‹ค. ์‹œ์ฆŒ์ด ํ•˜๋ฃจ ์ด์ƒ ์ง„ํ–‰๋˜๋ฉด ์ˆ˜์ต๋ฅ ์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.",
"en": "Your position is recorded. Returns appear once the season has "
"run for at least a day."},
"no_pos": {"ko": "์•„์ง ํฌ์ง€์…˜์„ ๋‚ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.",
"en": "You have not submitted a position yet."},
"over": {"ko": "์šด์˜ ํ•œ๊ณ„์„ ์„ ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค",
"en": "You are past the luck ceiling"},
"under": {"ko": "์•„์ง ์šด์œผ๋กœ๋„ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค",
"en": "Still inside what luck alone could produce"},
"unknown_asset": {"ko": "์•Œ ์ˆ˜ ์—†๋Š” ์ข…๋ชฉ. ๊ฐ€๋Šฅ: %s",
"en": "Unknown asset. Available: %s"},
"need_key": {"ko": "์ฐธ๊ฐ€ ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์—์„œ ๋กœ๊ทธ์ธํ•˜๋ฉด fc_ ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ‚ค๊ฐ€ "
"๋‚˜์˜ต๋‹ˆ๋‹ค. MCP ์„ค์ •์˜ Authorization ํ—ค๋”์— ๋„ฃ์–ด ์ฃผ์„ธ์š”.",
"en": "A participant key is required. Sign in on the site to get a key "
"starting with fc_, then put it in the Authorization header of "
"your MCP config."},
"kept": {"ko": "๋‹ค์‹œ ์ œ์ถœํ•  ๋•Œ๊นŒ์ง€ ์ด ํฌ์ง€์…˜์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค",
"en": "This position stands until you submit again"},
}
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ์ทจ์ง€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
MANIFESTO = {
"title": {"ko": "AI๋Š” ์‹œ์žฅ์„ ์ด๊ธธ ์ˆ˜ ์žˆ๋Š”๊ฐ€",
"en": "Can AI Beat the Market?"},
"sub": {"ko": "122์ผ๊ฐ„์˜ ๊ณต๊ฐœ ์‹คํ—˜", "en": "A 122-day open experiment"},
# ๋Œ€ํšŒ์˜ ๋ช…๋ถ„. 3๋ง‰์œผ๋กœ ๊ฐ„๋‹ค.
#
# ๋ฌธ๊ตฌ ์›์น™ ๋‘˜.
# ์ธก์ •ํ•œ ๊ฒƒ๋งŒ ์“ด๋‹ค. ๋Œ€ํšŒ์˜ ์ฃผ์žฅ์€ ์ „๋ถ€ ์ˆซ์ž๋กœ ๋’ท๋ฐ›์นจ๋˜์–ด์•ผ ํ•œ๋‹ค.
# ์‹œ์žฅ ์™œ๊ณก์€ '๋Œ€ํ˜• ์ž๊ธˆ์˜ ์œ ๋™์„ฑ ์ˆ˜์š”'๋กœ ์“ด๋‹ค โ€” ๋ฌธํ—Œ์— ๊ทผ๊ฑฐ๊ฐ€ ์žˆ๋Š” ํ‘œํ˜„์ด๋‹ค.
"acts": [
({"ko": "์‹œ์žฅ์€ ์™œ ์–ด๋ ค์šด๊ฐ€",
"en": "Why markets are hard"},
{"ko": "๊ธˆ๋ฆฌ ๊ฒฐ์ • ํ•˜๋‚˜, ์ „์Ÿ ํ•˜๋‚˜, ์‹ค์  ๋ฐœํ‘œ ํ•˜๋‚˜๊ฐ€ ๋ช‡ ๋‹ฌ์น˜ ๋ถ„์„์„ ์ง€์›๋‹ˆ๋‹ค. "
"๋ณ€์ˆ˜์˜ ์ˆ˜๊ฐ€ ๊ด€์ธก์น˜๋ณด๋‹ค ๋งŽ๊ณ , ํฐ ์ž๊ธˆ์€ ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ๋™์„ฑ ๋•Œ๋ฌธ์— "
"์›€์ง์—ฌ ๊ฐ€๊ฒฉ์„ ์‹ค์ œ ๊ฐ€์น˜์—์„œ ๋ฐ€์–ด๋ƒ…๋‹ˆ๋‹ค. "
"์–ด๋–ค ๋‹จ์ผ ๋ชจ๋ธ๋„ ์‹œ์žฅ ์ „์ฒด๋ฅผ ๋‹ด์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋ธ์ด ๋ถ€์กฑํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ "
"๋Œ€์ƒ์ด ๊ทธ๋Ÿฐ ์„ฑ์งˆ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.",
"en": "One rate decision, one war, one earnings print erases months of "
"analysis. There are more moving parts than observations, and large "
"capital moves for liquidity rather than information, pushing price "
"away from value. No single model holds the whole market โ€” not because "
"our models are weak, but because that is what the thing is."}),
({"ko": "์ธ๊ฐ„๊ณผ AI, ๋ˆ„๊ฐ€ ๋‚˜์€์ง€ ์•„๋ฌด๋„ ๋ชจ๋ฅธ๋‹ค",
"en": "Nobody knows whether humans or AI read it better"},
{"ko": "์ธ๊ฐ„์€ ๋งฅ๋ฝ๊ณผ ์„œ์‚ฌ๋ฅผ ์ฝ๊ณ , AI๋Š” ํŒจํ„ด๊ณผ ๊ทœ๋ชจ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. "
"๋‘˜์„ ๊ฐ™์€ ์กฐ๊ฑด์—์„œ ๊ฐ™์€ ๊ธฐ๊ฐ„ ๊ฒจ๋ฃจ๊ฒŒ ํ•œ ๊ณต๊ฐœ ๊ธฐ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค. "
"์„ฑ๊ณต์€ ์‚ฌํ›„์— ์„ ๋ณ„๋˜์–ด ๋ณด๋„๋˜๊ณ  ์‹คํŒจ๋Š” ๊ธฐ๋ก์กฐ์ฐจ ๋‚จ์ง€ ์•Š์œผ๋‹ˆ, "
"์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ๊ฒƒ์€ ์‚ด์•„๋‚จ์€ ์ด์•ผ๊ธฐ๋ฟ์ž…๋‹ˆ๋‹ค. "
"122์ผ ๋™์•ˆ ๋ชจ๋“  ์ฐธ๊ฐ€์ž์˜ ์„ฑ์ ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‚จ๊น๋‹ˆ๋‹ค.",
"en": "Humans read context and narrative; machines read patterns and scale. "
"No public record exists of the two competing under identical "
"conditions over the same window. Winners are selected after the fact "
"and losers leave no trace, so all we know are the stories that "
"survived. For 122 days every entrant's record stands, start to finish."}),
({"ko": "ํ•จ๊ป˜ ์žฌ๋ฉด ๋ฌด์—‡์„ ์•Œ ์ˆ˜ ์žˆ๋‚˜",
"en": "What we actually learn by measuring together"},
{"ko": "๋‹จ๊ธฐ ๋ฐฉํ–ฅ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์‹œํ—˜ํ•œ 60๊ฐœ ํ›„๋ณด ๋ณ€์ˆ˜ ์–ด๋””์—์„œ๋„ ์˜ˆ์ธก๋ ฅ์ด "
"ํ™•์ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋Œ€ํšŒ๋Š” ๊ทธ ์ง€์ ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. "
"ํ•œ ๋ชจ๋ธ์ด ๋ฉˆ์ถ˜ ์ž๋ฆฌ๋Š” ์ •๋ณด๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋ชจ๋ธ์ด ๊ฐ™์€ "
"์ž๋ฆฌ์—์„œ ๋ฉˆ์ถ”๋ฉด ๊ทธ๊ฒƒ์€ ์‹œ์žฅ์˜ ์„ฑ์งˆ์— ๋Œ€ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค. "
"๊ทธ๋ž˜์„œ ์ด ๋Œ€ํšŒ๊ฐ€ ๋ชจ์œผ๋Š” ๊ฒƒ์€ ๋‹ต์ด ์•„๋‹ˆ๋ผ ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค. "
"์–ด๋””๊นŒ์ง€๊ฐ€ ์šด์ด๊ณ  ์–ด๋””๋ถ€ํ„ฐ๊ฐ€ ์‹ค๋ ฅ์ธ์ง€, ๊ทธ ์„ ์„ ์ˆซ์ž๋กœ ๋‚จ๊น๋‹ˆ๋‹ค.",
"en": "Across sixty candidate variables we tested directly, none showed "
"predictive power over short-horizon direction. This contest starts "
"from there. Where one model stops is not information; where hundreds "
"of independent models stop is information about the market itself. "
"So what this collects is not an answer but a boundary โ€” where luck "
"ends and skill begins, written down as a number."}),
],
"why": [
({"ko": "์„ฑ๊ณต๋งŒ ๋ณด๋„๋ฉ๋‹ˆ๋‹ค", "en": "Only the winners get written up"},
{"ko": "์ˆ˜์ต ๋‚ธ ์‚ฌ๋žŒ๋งŒ ์ธํ„ฐ๋ทฐํ•ฉ๋‹ˆ๋‹ค. ์ง„ ์‚ฌ๋žŒ 999๋ช…์€ ๊ธฐ๋ก๋„ ๋‚จ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"en": "The one who made money gets interviewed. The 999 who lost leave no record."}),
({"ko": "๋ฐฑํ…Œ์ŠคํŠธ๋Š” ์กฐ์ž‘๋ฉ๋‹ˆ๋‹ค", "en": "Backtests can be bent"},
{"ko": "๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋กœ ์—ฐ 200%๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜๋กœ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.",
"en": "Anyone can produce 200% a year on past data. Nobody can on future data."}),
({"ko": "์šด๊ณผ ์‹ค๋ ฅ์ด ์•ˆ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค", "en": "Luck and skill look identical"},
{"ko": "ํ•œ ๋‹ฌ์— 30% ๋‚ธ ์‚ฌ๋žŒ์ด ์‹ค๋ ฅ์ธ์ง€ ์šด์ธ์ง€ ํŒ๋ณ„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.",
"en": "There has been no way to tell whether +30% in a month was skill or luck."}),
],
"how": [
({"ko": "์šด์˜ ํฌ๊ธฐ๋ฅผ ์ˆซ์ž๋กœ ์••๋‹ˆ๋‹ค", "en": "We measured how far luck alone gets you"},
{"ko": "์‹ค๋ ฅ 0์ธ ์ฐธ๊ฐ€์ž๊ฐ€ 122์ผ์— ์–ด๋””๊นŒ์ง€ ๊ฐ€๋Š”์ง€ 20,000ํšŒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ์Ÿ€์Šต๋‹ˆ๋‹ค. "
"์ˆ˜์ˆ˜๋ฃŒ๊นŒ์ง€ ๋ฌผ๋ฆฐ ๊ฐ’์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ +86.6%, ๊ธˆ +9.2%. "
"์ด ์„ ์„ ๋„˜์ง€ ๋ชปํ•œ ์ˆ˜์ต์€ ์‹ค๋ ฅ์˜ ์ฆ๊ฑฐ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.",
"en": "20,000 simulations of a zero-skill player over 122 days, charged the same "
"fees: Bitcoin +86.6%, Gold +9.2%. A return below that line is not "
"evidence of skill."}),
({"ko": "์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค", "en": "It cannot be gamed"},
{"ko": "์ •๋‹ต์ด ๋ฏธ๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์ถœํ•œ ๋’ค์— ์„ธ์ƒ์ด ์ •๋‹ต์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.",
"en": "The answer lives in the future. The world writes it after you submit."}),
({"ko": "๊ฐ™์€ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค", "en": "Everyone gets the same conditions"},
{"ko": "๋ ˆ๋ฒ„๋ฆฌ์ง€ 1 ๊ณ ์ •, ๊ฐ™์€ ๋ฐ์ดํ„ฐ, ๊ฐ™์€ ์‹œ๊ฐ. ํฌ๊ฒŒ ๊ฑธ์–ด ์ด๊ธฐ๋Š” ๊ธธ์„ ๋ง‰์•˜์Šต๋‹ˆ๋‹ค.",
"en": "Leverage fixed at 1, same data, same clock. Betting bigger is not a way to win."}),
],
"our_stake": {
"ko": "์ฃผ์ตœ์ธก์€ ์ˆœ์œ„์— ์ฐธ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹จ์ˆœ ๋ณด์œ ยท๋ณ€๋™์„ฑ ํƒ€๊ฒŸํŒ…ยท๋ฌด์ž‘์œ„ "
"์„ธ ๊ธฐ์ค€์„ ์„ ๊ฐ™์€ ํ‘œ์— ์˜ฌ๋ ค, ์„ฑ์ ์„ ๋ฌด์—‡์— ๊ฒฌ์ค„์ง€ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.",
"en": "The organizers do not compete. Instead three baselines โ€” buy and hold, "
"volatility targeting, and random โ€” sit in the same table so you can see "
"what your result should be measured against."},
}
ANCHOR = {
"BUYHOLD": {"ko": "๋‹จ์ˆœ ๋ณด์œ ", "en": "Buy and Hold"},
"VOLTARGET": {"ko": "๋ณ€๋™์„ฑ ํƒ€๊ฒŸํŒ…", "en": "Volatility Targeting"},
"RANDOM": {"ko": "๋ฌด์ž‘์œ„", "en": "Random"},
}
TYPE = {
"human": {"ko": "์‚ฌ๋žŒ", "en": "Human"},
"expert": {"ko": "์ „๋ฌธ๊ฐ€ยท๊ธฐ๊ด€", "en": "Quant / Institution"},
"agent": {"ko": "AI ์—์ด์ „ํŠธ", "en": "AI Agent"},
"anchor": {"ko": "๊ธฐ์ค€์„ ", "en": "Baseline"},
}
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ MCP ๋„๊ตฌ ์„ค๋ช… โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
TOOLDESC = {
"get_rules": {
"ko": "์ฑŒ๋ฆฐ์ง€ ๊ทœ์น™๊ณผ ํ˜„์žฌ ์‹œ์ฆŒ ์ •๋ณด๋ฅผ ์ฝ๋Š”๋‹ค. ์ฐธ๊ฐ€ ์ „์— ๋ฐ˜๋“œ์‹œ ๋จผ์ € ํ˜ธ์ถœํ•œ๋‹ค. "
"์ข…๋ชฉ ๋ชฉ๋กยท๋งˆ๊ฐ์ผยท๋ ˆ๋ฒ„๋ฆฌ์ง€ ์ƒํ•œยท์ˆ˜์ˆ˜๋ฃŒยท์ฑ„์  ๋ฐฉ์‹์ด ๋“ค์–ด ์žˆ๋‹ค.",
"en": "Read the challenge rules and current season. Always call this first. "
"Covers the asset list, deadline, leverage cap, fees, and scoring."},
"get_data": {
"ko": "์ข…๋ชฉ์˜ ๊ณผ๊ฑฐ ์‹œ์„ธ๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋กœ ์ง์ ‘ ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด ์˜ˆ์ธกํ•˜๋ผ. "
"๋ฏธ๋ž˜ ๋ฐ์ดํ„ฐ๋Š” ์ฃผ์ง€ ์•Š๋Š”๋‹ค โ€” ์ •๋‹ต์€ ์•„์ง ์„ธ์ƒ์— ์—†๋‹ค.",
"en": "Fetch historical prices for an asset. Build your own model on it. "
"No future data is served โ€” the answer does not exist yet."},
"submit_position": {
"ko": "ํฌ์ง€์…˜์„ ์ œ์ถœํ•œ๋‹ค. -1.0(์ „๋Ÿ‰ ์ˆ) ~ +1.0(์ „๋Ÿ‰ ๋กฑ). ๋ ˆ๋ฒ„๋ฆฌ์ง€๋Š” 1๋กœ ๊ณ ์ •์ด๋ฉฐ "
"๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ž˜๋ฆฐ๋‹ค. ๋‹ค์‹œ ์ œ์ถœํ•  ๋•Œ๊นŒ์ง€ ์ด ํฌ์ง€์…˜์ด ์œ ์ง€๋œ๋‹ค. "
"ํฌ์ง€์…˜์„ ๋ฐ”๊ฟ€ ๋•Œ๋งˆ๋‹ค ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ๋‚˜๊ฐ€๋ฏ€๋กœ ์ž์ฃผ ๋’ค์ง‘์œผ๋ฉด ์†ํ•ด๋‹ค.",
"en": "Submit a position from -1.0 (fully short) to +1.0 (fully long). Leverage is "
"fixed at 1 and values outside the range are clipped. The position stands "
"until you submit again. Every change costs a fee, so flipping often loses money."},
"check_score": {
"ko": "๋‚ด ์„ฑ์ ๊ณผ ์ˆœ์œ„๋ฅผ ํ™•์ธํ•œ๋‹ค. ์ˆ˜์ต๋ฅ ยท์ˆœ์œ„ยท์šด์˜ ํ•œ๊ณ„์„  ๋Œ€๋น„ ์œ„์น˜๋ฅผ ๋Œ๋ ค์ค€๋‹ค.",
"en": "Check your standing: return, rank, and where you sit against the luck ceiling."},
}
MCP_INSTRUCTIONS = {
"ko": "๊ธˆ์œต ์˜ˆ์ธก ์ฑŒ๋ฆฐ์ง€๋‹ค. ๋ฐฉํ–ฅ์„ ๋งžํžˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ํฌ์ง€์…˜์„ ์žก์•„ "
"์ˆ˜์ต๋ฅ ๋กœ ๊ฒจ๋ฃฌ๋‹ค. get_rules ๋กœ ์‹œ์ž‘ํ•˜๋ผ.",
"en": "This is a financial forecasting challenge. You do not call direction โ€” you take "
"real positions and compete on returns. Start with get_rules."}