import matplotlib.pyplot as plt
import numpy as np
import yfinance as yf
import pandas as pd
# Скачиваем данные по тикеру, например, BTC-USD
data = yf.download("BTC-USD", start="2024-01-01", end="2025-01-01", interval="1d")
data.head()
data['SMA_20'] = data['Close'].rolling(window=20).mean()
data['SMA_50'] = data['Close'].rolling(window=50).mean()
data[['Close', 'SMA_20', 'SMA_50']].tail()
# Инициализируем сигналы
data['Signal'] = 0
# Условие пересечения вверх: предыдущий SMA_20 <= SMA_50, текущий SMA_20 > SMA_50
cross_up = (data['SMA_20'].shift(1) <= data['SMA_50'].shift(1)) & (data['SMA_20'] > data['SMA_50'])
# Условие пересечения вниз: предыдущий SMA_20 >= SMA_50, текущий SMA_20 < SMA_50
cross_down = (data['SMA_20'].shift(1) >= data['SMA_50'].shift(1)) & (data['SMA_20'] < data['SMA_50'])
# Применим сигналы
data['Signal'] = np.where(cross_up, 1, np.where(cross_down, -1, 0))
data[['Close', 'SMA_20', 'SMA_50', 'Signal']].tail()
plt.figure(figsize=(16, 8))
plt.plot(data['Close'], label='Цена', linewidth=1)
plt.plot(data['SMA_20'], label='SMA 20', linestyle='--')
plt.plot(data['SMA_50'], label='SMA 50', linestyle='--')
# Сигналы покупки и продажи
buy_signals = data[data['Signal'] == 1]
sell_signals = data[data['Signal'] == -1]
plt.scatter(buy_signals.index, buy_signals['Close'], label='Покупка', marker='^', color='green', s=100)
plt.scatter(sell_signals.index, sell_signals['Close'], label='Продажа', marker='v', color='red', s=100)
plt.legend()
plt.title('Пересечение SMA 20 и SMA 50')
plt.xlabel('Дата')
plt.ylabel('Цена')
plt.grid(True)
plt.show()