mirror29/inalpha

๐ŸฆŠ ์˜คํ”ˆ์†Œ์Šค ์ „๋ฌธ ํ€€ํŠธ ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ. ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ ์ž‘๋™ ์ค‘์ธ ์š”์†Œ๋ฅผ ์„ ํƒํ•ด ์ง„์ž… ์‹œ์ ์„ ํŒŒ์•…ํ•˜๊ณ , ์ „์ฒด ์ „๋žต์„ ์ž‘์„ฑํ•˜๋ฉฐ, ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์ง„ํ™”์‹œํ‚ต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฃผ๋ฌธ์€ ๊ธฐ๊ณ„ ์Šน์ธ์„ ๊ฑฐ์ณ ์‹คํ–‰๋˜๋ฉฐ LLM์€ ์ฃผ๋ฌธ ๊ฒฝ๋กœ์— ๊ด€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋งˆ์ผ“, ๊ฐ์‚ฌ ์ˆ˜์ค€.

inalpha๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

mirror29/inalpha๋Š” ์˜คํ”ˆ์†Œ์Šค ์ „๋ฌธ ํ€€ํŠธ ํŠธ๋ ˆ์ด๋”ฉ ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, LLM ๊ธฐ๋ฐ˜ ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ ์‹œ์žฅ์—์„œ ์œ ํšจํ•œ ํŒฉํ„ฐ(factor)๋ฅผ ์„ ํƒํ•˜์—ฌ ์ง„์ž… ํƒ€์ด๋ฐ์„ ํฌ์ฐฉํ•˜๊ณ , ์™„์ „ํ•œ ํŠธ๋ ˆ์ด๋”ฉ ์ „๋žต์„ ์ž‘์„ฑํ•˜๋ฉฐ, ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์—์„œ ์ „๋žต์„ ์ง„ํ™”์‹œํ‚ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฃผ๋ฌธ์€ ๊ธฐ๊ณ„ ์Šน์ธ ์‹œ์Šคํ…œ(๋จธ์‹  ์–ดํ”„๋ฃจ๋ฒŒ, machine approval)์„ ๊ฑฐ์ณ ์‹คํ–‰๋˜๋ฉฐ, LLM์€ ์ฃผ๋ฌธ ๊ฒฝ๋กœ์— ์ง์ ‘ ๊ด€์—ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋” ์‹คํ–‰์˜ ์•ˆ์ „์„ฑ๊ณผ ๊ฐ์‚ฌ ๊ฐ€๋Šฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋ฉ€ํ‹ฐ ๋งˆ์ผ“(์ฃผ์‹, ์•”ํ˜ธํ™”ํ, ์„ ๋ฌผ ๋“ฑ)์„ ์ง€์›ํ•˜๋ฉฐ, ๊ฐ์‚ฌ ๋“ฑ๊ธ‰(audit-grade)์˜ ๋กœ๊น…์„ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ๊ด€ ์ˆ˜์ค€์˜ ๊ทœ์ • ์ค€์ˆ˜์™€ ํˆฌ๋ช…์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ์„ค๋ช…์ด๋‚˜ ๊ธฐ์กด ์ „๋žต์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž๋™์œผ๋กœ ์ „๋žต์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฑํ…Œ์ŠคํŠธํ•˜๋ฉฐ, ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ „๋žต์„ ์Šค์Šค๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด ํ€€ํŠธ ํŠธ๋ ˆ์ด๋”์™€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ง€์› ๋Œ€์ƒ~Claude Code~Codex CLI~Cursor
npx skills add mirror29/inalpha

Installed? Explore more ๋ผ์ดํŒ… & ์—๋””ํŒ… skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation ยท View all 6 โ†’

์ฆ๊ฒจ ์‚ฌ์šฉํ•˜๋Š” AI์—๊ฒŒ ๋ฌผ์–ด๋ณด๊ธฐ

์ด ์—์ด์ „ํŠธ ์Šคํ‚ฌ์ด ๋ฏธ๋ฆฌ ๋กœ๋“œ๋œ ์ƒˆ ์ฑ„ํŒ…์„ ์—ฝ๋‹ˆ๋‹ค.

๋ฌธ์„œ

inalpha์€(๋Š”) ๋ฌด์—‡์„ ํ•˜๋‚˜์š”?

๐ŸฆŠ ์˜คํ”ˆ์†Œ์Šค ์ „๋ฌธ ํ€€ํŠธ ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ. ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ ์ž‘๋™ ์ค‘์ธ ์š”์†Œ๋ฅผ ์„ ํƒํ•ด ์ง„์ž… ์‹œ์ ์„ ํŒŒ์•…ํ•˜๊ณ , ์ „์ฒด ์ „๋žต์„ ์ž‘์„ฑํ•˜๋ฉฐ, ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์ง„ํ™”์‹œํ‚ต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฃผ๋ฌธ์€ ๊ธฐ๊ณ„ ์Šน์ธ์„ ๊ฑฐ์ณ ์‹คํ–‰๋˜๋ฉฐ LLM์€ ์ฃผ๋ฌธ ๊ฒฝ๋กœ์— ๊ด€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ ๋งˆ์ผ“, ๊ฐ์‚ฌ ์ˆ˜์ค€.

๊ฐœ์š”

mirror29/inalpha๋Š” ํ€€ํŠธ ํŠธ๋ ˆ์ด๋”ฉ ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ด ์Šคํ‚ฌ์€ LLM(๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ)์ด ์ „๋žต ์„ค๊ณ„์™€ ์„ ํƒ์—๋Š” ๊ด€์—ฌํ•˜์ง€๋งŒ, ์‹ค์ œ ์ฃผ๋ฌธ ์‹คํ–‰ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ์•ˆ์ „ํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

  • ํŒฉํ„ฐ ๊ธฐ๋ฐ˜ ํƒ€์ด๋ฐ: ํ˜„์žฌ ์‹œ์žฅ์—์„œ ๊ฐ€์žฅ ์œ ํšจํ•œ ๊ธฐ์ˆ ์ /ํŽ€๋”๋ฉ˜ํ„ธ ํŒฉํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ ์ „๋žต ์ž‘์„ฑ: ์ž์—ฐ์–ด ์„ค๋ช…๋งŒ์œผ๋กœ ์™„์ „ํ•œ ํŠธ๋ ˆ์ด๋”ฉ ์ „๋žต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒŒ๋“œ๋ฐ•์Šค ์ง„ํ™”: ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์ „๋žต์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ง„ํ™”์‹œํ‚ต๋‹ˆ๋‹ค.
  • ๊ธฐ๊ณ„ ์Šน์ธ ์‹œ์Šคํ…œ: ๋ชจ๋“  ์ฃผ๋ฌธ์€ ์‚ฌ์ „ ์ •์˜๋œ ๊ทœ์น™ ๊ธฐ๋ฐ˜ ์Šน์ธ ์‹œ์Šคํ…œ์„ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • LLM ๋น„์ ‘์ด‰ ์˜ค๋” ๊ฒฝ๋กœ: LLM์€ ์ฃผ๋ฌธ ์‹คํ–‰์— ์ง์ ‘ ๊ด€์—ฌํ•˜์ง€ ์•Š์•„ ๋ณด์•ˆ๊ณผ ๊ฐ์‚ฌ์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐ ๋งˆ์ผ“ ์ง€์›: ์ฃผ์‹, ์•”ํ˜ธํ™”ํ, ์„ ๋ฌผ, ์™ธํ™˜ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์žฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์‚ฌ ๋“ฑ๊ธ‰ ๋กœ๊น…: ๋ชจ๋“  ๊ฒฐ์ •๊ณผ ์ฃผ๋ฌธ ๋‚ด์—ญ์ด ๋ถˆ๋ณ€ ๋กœ๊ทธ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ

์„ค์น˜

pip install inalpha

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

from inalpha import Agent, Market

# ์—์ด์ „ํŠธ ์ƒ์„ฑ
agent = Agent(
    name="my-quant-agent",
    description="๋ณ€๋™์„ฑ ๋ŒํŒŒ ์ „๋žต์„ ์ถ”๊ตฌํ•˜๋Š” ์—์ด์ „ํŠธ",
    markets=[Market.STOCK, Market.CRYPTO]
)

# ์ „๋žต ์ƒ์„ฑ
agent.create_strategy(
    """
    RSI๊ฐ€ 30 ์ดํ•˜์ด๊ณ  ๊ฑฐ๋ž˜๋Ÿ‰์ด 20์ผ ํ‰๊ท ๋ณด๋‹ค 2๋ฐฐ ์ด์ƒ์ผ ๋•Œ ๋งค์ˆ˜.
    RSI๊ฐ€ 70 ์ด์ƒ์ด๊ฑฐ๋‚˜ ์ต์ ˆ 5% ๋„๋‹ฌ ์‹œ ๋งค๋„.
    """
)

# ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ ์ „๋žต ๊ฒ€์ฆ
agent.backtest(start_date="2024-01-01", end_date="2024-12-31")

# ์—์ด์ „ํŠธ ์‹คํ–‰ (๊ธฐ๊ณ„ ์Šน์ธ ํ™œ์„ฑํ™”)
agent.run(paper_trading=True)

์•„ํ‚คํ…์ฒ˜

์‚ฌ์šฉ์ž ์„ค๋ช…/์ „๋žต
    |
    v
+-----------------+
|   LLM ์—์ด์ „ํŠธ   |  (์ „๋žต ์ƒ์„ฑ, ํŒฉํ„ฐ ์„ ํƒ)
+-----------------+
    |
    v
+-----------------+
|  ์ „๋žต ์ƒŒ๋“œ๋ฐ•์Šค   |  (๋ฐฑํ…Œ์ŠคํŠธ, ์ง„ํ™”)
+-----------------+
    |
    v
+-----------------+
| ๊ธฐ๊ณ„ ์Šน์ธ ์‹œ์Šคํ…œ |  (์œ„ํ—˜ ๊ด€๋ฆฌ, ๊ทœ์น™ ๊ฒ€์ฆ)
+-----------------+
    |
    v
+-----------------+
|   ๋ธŒ๋กœ์ปค/๊ฑฐ๋ž˜์†Œ  |  (์‹ค์ œ ์ฃผ๋ฌธ ์‹คํ–‰)
+-----------------+

์„ค์ •

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • INALPHA_API_KEY: API ํ‚ค (ํ•„์ˆ˜)
  • INALPHA_MODEL: ์‚ฌ์šฉํ•  LLM ๋ชจ๋ธ (๊ธฐ๋ณธ๊ฐ’: gpt-4)
  • INALPHA_RISK_LIMIT: ์ฃผ๋ฌธ๋‹น ์ตœ๋Œ€ ์œ„ํ—˜ ๊ธˆ์•ก (๊ธฐ๋ณธ๊ฐ’: 1000.0)
  • INALPHA_LOG_LEVEL: ๋กœ๊น… ์ˆ˜์ค€ (๊ธฐ๋ณธ๊ฐ’: INFO)

์˜ˆ์ œ

๋งž์ถคํ˜• ๋ฆฌ์Šคํฌ ๊ทœ์น™ ์ถ”๊ฐ€ํ•˜๊ธฐ

from inalpha import RiskRule

# ์ตœ๋Œ€ ํฌ์ง€์…˜ ํฌ๊ธฐ ๊ทœ์น™
risk_rule = RiskRule(
    name="max_position_size",
    condition="order.amount <= portfolio.value * 0.01",
    action="block"
)
agent.add_risk_rule(risk_rule)

๋ผ์ด์„ ์Šค

MIT License

์ปค๋ฎค๋‹ˆํ‹ฐ


์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ต์œก ๋ฐ ์—ฐ๊ตฌ ๋ชฉ์ ์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํŠธ๋ ˆ์ด๋”ฉ์— ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ์™€ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

๊ด€๋ จ ์Šคํ‚ฌ