Morning์ AI ๊ธฐ์ ์ ํ์ฉํ ์ง๋ฅํ ์ฃผ์ ๋ถ์ ๋ฐ ์๋ ํธ๋ ์ด๋ฉ ์์คํ ์ ๋๋ค. ์ค์๊ฐ ์์ฅ ๋ฐ์ดํฐ ๋ถ์, AI ๊ธฐ๋ฐ ํฌ์ ์๊ฒฌ ์์ฑ, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ํธ๋ ์ด๋ฉ ์ ๋ต์ ์ ๊ณตํฉ๋๋ค.
์ด ํ๋ก์ ํธ๋ ๋ฐ๋์ ๊ฐ์ํ๊ฒฝ(venv)์์ ์คํํด์ผ ํฉ๋๋ค. ์์คํ Python์ ์ง์ ์ฌ์ฉํ๋ฉด ์์กด์ฑ ์ถฉ๋์ด๋ ๊ถํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ์ฃผ์ ๋ถ์: OpenAI๋ฅผ ํ์ฉํ ์ง๋ฅํ ์ฃผ์ ๋ฆฌํฌํธ ์์ฑ
- ํฌ์ ์๊ฒฌ ์์ฑ: Buy/Sell/Hold ์ถ์ฒ ๋ฐ ๋ชฉํ๊ฐ ์ค์
- ๋ด์ค ๊ฐ์ ๋ถ์: ๊ด๋ จ ๋ด์ค ๊ธฐ๋ฐ ์์ฅ ์ฌ๋ฆฌ ๋ถ์
- ๋ชจ๋ํ๋ ์ ๋ต: ๋ชจ๋ฉํ , Mean Reversion, Breakout ์ ๋ต
- ๋ฐฑํ ์คํ : ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ ๋ต ์ฑ๋ฅ ๊ฒ์ฆ
- ๋ฆฌ์คํฌ ๊ด๋ฆฌ: ํฌ์ง์ ์ ํ, ์์ /์ต์ ๊ท์น
- KIS API: ํ๊ตญํฌ์์ฆ๊ถ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฐ๋
- Slack Bot: ํฌํธํด๋ฆฌ์ค ์ํ ์ค์๊ฐ ์๋ฆผ
- ์น ๋์๋ณด๋: Streamlit ๊ธฐ๋ฐ ์๊ฐํ
# ์ ์ฅ์ ํด๋ก
git clone https://github.com/your-username/morning.git
cd morning
# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ (ํ์!)
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# ์์กด์ฑ ์ค์น
pip install -r requirements.txt
pip install -r requirements-dev.txt # ๊ฐ๋ฐ ๋๊ตฌ ์ค์น.env ํ์ผ์ ์์ฑํ๊ณ ๋ค์ ๋ด์ฉ์ ์ถ๊ฐํ์ธ์:
# OpenAI API
OPENAI_API_KEY=your_openai_api_key
# KIS API
KIS_APP_KEY=your_kis_app_key
KIS_APP_SECRET=your_kis_app_secret
KIS_ACCESS_TOKEN=your_kis_access_token
# Slack Bot
SLACK_BOT_TOKEN=xoxb-your-slack-bot-token
SLACK_APP_TOKEN=xapp-your-slack-app-token
SLACK_SIGNING_SECRET=your-slack-signing-secret# ๊ฐ์ํ๊ฒฝ์ด ํ์ฑํ๋์ด ์๋์ง ํ์ธ
which python # venv/bin/python์ด ์ถ๋ ฅ๋์ด์ผ ํจ
# ๋์๋ณด๋ ์คํ
streamlit run dashboard.py
# Slack Bot ์คํ
python slack_bot.py
# ์ ๋ต ์์ง ํ
์คํธ
python test/strategy/test_strategy_engine.pymorning/
โโโ agent/ # AI ์์ด์ ํธ
โ โโโ analytics.py # ์ฃผ์ ๋ถ์ ๋ก์ง
โ โโโ tools.py # ๋ถ์ ๋๊ตฌ
โ โโโ prompts/ # AI ํ๋กฌํํธ
โโโ api/ # API ํด๋ผ์ด์ธํธ
โ โโโ api_client.py # ๊ณตํต API ํด๋ผ์ด์ธํธ
โ โโโ ki/ # KIS API
โ โโโ trader.py # ํธ๋ ์ด๋ฉ API
โโโ strategy/ # ์ ๋ต ์์ง
โ โโโ engines/ # ์ ๋ต ์คํ ์์ง
โ โโโ strategies/ # ํธ๋ ์ด๋ฉ ์ ๋ต
โ โโโ backtest/ # ๋ฐฑํ
์คํ
โ โโโ risk_management/ # ๋ฆฌ์คํฌ ๊ด๋ฆฌ
โโโ core/ # ํต์ฌ ์์คํ
โ โโโ dependency_injection.py # ์์กด์ฑ ์ฃผ์
โ โโโ error_handling.py # ์๋ฌ ์ฒ๋ฆฌ
โ โโโ performance_monitoring.py # ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
โโโ test/ # ํ
์คํธ
โ โโโ unit/ # ๋จ์ ํ
์คํธ
โ โโโ integration/ # ํตํฉ ํ
์คํธ
โ โโโ conftest.py # ํ
์คํธ ์ค์
โโโ scripts/ # ์ ํธ๋ฆฌํฐ ์คํฌ๋ฆฝํธ
โโโ ui/ # ์ฌ์ฉ์ ์ธํฐํ์ด์ค
โโโ config/ # ์ค์ ํ์ผ
# ๊ฐ์ํ๊ฒฝ ํ์ฑํ ํ์ธ
source venv/bin/activate
# ์ ์ฒด ํ
์คํธ ์คํ
pytest
# ๋จ์ ํ
์คํธ๋ง ์คํ
pytest test/unit/
# ํตํฉ ํ
์คํธ๋ง ์คํ
pytest test/integration/
# ์ปค๋ฒ๋ฆฌ์ง ํ์ธ
pytest --cov=. --cov-report=html- ๋จ์ ํ ์คํธ: ๊ฐ๋ณ ํจ์/ํด๋์ค ํ ์คํธ
- ํตํฉ ํ ์คํธ: ๋ชจ๋ ๊ฐ ์ํธ์์ฉ ํ ์คํธ
- ์ฑ๋ฅ ํ ์คํธ: ์ฑ๋ฅ ์งํ ์ธก์
- E2E ํ ์คํธ: ์ ์ฒด ์ํฌํ๋ก์ฐ ํ ์คํธ
์ด ํ๋ก์ ํธ๋ ์๊ฒฉํ ์ฝ๋ฉ ๋ฃฐ์ ๋ฐ๋ฆ ๋๋ค. ์์ธํ ๋ด์ฉ์ CODING_RULES.md๋ฅผ ์ฐธ์กฐํ์ธ์.
- ์์กด์ฑ ์ฃผ์ : ๋ชจ๋ ์ธ๋ถ ์์กด์ฑ์ DI ์ปจํ ์ด๋๋ก ๊ด๋ฆฌ
- ํ์ ํํธ: ๋ชจ๋ ํจ์์ ํ์ ํํธ ํ์
- ์๋ฌ ์ฒ๋ฆฌ: ์ปค์คํ ์์ธ์ ์ผ๊ด๋ ์๋ฌ ํธ๋ค๋ง
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง: ์ต์ 80% ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ์ ์ง
- ๋ฌธ์ํ: ๋ชจ๋ ๊ณต๊ฐ API์ docstring ํ์
# ๊ฐ์ํ๊ฒฝ ํ์ฑํ (๋งค๋ฒ ํ์ธ!)
source venv/bin/activate
# ๋ธ๋์น ์์ฑ
git checkout -b feature/new-feature
# ์ฝ๋ ์์ฑ ํ ์คํ
์ด์ง
git add .
# ๊ฒ์ฆ์ ํฌํจํ commit
./scripts/commit_with_validation.sh "feat(api): ์๋ก์ด API ์ถ๊ฐ"Commit ์ ์๋์ผ๋ก ๋ค์ ๊ฒ์ฆ์ด ์คํ๋ฉ๋๋ค:
- โ ์ฝ๋ ํฌ๋งทํ (black, isort)
- โ ํ์ ํํธ ๊ฒ์ฌ (mypy)
- โ ๋ณด์ ๊ฒ์ฌ (API ํค ๋ ธ์ถ ๋ฑ)
- โ ํ ์คํธ ์คํ (pytest)
- โ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ํ์ธ (80% ์ด์)
- โ ๋ฌธ์ํ ๊ฒ์ฌ
# ๋ธ๋์น ํธ์
git push origin feature/new-feature
# GitHub์์ Pull Request ์์ฑ
# ๋ฆฌ๋ทฐ์ด ์น์ธ ํ main ๋ธ๋์น๋ก ๋จธ์ง- Python 3.8+
- Black: ์ฝ๋ ํฌ๋งทํฐ
- isort: import ์์ ์ ๋ ฌ
- mypy: ํ์ ์ฒด์ปค
- pytest: ํ ์คํธ ํ๋ ์์ํฌ
- pre-commit: Git hook
# ๊ฐ์ํ๊ฒฝ ํ์ฑํ (ํ์!)
source venv/bin/activate
# ๊ฐ๋ฐ ๋๊ตฌ ์ค์น
pip install -r requirements-dev.txt
# pre-commit hook ์ค์
pre-commit install
# ์ฝ๋ ํฌ๋งทํ
black .
isort .
# ํ์
์ฒดํฌ
mypy .
# ํ
์คํธ ์คํ
pytest- API ์๋ต ์๊ฐ: 1์ด ์ด๋ด
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ํ๋ก์ธ์ค๋น 512MB ์ด๋ด
- CPU ์ฌ์ฉ๋ฅ : ํ๊ท 70% ์ดํ
- ํ ์คํธ ์คํ ์๊ฐ: 5๋ถ ์ด๋ด
from core.performance_monitoring import monitor_performance
@monitor_performance("api_call")
def get_stock_data(stock_code: str):
# API ํธ์ถ ๋ก์ง
pass- ๋ฏผ๊ฐ ์ ๋ณด: ๋ชจ๋ API ํค๋ ํ๊ฒฝ๋ณ์๋ก ๊ด๋ฆฌ
- ์ ๋ ฅ ๊ฒ์ฆ: ๋ชจ๋ ์ธ๋ถ ์ ๋ ฅ์ ๋ํ ๊ฒ์ฆ ์ํ
- SQL Injection ๋ฐฉ์ง: ํ๋ผ๋ฏธํฐํ๋ ์ฟผ๋ฆฌ ์ฌ์ฉ
- ์ ๊ทผ ์ ์ด: ์ ์ ํ ๊ถํ ์ค์
# ๊ฐ์ํ๊ฒฝ ํ์ฑํ ํ์ธ
source venv/bin/activate
# ๋ณด์ ์ทจ์ฝ์ ๊ฒ์ฌ
./scripts/pre_commit_check.py- ์ด์ ์์ฑ: ๋ฒ๊ทธ ๋ฆฌํฌํธ ๋๋ ๊ธฐ๋ฅ ์์ฒญ
- ๋ธ๋์น ์์ฑ:
feature/๊ธฐ๋ฅ๋ช๋๋fix/๋ฒ๊ทธ๋ช - ์ฝ๋ ์์ฑ: ์ฝ๋ฉ ๋ฃฐ ์ค์
- ํ ์คํธ ์์ฑ: ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ํ ์คํธ ์ถ๊ฐ
- Pull Request: ์์ธํ ์ค๋ช ๊ณผ ํจ๊ป PR ์์ฑ
- ์ฝ๋ฉ ๋ฃฐ ์ค์
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ์ถฉ์กฑ
- ์ฑ๋ฅ ์ํฅ ๊ฒํ
- ๋ณด์ ์ทจ์ฝ์ ํ์ธ
- ๋ฌธ์ํ ์๋ฃ
- ์ค์๊ฐ ์๋ฆผ ์์คํ
- ๊ณ ๊ธ ์ฐจํธ ๋ถ์
- ํฌํธํด๋ฆฌ์ค ์ต์ ํ
- ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํตํฉ
- ๋ค์ค ๊ฑฐ๋์ ์ง์
- ๋ชจ๋ฐ์ผ ์ฑ
- ์ด์ ๋ฆฌํฌํธ: GitHub Issues
- ๋ฌธ์: Wiki
- ์ด๋ฉ์ผ: team@morning.com
- Discord: Morning Community
- Slack: Morning Workspace
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
- OpenAI: GPT ๋ชจ๋ธ ์ ๊ณต
- KIS: ํ๊ตญํฌ์์ฆ๊ถ API ์ ๊ณต
- Streamlit: ์น ๋์๋ณด๋ ํ๋ ์์ํฌ
- ์ปค๋ฎค๋ํฐ: ๋ชจ๋ ๊ธฐ์ฌ์๋ค
# ํ๋ก์ ํธ ์์ ์
cd morning
source venv/bin/activate
# ์์
์๋ฃ ํ
deactivate# ๊ฐ์ํ๊ฒฝ ์ฌ์์ฑ (๋ฌธ์ ๋ฐ์ ์)
rm -rf venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install -r requirements-dev.txt# .bashrc ๋๋ .zshrc์ ์ถ๊ฐ
alias morning='cd /path/to/morning && source venv/bin/activate'๐ง ์ค์: ํญ์ ๊ฐ์ํ๊ฒฝ์ ์ฌ์ฉํ์ธ์. ์์คํ Python์ ์ง์ ์ฌ์ฉํ๋ฉด ์์กด์ฑ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.