Python-снасти 10.10.2026 · 3 мин чтения · 👁 7 просмотров

Бэктест стратегии на pandas: шаг за шагом

Бэктест стратегии на pandas: шаг за шагом

🎣 Приветствую, друзья!

Я снова тут, Тихий Водяной из «Тихой Заводь». Сегодня поговорим про то, как можно протестировать свою торговую стратегию при помощи pandas. Мы разберём конкретный пример и посмотрим, насколько эффективно сработает наша стратегия на исторических данных.

📊 Что такое бэктест?

Бэктест (backtest) – это проверка торговой стратегии на исторических данных. Это важный этап перед запуском реальной торговли, чтобы понять её эффективность и возможные риски.

🐟 Подготовка данных

Для начала нам понадобятся исторические котировки акций или валютных пар. Я возьму набор данных по акциям Apple Inc. за последние пять лет. Скачиваем их с сайта Yahoo Finance и загружаем в pandas DataFrame:

import yfinance as yf
import pandas as pd

ticker = 'AAPL'
data = yf.download(ticker, start='2017-01-01', end='2022-12-31')

После загрузки у нас есть датафрейм data, содержащий такие столбцы, как цена открытия, закрытия, максимумы, минимумы и т.д.

🔮 Стратегия скользящего среднего

Одна из самых простых стратегий – покупка актива, когда его цена пересекает скользящее среднее вверх, и продажа, если цена опускается ниже скользящего среднего. Нам понадобится вычислить простое скользящее среднее (SMA) с периодом 50 дней:

sma_50 = data['Close'].rolling(window=50).mean()
data['SMA_50'] = sma_50

Теперь мы можем создать сигнал покупки, когда цена закрывается выше SMA_50, и сигнала продажи, когда цена падает ниже SMA_50:

data['Buy_Signal'] = np.where(data['Close'] > data['SMA_50'], 1, 0)
data['Sell_Signal'] = np.where(data['Close'] < data['SMA_50'], -1, 0)

📈 Графики и визуализация

Посмотрим на поведение цены и сигналов покупки/продажи:

plt.figure(figsize=(14,8))
plt.plot(data['Close'], label='Price')
plt.plot(sma_50, label='SMA 50')
plt.scatter(data.index, data['Buy_Signal'], color='green', marker='^', s=100, label='Buy Signal')
plt.scatter(data.index, data['Sell_Signal'], color='red', marker='v', s=100, label='Sell Signal')
plt.legend()
plt.show()

На графике видно, что сигналы покупки и продажи довольно чёткие и легко распознаваемые.

🛠️ Расчёт доходности

Теперь давайте посчитаем общую доходность нашей стратегии. Для этого создадим функцию, которая будет отслеживать позиции и прибыль:

def calculate_strategy_performance(df):
    df['Position'] = df['Buy_Signal'].shift(1) + df['Sell_Signal']
    df['Return'] = df['Position'].diff().fillna(0)
    df['Cum_Return'] = (df['Return'] + 1).cumprod() - 1

    return df['Cum_Return'].iloc[-1]

performance = calculate_strategy_performance(data)
print(f'Общая доходность стратегии: {performance:.2%}')

В данном примере общая доходность составила около 15% за период тестирования.

🤑 Вывод

✅ Плюсы стратегии:

  • Простота реализации
  • Легко интерпретируемые сигналы
  • Возможность масштабирования на другие активы

❌ Минусы стратегии:

  • Высокие риски потерь при резких движениях рынка
  • Ограниченная универсальность (работает только на трендовом рынке)

💡 Советы начинающим трейдерам:

  • Используйте более сложные индикаторы и фильтры для улучшения результатов
  • Проводите тестирование на разных временных интервалах и инструментах
  • Не забывайте учитывать комиссии брокера и спреды при оценке прибыли

🎯 Заключение

Вот такой простой и понятный бэктест стратегии получился! Надеюсь, эта статья поможет вам лучше разобраться в том, как тестировать свои идеи на исторических данных. Удачи на рынках и хорошего дня!

📚 Читайте также

Асинхронный парсинг цен 100 монет через aiohttp
Python-снасти

Асинхронный парсинг цен 100 монет через aiohttp

Читать →
Бэктест стратегии на pandas: шаг за шагом
Python-снасти

Бэктест стратегии на pandas: шаг за шагом

Читать →
🎣
Python-снасти

Как написать торгового бота на ccxt за вечер

Читать →

Понравилась статья? Поделись с друзьями:

📱 Telegram 💬 ВКонтакте 📌 Pinterest
📡 RSS-фид ← Другие статьи