Код
Как написать первого торгового бота на Python за 30 минут
# Как написать первого торгового бота на Python за 30 минут
**Уровень:** Абсолютный новичок
**Что понадобится:** Python 3.9+, 30 минут, желание разобраться
---
Алготрейдинг звучит сложно. LLM-агенты, quantitative finance, backtesting frameworks... На самом деле, чтобы написать своего первого торгового бота, нужен Python и четыре библиотеки. Всё остальное — это уже украшения.
В этом туториале мы напишем простого бота с нуля. Шаг за шагом, с объяснением каждой строки.
---
## Что нам понадобится
Установите необходимые библиотеки:
```bash
pip install yfinance pandas matplotlib numpy
```
**Что это за библиотеки?**
- `yfinance` — скачивает реальные биржевые данные (цены акций, объёмы)
- `pandas` — работает с таблицами данных (думайте о нём как Excel, только в коде)
- `matplotlib` — строит графики
- `numpy` — математические операции
---
## Шаг 1: Загружаем биржевые данные
Первое, что нужно любому торговому боту — данные. Без них нечего анализировать.
```python
# Пример для обучения. Не является инвестиционной рекомендацией.
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
# --- Параметры ---
TICKERS = ["SBER.ME", "GAZP.ME"] # Сбербанк и Газпром на MOEX
START = "2024-01-01"
END = "2025-01-01"
# --- Загрузка данных (OHLCV) ---
print("Загружаем данные...")
raw = yf.download(TICKERS, start=START, end=END, auto_adjust=True, progress=False)
# Берём только цены закрытия
close = raw["Close"]
print("\n=== Цены закрытия (первые 5 строк) ===")
print(close.head())
```
**Что здесь происходит?**
`yf.download()` идёт в интернет и скачивает исторические данные. `TICKERS` — это список акций. Суффикс `.ME` означает Московскую биржу. `START` и `END` — период, за который нужны данные.
`raw["Close"]` берёт только цены закрытия — то есть цену в конце каждого торгового дня.
Результат — это `DataFrame` (таблица в pandas): строки — дни, столбцы — тикеры. Всё просто.
---
## Шаг 2: Считаем индикаторы
Теперь научим бота «видеть» тренд. Самый простой инструмент — **скользящая средняя (SMA, Simple Moving Average)**.
SMA за 20 дней — это просто среднее значение цены за последние 20 дней. Она сглаживает случайные колебания и показывает направление тренда.
```python
# Работаем с одной акцией — Сбербанк
df = close[["SBER.ME"]].copy()
df.columns = ["Close"] # переименуем для удобства
# --- Скользящие средние ---
df["SMA_fast"] = df["Close"].rolling(20).mean() # быстрая — 20 дней
df["SMA_slow"] = df["Close"].rolling(50).mean() # медленная — 50 дней
df.dropna(inplace=True) # убираем строки, где нет данных (первые 50 дней)
print(df.tail()) # смотрим последние строки
```
**Что означает `rolling(20).mean()`?**
`rolling(20)` — «смотри на окно из последних 20 значений». `.mean()` — «посчитай среднее». Pandas делает это для каждой строки автоматически. Очень удобно.
---
## Шаг 3: Пишем правила входа и выхода
Теперь самое интересное — логика торговли. Наша стратегия:
- **Покупаем**, когда быстрая SMA (20) поднимается выше медленной SMA (50) — это называется «золотой крест»
- **Продаём**, когда быстрая SMA опускается ниже медленной — «мёртвый крест»
```python
# --- Сигналы ---
# 1 = мы в позиции (держим акцию), 0 = вне рынка
df["Signal"] = (df["SMA_fast"] > df["SMA_slow"]).astype(int)
# diff() показывает изменение: +1 = только что купили, -1 = только что продали
df["Position"] = df["Signal"].diff()
# Точки покупки и продажи
buys = df[df["Position"] == 1] # дни, когда покупаем
sells = df[df["Position"] == -1] # дни, когда продаём
print(f"Количество покупок: {len(buys)}")
print(f"Количество продаж: {len(sells)}")
```
**Ключевая идея:** мы не предсказываем будущее. Мы просто следуем за трендом. Когда тренд вверх — держим позицию. Когда тренд разворачивается — выходим.
---
## Шаг 4: Смотрим результат
Посчитаем, сколько бы заработала наша стратегия на исторических данных.
```python
CAPITAL = 100_000 # стартовый капитал (рублей)
# --- Доходность ---
df["Returns"] = df["Close"].pct_change() # дневная доходность акции
df["Strat_returns"] = df["Returns"] * df["Signal"].shift(1) # доходность стратегии
df["Equity"] = CAPITAL * (1 + df["Strat_returns"]).cumprod() # кривая капитала
# --- Итоговая статистика ---
final_capital = df["Equity"].iloc[-1]
total_return = (final_capital / CAPITAL - 1) * 100
trades = min(len(buys), len(sells))
print("===== РЕЗУЛЬТАТЫ =====")
print(f"Стартовый капитал: {CAPITAL:,.0f} руб.")
print(f"Итоговый капитал: {final_capital:,.0f} руб.")
print(f"Общая доходность: {total_return:.1f}%")
print(f"Количество сделок: {trades}")
print("======================")
```
**Важно:** `pct_change()` считает процентное изменение цены за день. `cumprod()` — накопленное произведение (так считается кривая роста капитала). Умножаем на начальный капитал — получаем рубли.
---
## Шаг 5: Визуализируем (самое красивое)
```python
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)
# График цены со скользящими средними и сигналами
ax1.plot(df["Close"], color="black", lw=1, label="Цена SBER")
ax1.plot(df["SMA_fast"], color="blue", lw=1, label="SMA(20)")
ax1.plot(df["SMA_slow"], color="orange", lw=1, label="SMA(50)")
ax1.scatter(buys.index, buys["Close"], marker="^", color="green",
s=80, zorder=5, label="Покупка")
ax1.scatter(sells.index, sells["Close"], marker="v", color="red",
s=80, zorder=5, label="Продажа")
ax1.set_title("Стратегия SMA(20)/SMA(50) — SBER.ME")
ax1.legend(); ax1.grid(alpha=0.3)
# Кривая капитала
ax2.plot(df["Equity"], color="purple", lw=1.5, label="Капитал стратегии")
ax2.axhline(CAPITAL, ls="--", color="grey", lw=1, label="Стартовый капитал")
ax2.set_title("Кривая капитала")
ax2.legend(); ax2.grid(alpha=0.3)
plt.tight_layout()
plt.savefig("my_first_bot.png", dpi=150)
plt.show()
print("График сохранён: my_first_bot.png")
```
---
## Что дальше?
Поздравляю — вы только что написали своего первого торгового бота. Это не шутка. Базовый алготрейдинговый пайплайн:
1. Загрузить данные ✅
2. Посчитать индикаторы ✅
3. Сформулировать правила ✅
4. Проверить на истории ✅
Следующие шаги:
- Поменяйте параметры `SMA_FAST` и `SMA_SLOW` — посмотрите, как меняется результат
- Попробуйте другие тикеры: `LKOH.ME` (Лукойл), `NVTK.ME` (Новатэк)
- Добавьте стоп-лосс: выходить из позиции, если убыток превысил, скажем, 5%
И самое главное — **протестируй свою стратегию в реальных условиях**.
---
## Проверь стратегию на AreNaGo
Писать код вручную — отличный способ учиться. Но AreNaGo даёт вам инструменты, которые ускоряют этот процесс в разы:
- **Тренировочная Арена** — торгуй своими стратегиями на реальных данных MOEX без риска
- **Генератор торговых стратегий** — создавай и тестируй стратегии с помощью AI
- **AI Copilot** — советник, который поможет оптимизировать параметры
**Попробуй прямо сейчас — это бесплатно:**
👉 [arenago.ru](https://arenago.ru)
---
*Пример для обучения. Прошлая доходность не гарантирует будущую. Не является инвестиционной рекомендацией.*
*AlgoTrading Technologies*
0
16
0
Пока нет комментариев. Будьте первым!