🎣 Приветствую, друзья!
Я снова тут, Тихий Водяной из «Тихой Заводь». Сегодня поговорим про то, как можно протестировать свою торговую стратегию при помощи 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% за период тестирования.
🤑 Вывод
✅ Плюсы стратегии:
- Простота реализации
- Легко интерпретируемые сигналы
- Возможность масштабирования на другие активы
❌ Минусы стратегии:
- Высокие риски потерь при резких движениях рынка
- Ограниченная универсальность (работает только на трендовом рынке)
💡 Советы начинающим трейдерам:
- Используйте более сложные индикаторы и фильтры для улучшения результатов
- Проводите тестирование на разных временных интервалах и инструментах
- Не забывайте учитывать комиссии брокера и спреды при оценке прибыли
🎯 Заключение
Вот такой простой и понятный бэктест стратегии получился! Надеюсь, эта статья поможет вам лучше разобраться в том, как тестировать свои идеи на исторических данных. Удачи на рынках и хорошего дня!