Количественный анализ на Python

Количественная торговля на Python — это процесс использования языка программирования Python вместе со связанными библиотеками и инструментами для анализа данных финансового рынка, разработки стратегий и исполнения сделок.

Python стал одним из предпочтительных языков программирования для количественной торговли благодаря своей простоте, лёгкости изучения, мощной экосистеме и богатому набору финансовых библиотек.

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

Количественный анализ в основном использует математические и статистические методы в сочетании с компьютерными технологиями для проведения количественного анализа финансовых рынков, тем самым разрабатывая и исполняя торговые стратегии.

Чтобы увидеть больше материалов по количественной торговле на Python, перейдите:Количественная торговля на Python。


Примеры применения

Далее рассмотрим простой пример применения количественной торговли на Python. Мы можем использовать стратегию скользящей средней с данными Yahoo Finance.

Основная идея этой стратегии — генерировать сигналы на покупку и продажу путём сравнения краткосрочной и долгосрочной скользящих средних.

Прежде чем перейти к этому простому примеру, необходимо установить три пакета:

pip install pandas yfinance matplotlib

Описания пакетов:

  • Pandas — это мощная библиотека с открытым исходным кодом для обработки и анализа данных, специально предназначенная для эффективного анализа и манипулирования данными.
  • yfinance — это библиотека для получения финансовых данных, поддерживающая получение данных об акциях, индексах и других данных финансового рынка из Yahoo Finance.
  • Matplotlib — это библиотека для двумерной визуализации, используемая для создания статических, анимированных и интерактивных визуализаций данных.

Получение исторических данных об акциях

Используйте yfinance для получения исторических данных об акциях. Вот простой пример:

Пример

import yfinance as yf

# Получить данные по акциям
symbol = "600519.SS"
start_date = "2022-01-01"
end_date = "2023-01-01"

data = yf.download(symbol, start=start_date, end=end_date)
print(data.head())

Результат вывода следующий:

                  Open         High          Low        Close    Adj Close   Volume
Date                                                                               
2022-01-04  2055.00000  2068.949951  2014.000000  2051.229980  1973.508057  3384262
2022-01-05  2045.00000  2065.000000  2018.000000  2024.000000  1947.309937  2839551
2022-01-06  2022.01001  2036.000000  1938.510010  1982.219971  1907.112915  5179475
2022-01-07  1975.00000  1988.880005  1939.319946  1942.000000  1868.416870  2981669
2022-01-10  1928.01001  1977.000000  1917.550049  1966.000000  1891.507446  2962670

Простой анализ данных и визуализация

Используйте pandas для анализа данных и matplotlib для визуализации:

Пример

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# Получить данные по акциям
symbol = "600519.SS"
start_date = "2022-01-01"
end_date = "2023-01-01"

data = yf.download(symbol, start=start_date, end=end_date)
# Простой анализ данных
print(data.describe())

# Построение графика тренда цены акций
data['Close'].plot(figsize=(10, 6), label=символ)
plt.title(f"Цена акций {symbol}")
plt.xlabel("Дата")
plt.ylabel("Цена")
plt.legend()
plt.show()

График тренда отображается следующим образом:

Бэктестинг стратегии пересечения скользящих средних

Бэктестинг — это процесс моделирования и оценки торговой стратегии на исторических рыночных данных.

Ниже приведён пример кода для бэктеста стратегии пересечения простых скользящих средних. Стратегия покупает, когда 50-дневная скользящая средняя пересекает 200-дневную скользящую среднюю снизу вверх, и продаёт, когда пересекает сверху вниз. Результаты стратегии выводят такие метрики, как общая доходность, годовая доходность и максимальная просадка.

Пример

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

# Получить данные по акциям
symbol = "600519.SS"
start_date = "2021-01-01"
end_date = "2023-01-01"

data = yf.download(symbol, start=start_date, end=end_date)

# Вычислить скользящие средние
data['SMA_50'] = data['Close'].rolling(window=50).mean()
data['SMA_200'] = data['Close'].rolling(window=200).mean()

# Инициализировать столбец сигнала пересечения
data['Signal'] = 0

# Рассчитать сигналы пересечения
data.loc[data['SMA_50'] > data['SMA_200'], 'Signal'] = 1
data.loc[data['SMA_50'] < data['SMA_200'], 'Signal'] = -1

# Рассчитать дневные доходности
data['Daily_Return'] = data['Close'].pct_change()

# Вычислить доходность на основе сигналов стратегии (shift(1) используется, чтобы избежать заглядывания в будущее)
data['Strategy_Return'] = data['Signal'].shift(1) * data['Daily_Return']

# Рассчитать кумулятивную доходность
data['Cumulative_Return'] = (1 + data['Strategy_Return']).cumprod()

# Вывести показатели стратегии
strategy_performance = {
    'Общая доходность': data['Cumulative_Return'].iloc[-1] - 1,
    'Годовая доходность': (data['Cumulative_Return'].iloc[-1] ** (252 / len(data))) - 1,
    'Максимальная просадка': (data['Cumulative_Return'] / data['Cumulative_Return'].cummax() - 1).min(),
}

print("Показатели стратегии:")
for key, value in strategy_performance.items():
    print(f"{key}: {value:.4f}")

# Построить кривую накопленной доходности
plt.figure(figsize=(10, 6))
plt.plot(data['Cumulative_Return'], label='Накопленная доходность стратегии', color='b')
plt.plot(data['Close'] / data['Close'].iloc[0], label='Накопленная доходность акции', color='g')
plt.title("Накопленная доходность стратегии по сравнению с акцией")
plt.xlabel("Дата")
plt.ylabel("Совокупная доходность")
plt.legend()
plt.show()

Отображаемый график выглядит следующим образом:

Обратите внимание, что это всего лишь простой пример. Реальные приложения требуют более сложных стратегий и дополнительных соображений.

Другие расширения