Stock Prices генерирует MP4-видео с анимированными рыночными графиками. Один и тот же pipeline работает из CLI, Python API и Telegram-бота.
Основная русская документация живет на сайте MkDocs: karnaksp.github.io/stock-prices. Исходники документации лежат в docs/index.md.
Локально сайт открывается так:
python -m mkdocs serveПосле запуска откройте http://127.0.0.1:8000.
Разработка ведется в develop, стабильная версия и GitHub Pages публикуются из main. CI запускается для main, develop и pull request в эти ветки.
copy .env.example .env
# Заполните TELEGRAM_BOT_TOKEN в .env
docker compose up -d --build
docker compose psЛоги:
docker compose logs -f stock-prices-botpython -m pip install -e .
python -m stock_prices --tickers "SBER|stock|shares" "LKOH|stock|shares" --start_date 2020-01-01 --end_date 2024-12-31 --currency RUB --duration 20 --fps 20Формат тикера:
TICKER
TICKER|ENGINE|MARKET
Если указан только TICKER, используется рынок по умолчанию: stock|shares.
Telegram-бот делает market-motion videos из Mini App или обычного сообщения: принимает тикеры, категорию или сценарий, ставит задачу в очередь, рендерит MP4 и присылает ролик обратно в чат. Главная ценность - не каталог пресетов, а универсальный конструктор красивых рыночных видео под любые тикеры, периоды и инвестиционные истории. Готовые примеры остаются ориентирами.
Короткие входы:
| Задача | Что отправить |
|---|---|
| Открыть Mini App | /app, затем кнопка Открыть Mini App |
| Открыть меню | /start или /menu |
| Посмотреть справку | /help |
| Посмотреть параметры | /params |
| Снять свой ролик | /shorts SBER LKOH за год |
| Случайный ролик | random mixed 2 |
| Ролик по категории | random metals 1 |
| Собрать план | plan drama 5 days 2 tickers |
| Поставить серию shorts в очередь | plan shorts metals count=1 days=5 |
| Смотреть очередь | /queue |
Обычный текстовый запрос тоже работает:
LKOH
SBER LKOH 2020 2024
gold silver palladium 2018-2026 RUB capital invest initial=0 monthly=30000 gradient
Подробный синтаксис: docs/telegram.md.
Исторические данные не сохраняются в parquet: pipeline скачивает их для конкретного запроса и передает дальше в памяти. Для Docker-бота production-значение STOCK_PRICES_RETENTION_DAYS=0: MP4 удаляется сразу после успешной отправки и не копится на диске.
flowchart LR
CLI["CLI / Python API"] --> Request["VideoRequest"]
Telegram["Telegram bot / Mini App"] --> Request
Request --> MarketData["MOEX / Yahoo market data"]
MarketData --> Transform["Normalize prices, currency and dates"]
Transform --> Render["Matplotlib animation renderer"]
Render --> Artifact["MP4 / GIF preview"]
Artifact --> Delivery["Local file or Telegram delivery"]
Код использует один и тот же request/render pipeline для CLI, Python API и Telegram. Это снижает расхождения между локальной проверкой, Docker-ботом и пользовательским сценарием: меняется только вход и доставка результата.
Чтобы расширить random-подборки всеми доступными MOEX-акциями, соберите metadata-файл и укажите его в .env:
python scripts/collect_moex_universe.py --output config/moex_universe.jsonSTOCK_PRICES_UNIVERSE_FILE=config/moex_universe.jsonФайл содержит только тикеры, даты истории и классификации, без ценовых рядов.
from datetime import date
from stock_prices import RenderSettings, TickerSpec, VideoRequest, generate_video
path = generate_video(
VideoRequest(
ticker_specs=[TickerSpec("LKOH")],
render=RenderSettings(
start_date=date(2015, 1, 1),
end_date=date(2026, 5, 26),
duration=20,
fps=20,
),
)
)
print(path)$env:PYTHONPATH = "src"
python -m pytest -q
python -m mkdocs build --strict
python -m compileall -q src tests scripts