Количественный анализ на Python
Количественная торговля на Python — это процесс использования языка программирования Python вместе со связанными библиотеками и инструментами для анализа данных финансового рынка, разработки стратегий и исполнения сделок.
Python стал одним из предпочтительных языков программирования для количественной торговли благодаря своей простоте, лёгкости изучения, мощной экосистеме и богатому набору финансовых библиотек.
Количественная торговля широко используется в финансовой сфере. Она позволяет трейдерам разрабатывать и исполнять торговые стратегии с помощью системных методов, повышая эффективность торговли и научную обоснованность принятия решений.
Количественный анализ в основном использует математические и статистические методы в сочетании с компьютерными технологиями для проведения количественного анализа финансовых рынков, тем самым разрабатывая и исполняя торговые стратегии.
Чтобы увидеть больше материалов по количественной торговле на Python, перейдите:Количественная торговля на Python。
Примеры применения
Далее рассмотрим простой пример применения количественной торговли на Python. Мы можем использовать стратегию скользящей средней с данными Yahoo Finance.
Основная идея этой стратегии — генерировать сигналы на покупку и продажу путём сравнения краткосрочной и долгосрочной скользящих средних.
Прежде чем перейти к этому простому примеру, необходимо установить три пакета:
pip install pandas yfinance matplotlib
Описания пакетов:
- Pandas — это мощная библиотека с открытым исходным кодом для обработки и анализа данных, специально предназначенная для эффективного анализа и манипулирования данными.
- yfinance — это библиотека для получения финансовых данных, поддерживающая получение данных об акциях, индексах и других данных финансового рынка из Yahoo Finance.
- Matplotlib — это библиотека для двумерной визуализации, используемая для создания статических, анимированных и интерактивных визуализаций данных.
Получение исторических данных об акциях
Используйте yfinance для получения исторических данных об акциях. Вот простой пример:
Пример
# Получить данные по акциям
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 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 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()
Отображаемый график выглядит следующим образом:

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