Анализ биржевых данных с Pandas
В анализе биржевых данных pandas — очень мощный инструмент, который помогает обрабатывать и анализировать данные фондового рынка.
В этой главе мы используем yfinance (библиотеку Yahoo Finance) для загрузки исторических биржевых данных и выполнения различных видов анализа, включая очистку данных, визуализацию, расчёт технических индикаторов и т. д.
yfinance — это библиотека Python, которая позволяет легко получать исторические данные и данные в реальном времени по таким активам, как акции, фонды и криптовалюты, из Yahoo Finance.
С помощью pandas мы можем сохранить эти данные как DataFrame и выполнить последующий анализ.
- Очистка данных: обработка пропущенных значений, удаление ненужных столбцов и т. д.
- Визуализация данных: построение графиков временных рядов акций, скользящих средних, RSI и т. д.
- Расчет технических индикаторов: Например, скользящая средняя (SMA), индекс относительной силы (RSI) и т. д.
- Анализ дневной доходности и совокупной доходности: Помогает оценить краткосрочную и долгосрочную эффективность акции.
- Анализ волатильности: Измеряет волатильность цены акции.
Для получения дополнительной информации о финансовых библиотеках и количественном анализе можно обратиться к:Количественная торговля на Python
Установка yfinance
Сначала нам нужно установить библиотеку yfinance следующим образом:
pip install yfinance --upgrade --no-cache-dir
При установке yfinance pandas обычно устанавливается автоматически как зависимость. Это означает, что при использовании yfinance вы можете напрямую использовать структуры данных и функции, предоставляемые pandas, для обработки и анализа данных.
Импортируйте необходимые библиотеки:
import yfinance as yf import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
Получение данных об акциях
Используя библиотеку yfinance, мы можем легко загружать данные об акциях.
Обычно мы используем функцию yf.download() для получения исторических данных об акции из Yahoo Finance.
Код акции Moutai — 600519.SS, где.SS.SS — это суффикс Шанхайской фондовой биржи.
Используйте yfinance для получения данных об акциях:
Пример
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Просмотреть первые несколько строк данных
print(stock_data.head())
Выходные данные показаны ниже:

Возвращённые данные содержат следующие столбцы:
Open: OpenHigh: HighLow: LowClose: CloseAdj Close: Скорректированная цена закрытия (с учётом дивидендов, дробления акций и т. д.)Volume: Объём
Функция yf.download() возвращает pandas.DataFrame, содержащий исторические данные указанной акции:
Пример
# Получить данные по акциям Moutai (600519.SS)
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Проверить тип данных
print(type(stock_data)) # Должно вывести <class 'pandas.core.frame.DataFrame'>
Вывод:
[*********************100%%**********************] 1 of 1 completed <class 'pandas.core.frame.DataFrame'>
Очистка и обработка данных
При анализе данных об акциях обычно требуется выполнить очистку и обработку данных.
Типичные шаги включают заполнение пропущенных значений, удаление нерелевантных столбцов, преобразование типов данных и т. д.
В некоторых версиях yfinance pandas подключается автоматически, и его не нужно импортировать повторно, поэтому при использовании yfinance можно напрямую использовать структуры данных и функции, предоставляемые pandas, для обработки и анализа данных.
Проверьте пропущенные значения и заполните их:
Пример
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Проверить пропущенные значения
print(stock_data.isnull().sum())
# Заполните пропущенные значения с помощью прямого заполнения
stock_data.ffill(inplace=True)
# Или используйте обратное заполнение
# stock_data.bfill(inplace=True)
# Проверьте, обработаны ли пропущенные значения
print(stock_data.isnull().sum())
Результат вывода следующий:
[*********************100%%**********************] 1 of 1 completed Open 0 High 0 Low 0 Close 0 Adj Close 0 Volume 0 dtype: int64 Open 0 High 0 Low 0 Close 0 Adj Close 0 Volume 0
Удалите нерелевантные столбцы:
Пример
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Удалите столбцы 'Volume' и 'Adj Close'
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])
print(stock_data_cleaned.head())
Результат вывода следующий:

Визуализация данных: построение кривых цен акций
Используя matplotlib или seaborn, мы можем визуализировать данные об акциях, чтобы помочь выявить тенденции и колебания.
Постройте временной ряд цены закрытия:
Пример
import matplotlib.pyplot as plt
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Удалите столбцы 'Volume' и 'Adj Close'
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])
# Построить кривую цены закрытия Moutai
plt.figure(figsize=(10, 6))
plt.plot(stock_data_cleaned['Close'], label='Close Price')
plt.title('Цена акций Maotai (2020)', fontsize=14)
plt.xlabel('Дата', fontsize=12)
plt.ylabel('Цена закрытия (CNY)', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
Вывод следующий:

Расчет технических индикаторов для акций
В анализе акций часто используются технические индикаторы (такие как скользящие средние, индекс относительной силы RSI и т.д.) для помощи в принятии решений. pandas может помочь нам рассчитать эти индикаторы.
1. Скользящая средняя (SMA)
Простая скользящая средняя (SMA) является одним из наиболее часто используемых технических индикаторов, представляющим среднюю цену закрытия за последние N дней.
Пример
import matplotlib.pyplot as plt
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Удалите столбцы 'Volume' и 'Adj Close'
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])
# Расчет 50-дневной и 200-дневной скользящих средних
stock_data_cleaned['SMA_50'] = stock_data_cleaned['Close'].rolling(window=50).mean()
stock_data_cleaned['SMA_200'] = stock_data_cleaned['Close'].rolling(window=200).mean()
# Построить график цены закрытия и скользящих средних
plt.figure(figsize=(12, 6))
plt.plot(stock_data_cleaned['Close'], label='Close Price')
plt.plot(stock_data_cleaned['SMA_50'], label='50-дневная SMA')
plt.plot(stock_data_cleaned['SMA_200'], label='200-дневная SMA')
plt.title('Цена акций Maotai со скользящими средними', fontsize=14)
plt.xlabel('Дата', fontsize=12)
plt.ylabel('Цена (CNY)', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
Вывод следующий:

2. Индекс относительной силы (RSI)
RSI — это технический индикатор, используемый для оценки того, перекуплена ли акция или перепродана. Как правило, значение RSI выше 70 указывает на перекупленность, а ниже 30 — на перепроданность.
Пример
import matplotlib.pyplot as plt
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Удалите столбцы 'Volume' и 'Adj Close'
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])
# Рассчитать индикатор RSI
delta = stock_data_cleaned['Close'].diff(1)
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
# Рассчитать средние значения прибылей и убытков
avg_gain = gain.rolling(window=14).mean()
avg_loss = loss.rolling(window=14).mean()
# Рассчитать индекс относительной силы (RSI)
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
# Добавить RSI в данные
stock_data_cleaned['RSI'] = rsi
# Построить кривую RSI
plt.figure(figsize=(12, 6))
plt.plot(stock_data_cleaned['RSI'], label='RSI')
plt.axhline(y=70, color='r', linestyle='--', label='Перекупленность (70)')
plt.axhline(y=30, color='g', linestyle='--', label='Перепроданность (30)')
plt.title('Индикатор RSI для акций Maotai', fontsize=14)
plt.xlabel('Дата', fontsize=12)
plt.ylabel('RSI', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
Вывод следующий:

Применение анализа биржевых данных
В реальном анализе биржевых данных вы можете использовать pandas для выполнения следующих распространённых операций:
1. Дневная доходность и совокупная доходность
Расчёт дневной доходности и совокупной доходности акции помогает оценить её долгосрочную результативность.
Пример
import matplotlib.pyplot as plt
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Удалите столбцы 'Volume' и 'Adj Close'
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])
# Рассчитать дневные доходности
stock_data_cleaned['Daily_Return'] = stock_data_cleaned['Close'].pct_change()
# Рассчитать кумулятивную доходность
stock_data_cleaned['Cumulative_Return'] = (1 + stock_data_cleaned['Daily_Return']).cumprod()
# Построить график кумулятивной доходности
plt.figure(figsize=(10, 6))
plt.plot(stock_data_cleaned['Cumulative_Return'], label='Кумулятивная доходность')
plt.title('Кумулятивная доходность акций Maotai (2020)', fontsize=14)
plt.xlabel('Дата', fontsize=12)
plt.ylabel('Кумулятивная доходность', fontsize=12)
plt.legend()
plt.grid(True)
plt.show()
Вывод следующий:

2. Волатильность акций
Волатильность — это показатель, который измеряет колебания цен на акции.
Обычно мы можем использовать стандартное отклонение доходностей для измерения волатильности акций.
Пример
import matplotlib.pyplot as plt
# Получить данные об акциях Moutai (600519.SS) с 2020-01-01 по 2021-01-01
stock_data = yf.download('600519.SS', start='2020-01-01', end='2021-01-01')
# Удалите столбцы 'Volume' и 'Adj Close'
stock_data_cleaned = stock_data.drop(columns=['Adj Close', 'Volume'])
# Рассчитать дневные доходности
stock_data_cleaned['Daily_Return'] = stock_data_cleaned['Close'].pct_change()
# Рассчитать кумулятивную доходность
stock_data_cleaned['Cumulative_Return'] = (1 + stock_data_cleaned['Daily_Return']).cumprod()
# Вычислить стандартное отклонение дневных доходностей (волатильность)
volatility = stock_data_cleaned['Daily_Return'].std()
# Вывести волатильность
print(f"Daily Volatility: {volatility:.4f}")
Вывод следующий:
[*********************100%%**********************] 1 of 1 completed Daily Volatility: 0.0181Другие расширения