Пишем готовый проект на Python: асинхронный сервис отслеживания цены акций

Готовый портфельный проект на Python: асинхронный сервис «Stock Guardian»
Отслеживает цены акций в реальном времени, рассылает push-уведомления при достижении триггеров и предоставляет REST + WebSocket API для фронтенда.


Почему проект ценен для портфолио

  • Показывает владение современным стеком: FastAPI + WebSockets + asyncio, PostgreSQL, Redis, Docker, CI/CD.
  • Демонстрирует продвинутые практики: типы (pydantic, mypy), тесты (pytest, pytest-asyncio), линтеры, GitHub Actions.
  • Подходит для live-демо: легко задеплоить на Render/Fly.io/Hetzner и показать работу в браузере.

Архитектура

┌──────────┐      WebSocket    ┌────────┐
│  Client  │◀──────────────────│ FastAPI│
└──────────┘                  └────┬───┘
          REST /alerts             │
                                    ▼
                         ┌────────────────────┐
                         │ Redis (Pub/Sub)    │
                         └──────┬─────────────┘
                                ▼
                    ┌────────────────────┐
                    │ worker (Celery)    │
                    │  ▸ fetch quotes    │
                    │  ▸ evaluate rules  │
                    └──────┬─────────────┘
                           ▼
                    ┌──────────────┐
                    │ PostgreSQL   │
                    └──────────────┘

Технологический стек

КомпонентПричина выбора
FastAPIвысокопроизводительный ASGI-фреймворк
WebSocketsмгновенные пуши без long-polling
PostgreSQLнадёжное хранилище сигналов и пользователей
Redis Pub/Subбыстрая передача сообщений между worker’ами и API
Celery + Beatфоновый парсинг котировок и планировщик
Docker Composeединое окружение для dev/prod
GitHub Actionsавтоматическое тестирование и линтинг
Pydantic/Mypyстатическая валидация схем и типов

Минимальная реализация

  1. Создай репозиторий и структуру
stock_guardian/
 ├ app/
 │   ├ api/            # FastAPI endpoints
 │   ├ services/       # бизнес-логика
 │   ├ workers/        # Celery tasks
 │   └ core/           # конфигурация, модели
 ├ tests/
 ├ Dockerfile
 ├ docker-compose.yml
 └ pyproject.toml
  1. Модель сигнала
# app/core/models.py
from pydantic import BaseModel, Field
from uuid import UUID, uuid4

class Alert(BaseModel):
    id: UUID = Field(default_factory=uuid4)
    symbol: str
    target_price: float
    direction: str  # "above" | "below"
    user_id: UUID
  1. WebSocket-подписка
# app/api/ws.py
from fastapi import APIRouter, WebSocket, WebSocketDisconnect
from redis.asyncio import PubSub

router = APIRouter()

@router.websocket("/ws/{user_id}")
async def alerts_ws(ws: WebSocket, user_id: str):
    await ws.accept()
    pubsub: PubSub = request.app.state.redis.pubsub()
    await pubsub.subscribe(user_id)
    try:
        async for msg in pubsub.listen():
            if msg["type"] == "message":
                await ws.send_text(msg["data"].decode())
    except WebSocketDisconnect:
        await pubsub.unsubscribe(user_id)
  1. Фоновый воркер
# app/workers/quotes.py
@app.task
def check_alerts():
    quotes = fetch_batch_prices()          # вызов API брокера
    for alert in load_active_alerts():
        price = quotes.get(alert.symbol)
        hit = price >= alert.target_price if alert.direction == "above" else price <= alert.target_price
        if hit:
            redis.publish(alert.user_id, json.dumps({"symbol": alert.symbol, "price": price}))
            deactivate(alert.id)
  1. Тестирование
async def test_create_alert(async_client):
    resp = await async_client.post("/alerts", json={"symbol": "NVDA", "target_price": 1000, "direction": "above"})
    assert resp.status_code == 201
  1. CI Workflow (.github/workflows/ci.yml)
name: CI
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres:16
        env:
          POSTGRES_USER: test
          POSTGRES_PASSWORD: test
          POSTGRES_DB: stock
        ports: [ "5432:5432" ]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: {python-version: "3.12"}
      - run: pip install -r requirements.txt
      - run: pytest -q

Идеи для расширения

  • OAuth 2.0 + JWT, чтобы показать работу с безопасностью.
  • gRPC Gateway для мобильных клиентов.
  • Прометей + Grafana: метрики задержки и нагрузка воркеров.
  • Автоскейлинг worker-ов через Kubernetes HPA.
  • ML-модуль прогнозирования (Prophet/NeuralProphet) для «умных» сигналов.

Как презентовать проект

  1. Live-демо на Fly.io или Render с публичным URL.
  2. Снимок экрана WebSocket-уведомления в README.
  3. Итоговый отчёт Lighthouse (если есть веб-фронт) и диаграмма архитектуры.
  4. Бейджи «build passing» и «coverage > 90 %» в шапке репозитория.
  5. Короткое видео (1-2 мин.) с объяснением кода; приложить к резюме.

Что покажет рекрутеру этот проект

  • Умение собирать распределённый сервис с нуля.
  • Понимание асинхронного Python и очередей сообщений.
  • Навык настройки CI/CD и контейнеризации.
  • Практику тест-драйвен разработки и чистой архитектуры.

Сделай форк, допиши пару фич — и «Stock Guardian» станет сильным аргументом в твоём портфолио.

+1
0
+1
3
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *