Skip to content

bourbonkk/TradeMonster

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

13 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Trend Following MCP Server

์ถ”์„ธ์ถ”์ข… ํˆฌ์ž ๋ฐฉ๋ฒ•๋ก ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ MCP(Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ์ฃผ์‹ ์‹œ์žฅ ๋ถ„์„, ๋งค๋งค ์‹œ์  ํŒ๋‹จ, ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ข…ํ•ฉ์ ์ธ ํˆฌ์ž ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐ŸŒŸ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

Trend Following MCP Server๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ๐Ÿ“ˆ ์ฃผ์‹ ์ •๋ณด ์ˆ˜์ง‘: ์‹ค์‹œ๊ฐ„ ์ฃผ๊ฐ€, ์žฌ๋ฌด์ œํ‘œ, ๋‰ด์Šค ๋ฐ์ดํ„ฐ
  • ๐Ÿ“Š ๊ธฐ์ˆ ์  ๋ถ„์„: ์ด๋™ํ‰๊ท , RSI, MACD, ๋ณผ๋ฆฐ์ € ๋ฐด๋“œ ๋“ฑ
  • ๐ŸŽฏ ๋งค๋งค ์‹œ์  ์‹ ํ˜ธ: ์ถ”์„ธ ์ถ”์ข… ์ „๋žต ๊ธฐ๋ฐ˜ ๋งค์ˆ˜/๋งค๋„ ์‹œ์  ํŒ๋‹จ
  • ๐Ÿ“‹ ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ: ์ž์‚ฐ ๋ฐฐ๋ถ„, ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ, ์„ฑ๊ณผ ์ถ”์ 
  • ๐Ÿค– AI ๊ธฐ๋ฐ˜ ๋ถ„์„: ๋จธ์‹ ๋Ÿฌ๋‹์„ ํ™œ์šฉํ•œ ์‹œ์žฅ ์˜ˆ์ธก ๋ฐ ์ตœ์ ํ™”

๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ์ฃผ์‹ ์ •๋ณด ๋„๊ตฌ (Stock Information Tools)

  • get_stock_info: ์‹ค์‹œ๊ฐ„ ์ฃผ๊ฐ€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๊ธฐ์—… ์ •๋ณด ์กฐํšŒ
  • screen_stocks: ๊ธฐ์ˆ ์ /๊ธฐ๋ณธ์  ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์ฃผ์‹ ์Šคํฌ๋ฆฌ๋‹
  • ๊ธฐ์—… ์žฌ๋ฌด์ œํ‘œ ๋ถ„์„ (์†์ต๊ณ„์‚ฐ์„œ, ์žฌ๋ฌด์ƒํƒœํ‘œ, ํ˜„๊ธˆํ๋ฆ„ํ‘œ)
  • ๋‰ด์Šค ๋ฐ ์ด๋ฒคํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์„นํ„ฐ๋ณ„ ์‹œ์žฅ ๋™ํ–ฅ ๋ถ„์„

2. ๊ธฐ์ˆ ์  ๋ถ„์„ ๋„๊ตฌ (Technical Analysis Tools)

  • analyze_technical: ์ข…ํ•ฉ์ ์ธ ๊ธฐ์ˆ ์  ๋ถ„์„ ์ˆ˜ํ–‰
  • ์ด๋™ํ‰๊ท ์„  ๋ถ„์„ (20์ผ, 50์ผ, 200์ผ SMA/EMA)
  • ๋ชจ๋ฉ˜ํ…€ ์ง€ํ‘œ (RSI, MACD, ์Šคํ† ์บ์Šคํ‹ฑ)
  • ๋ณ€๋™์„ฑ ์ง€ํ‘œ (๋ณผ๋ฆฐ์ € ๋ฐด๋“œ, ATR)
  • ๊ฑฐ๋ž˜๋Ÿ‰ ๋ถ„์„ (OBV, ๊ฑฐ๋ž˜๋Ÿ‰ ๊ฐ€์ค‘ ํ‰๊ท )
  • ์ถ”์„ธ ๋ฐฉํ–ฅ ๋ฐ ๊ฐ•๋„ ๋ถ„์„

3. ๋งค๋งค ์‹ ํ˜ธ ๋„๊ตฌ (Trading Signal Tools)

  • generate_signal: ์ถ”์„ธ ์ถ”์ข… ๋งค๋งค ์‹œ์  ํŒ๋‹จ
  • backtest_signals: ์ „๋žต ๋ฐฑํ…Œ์ŠคํŒ… ๋ฐ ์„ฑ๊ณผ ๋ถ„์„
  • ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ ๋ฐ ์†์ ˆ๋งค ์„ค์ •
  • ํฌ์ง€์…˜ ์‚ฌ์ด์ง• ์ตœ์ ํ™”
  • ์‹ ํ˜ธ ์‹ ๋ขฐ๋„ ๋ฐ ๊ฐ•๋„ ๊ณ„์‚ฐ

4. ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ ๋„๊ตฌ (Portfolio Management Tools)

  • manage_portfolio: ํฌํŠธํด๋ฆฌ์˜ค ๋ถ„์„, ์ตœ์ ํ™”, ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ
  • analyze_risk: ํฌํŠธํด๋ฆฌ์˜ค ๋ฆฌ์Šคํฌ ๋ถ„์„ (VaR, CVaR)
  • ์ž์‚ฐ ๋ฐฐ๋ถ„ ์ตœ์ ํ™”
  • ๋ฆฌ์Šคํฌ ๋Œ€๋น„ ์ˆ˜์ต๋ฅ  ๋ถ„์„
  • ์„ฑ๊ณผ ์ถ”์  ๋ฐ ๋ฆฌํฌํŒ…

๐Ÿ—๏ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

TradeMonster/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ mcp/                    # MCP ์„œ๋ฒ„ ํ•ต์‹ฌ
โ”‚   โ”‚   โ”œโ”€โ”€ server.py          # MCP ์„œ๋ฒ„ ๋ฉ”์ธ
โ”‚   โ”‚   โ”œโ”€โ”€ schemas.py         # ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ (Pydantic ๋ชจ๋ธ)
โ”‚   โ”‚   โ””โ”€โ”€ tools/             # MCP ๋„๊ตฌ๋“ค
โ”‚   โ”‚       โ”œโ”€โ”€ stock_info.py  # ์ฃผ์‹ ์ •๋ณด ๋„๊ตฌ
โ”‚   โ”‚       โ”œโ”€โ”€ technical.py   # ๊ธฐ์ˆ ์  ๋ถ„์„ ๋„๊ตฌ
โ”‚   โ”‚       โ”œโ”€โ”€ signals.py     # ๋งค๋งค ์‹ ํ˜ธ ๋„๊ตฌ
โ”‚   โ”‚       โ””โ”€โ”€ portfolio.py   # ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ ๋„๊ตฌ
โ”‚   โ”œโ”€โ”€ analysis/              # ๋ถ„์„ ์—”์ง„
โ”‚   โ”‚   โ”œโ”€โ”€ trend_analysis.py  # ์ถ”์„ธ ๋ถ„์„ ์—”์ง„
โ”‚   โ”‚   โ”œโ”€โ”€ momentum.py        # ๋ชจ๋ฉ˜ํ…€ ๋ถ„์„ (๊ตฌํ˜„ ์˜ˆ์ •)
โ”‚   โ”‚   โ””โ”€โ”€ volatility.py      # ๋ณ€๋™์„ฑ ๋ถ„์„ (๊ตฌํ˜„ ์˜ˆ์ •)
โ”‚   โ”œโ”€โ”€ utils/                 # ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚   โ”‚   โ”œโ”€โ”€ config.py          # ์„ค์ • ๊ด€๋ฆฌ (Pydantic ๊ธฐ๋ฐ˜)
โ”‚   โ”‚   โ””โ”€โ”€ logger.py          # ๋กœ๊น… ์‹œ์Šคํ…œ
โ”‚   โ””โ”€โ”€ main.py                # ๋ฉ”์ธ ์‹คํ–‰ ํŒŒ์ผ
โ”œโ”€โ”€ tests/                     # ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“ค
โ”‚   โ””โ”€โ”€ test_mcp_server.py     # MCP ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ
โ”œโ”€โ”€ pyproject.toml             # ํ”„๋กœ์ ํŠธ ์„ค์ • (์—…๋ฐ์ดํŠธ๋จ)
โ”œโ”€โ”€ README.md                  # ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ
โ”œโ”€โ”€ env.example                # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ
โ””โ”€โ”€ LICENSE                    # MIT ๋ผ์ด์„ ์Šค

๐Ÿ“Š ์ถ”์„ธ์ถ”์ข… ์ „๋žต

ํ•ต์‹ฌ ์›์น™

  1. ์ถ”์„ธ ํ™•์ธ: ์žฅ๊ธฐ ์ด๋™ํ‰๊ท ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์Šน/ํ•˜๋ฝ ์ถ”์„ธ ํŒ๋‹จ
  2. ๋ชจ๋ฉ˜ํ…€ ํ™œ์šฉ: RSI, MACD ๋“ฑ ๋ชจ๋ฉ˜ํ…€ ์ง€ํ‘œ๋กœ ๊ฐ•๋„ ์ธก์ •
  3. ๋ณ€๋™์„ฑ ๊ด€๋ฆฌ: ๋ณผ๋ฆฐ์ € ๋ฐด๋“œ, ATR๋กœ ๋ณ€๋™์„ฑ ๊ธฐ๋ฐ˜ ์ง„์ž…/์ฒญ์‚ฐ
  4. ๋ฆฌ์Šคํฌ ์ œ์–ด: ์†์ ˆ๋งค, ์ต์ ˆ๋งค, ํฌ์ง€์…˜ ์‚ฌ์ด์ง•์œผ๋กœ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ

๋งค๋งค ์‹œ์  ํŒ๋‹จ

  • ๋งค์ˆ˜ ์กฐ๊ฑด: ์ƒ์Šน ์ถ”์„ธ + ๋ชจ๋ฉ˜ํ…€ ์ƒ์Šน + ๋ณ€๋™์„ฑ ํ™•๋Œ€
  • ๋งค๋„ ์กฐ๊ฑด: ํ•˜๋ฝ ์ถ”์„ธ + ๋ชจ๋ฉ˜ํ…€ ํ•˜๋ฝ + ์ง€์ง€์„  ์ดํƒˆ
  • ํ™€๋”ฉ ์กฐ๊ฑด: ์ถ”์„ธ ์ง€์† + ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ ๋ฒ”์œ„ ๋‚ด

๊ตฌํ˜„๋œ ์‹ ํ˜ธ ๋กœ์ง

# ๊ฐ•๋ ฅํ•œ ๋งค์ˆ˜ ์‹ ํ˜ธ
if (trend_direction == "up" and 
    current_price > sma_20 > sma_50 > sma_200 and
    rsi < 70 and  # ๊ณผ๋งค์ˆ˜ ์•„๋‹˜
    macd > macd_signal and
    price_position < 0.8):  # ๋ณผ๋ฆฐ์ € ์ƒ๋‹จ ๋ฐด๋“œ ์ดํ•˜
    signal_type = "strong_buy"

๐Ÿ› ๏ธ ์„ค์น˜ ๋ฐ ์‹คํ–‰

1. ํ™˜๊ฒฝ ์„ค์ •

# ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/yourusername/TradeMonster.git
cd TradeMonster

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# ์˜์กด์„ฑ ์„ค์น˜
pip install -e .

2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

# .env ํŒŒ์ผ ์ƒ์„ฑ
cp env.example .env

# API ํ‚ค ์„ค์ • (์„ ํƒ์‚ฌํ•ญ - yfinance๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ API ํ‚ค๊ฐ€ ํ•„์š” ์—†์Œ)
YAHOO_FINANCE_API_KEY=your_api_key
ALPHA_VANTAGE_API_KEY=your_alpha_vantage_api_key

3. MCP ์„œ๋ฒ„ ์‹คํ–‰

# ๋ฉ”์ธ ์‹คํ–‰ ํŒŒ์ผ๋กœ ์‹คํ–‰
python src/main.py

# ๋˜๋Š” ์ง์ ‘ MCP ์„œ๋ฒ„ ์‹คํ–‰
python -m src.mcp.server --dev

# ๋˜๋Š” ๊ฐœ๋ฐœ ๋ชจ๋“œ
python -m src.mcp.server --dev --stdio

4. ํ…Œ์ŠคํŠธ ์‹คํ–‰

# ์ „์ฒด ํ…Œ์ŠคํŠธ ์‹คํ–‰
pytest tests/

# ํŠน์ • ํ…Œ์ŠคํŠธ ์‹คํ–‰
pytest tests/test_mcp_server.py -v

๐Ÿ“ˆ ์‚ฌ์šฉ ์˜ˆ์‹œ

1. ์ฃผ์‹ ์ •๋ณด ์กฐํšŒ

# Apple ์ฃผ์‹ ์ •๋ณด ์กฐํšŒ
stock_info = await session.call_tool("get_stock_info", {
    "symbol": "AAPL",
    "include_financials": True,
    "include_news": True
})

2. ๊ธฐ์ˆ ์  ๋ถ„์„

# ๊ธฐ์ˆ ์  ์ง€ํ‘œ ๋ถ„์„
analysis = await session.call_tool("analyze_technical", {
    "symbol": "AAPL",
    "period": "1y",
    "indicators": ["sma", "rsi", "macd", "bollinger"]
})

3. ๋งค๋งค ์‹ ํ˜ธ ์ƒ์„ฑ

# ์ถ”์„ธ์ถ”์ข… ๋งค๋งค ์‹ ํ˜ธ
signal = await session.call_tool("generate_signal", {
    "symbol": "AAPL",
    "strategy": "trend_following",
    "risk_level": "moderate"
})

4. ํฌํŠธํด๋ฆฌ์˜ค ๋ถ„์„

# ํฌํŠธํด๋ฆฌ์˜ค ๋ถ„์„
portfolio = await session.call_tool("manage_portfolio", {
    "action": "analyze",
    "portfolio": [
        {"symbol": "AAPL", "shares": 100, "cost_basis": 150.0},
        {"symbol": "GOOGL", "shares": 50, "cost_basis": 2800.0}
    ]
})

5. ๋ฆฌ์Šคํฌ ๋ถ„์„

# ํฌํŠธํด๋ฆฌ์˜ค ๋ฆฌ์Šคํฌ ๋ถ„์„
risk_analysis = await session.call_tool("analyze_risk", {
    "portfolio": portfolio_data,
    "confidence_level": 0.95
})

๐Ÿ”ง ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ

์ƒˆ๋กœ์šด ๋„๊ตฌ ์ถ”๊ฐ€

# src/mcp/tools/new_tool.py
from mcp import Tool
from typing import Dict, Any

class NewTool(Tool):
    name = "new_tool"
    description = "์ƒˆ๋กœ์šด ๋„๊ตฌ ์„ค๋ช…"
    
    async def execute(self, params: Dict[str, Any]) -> Dict[str, Any]:
        # ๋„๊ตฌ ๋กœ์ง ๊ตฌํ˜„
        return {"result": "success"}

์„ค์ • ๊ด€๋ฆฌ

# src/utils/config.py์—์„œ ์„ค์ • ์ถ”๊ฐ€
class Config(BaseSettings):
    new_setting: str = Field(default="default_value", description="์ƒˆ๋กœ์šด ์„ค์ •")

๋กœ๊น… ์‚ฌ์šฉ

from src.utils.logger import get_logger

logger = get_logger(__name__)
logger.info("์ •๋ณด ๋ฉ”์‹œ์ง€")
logger.error("์—๋Ÿฌ ๋ฉ”์‹œ์ง€")

๐Ÿ“Š ์„ฑ๊ณผ ์ง€ํ‘œ

  • ์Šน๋ฅ : 65% ์ด์ƒ ๋ชฉํ‘œ
  • ์ƒคํ”„ ๋น„์œจ: 1.5 ์ด์ƒ ๋ชฉํ‘œ
  • ์ตœ๋Œ€ ๋‚™ํญ: 15% ์ดํ•˜ ๋ชฉํ‘œ
  • ์—ฐ๊ฐ„ ์ˆ˜์ต๋ฅ : 20% ์ด์ƒ ๋ชฉํ‘œ

๐Ÿ›ก๏ธ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ

๊ตฌํ˜„๋œ ๋ฆฌ์Šคํฌ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

  • ATR ๊ธฐ๋ฐ˜ ์†์ ˆ๋งค: ๋ณ€๋™์„ฑ์— ๋”ฐ๋ฅธ ๋™์  ์†์ ˆ๋งค ์„ค์ •
  • ํฌ์ง€์…˜ ์‚ฌ์ด์ง•: ์‹ ๋ขฐ๋„์™€ ๋ฆฌ์Šคํฌ ์ˆ˜์ค€์— ๋”ฐ๋ฅธ ํฌ์ง€์…˜ ํฌ๊ธฐ ์กฐ์ ˆ
  • ํฌํŠธํด๋ฆฌ์˜ค ๋‹ค๊ฐํ™”: ์ž์‚ฐ ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ณ ๋ คํ•œ ๋ฐฐ๋ถ„
  • VaR/CVaR ๋ถ„์„: ํฌํŠธํด๋ฆฌ์˜ค ๋ฆฌ์Šคํฌ ์ธก์ •

๋ฆฌ์Šคํฌ ์ˆ˜์ค€๋ณ„ ์„ค์ •

# ๋ณด์ˆ˜์  (Conservative)
stop_loss_multiplier = 2.0
position_size = 0.05  # 5%

# ์ค‘๊ฐ„ (Moderate) - ๊ธฐ๋ณธ๊ฐ’
stop_loss_multiplier = 1.5
position_size = 0.1   # 10%

# ๊ณต๊ฒฉ์  (Aggressive)
stop_loss_multiplier = 1.0
position_size = 0.15  # 15%

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋ผ์ธ

  • Python 3.13+ ์‚ฌ์šฉ
  • Type hints ํ•„์ˆ˜
  • Pydantic ๋ชจ๋ธ ์‚ฌ์šฉ
  • Async/await ํŒจํ„ด ์‚ฌ์šฉ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.


โš ๏ธ ๋ฉด์ฑ… ์กฐํ•ญ

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

์ค‘์š”: ์ด ๋„๊ตฌ๋Š” ํˆฌ์ž ์กฐ์–ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋“  ํˆฌ์ž ๊ฒฐ์ •์€ ๋ณธ์ธ์˜ ํŒ๋‹จ์— ๋”ฐ๋ผ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ž ๋ฌธ์˜

ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ฌธ์˜์‚ฌํ•ญ์ด๋‚˜ ์ œ์•ˆ์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋ฉด ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”.

ํ•จ๊ป˜ ๋” ๋‚˜์€ ํˆฌ์ž ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€์š”! ๐Ÿš€

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Languages