Создание финансового аналитического отчёта на Python: анализ данных о ценах акций и визуализация технических индикаторов

Извлечение и анализ данных о ценах акций — ключ к принятию обоснованных решений в финансовой сфере. В этом руководстве мы подробно рассмотрим, как создать интегрированный инструмент для финансового анализа и составления отчётов на Python. Мы научимся получать исторические данные о рынке с Yahoo Finance и вычислять основные технические индикаторы, такие как простые скользящие средние (SMA), полосы Боллинджера, MACD и RSI. В руководстве вы узнаете, как создавать наглядные визуализации и объединять их в настраиваемые многостраничные PDF-отчёты.

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

python
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages

Здесь мы импортируем основные библиотеки Python для анализа финансовых данных и визуализации. Библиотека yfinance используется для получения данных о фондовом рынке, pandas — для обработки данных, matplotlib и numpy — для создания и обработки числовых графиков, а PdfPages — для объединения нескольких графиков в единый PDF-отчёт.

python
def compute_indicators(df):
“””
Вычисляет технические индикаторы для DataFrame:
– 20-дневное и 50-дневное простые скользящие средние (SMA)
– Полосы Боллинджера (используя 20-дневное SMA ±2 стандартных отклонения)
– MACD (12-дневное EMA минус 26-дневное EMA) и его 9-дневная сигнальная линия
– RSI (индекс относительной силы) за 14-дневный период
“””
df[‘SMA20’] = df[‘Close’].rolling(window=20).mean()
df[‘SMA50’] = df[‘Close’].rolling(window=50).mean()

df[‘STD20’] = df[‘Close’].rolling(window=20).std()
df[‘UpperBand’] = df[‘SMA20’] + 2 * df[‘STD20’]
df[‘LowerBand’] = df[‘SMA20’] – 2 * df[‘STD20’]

df[‘EMA12’] = df[‘Close’].ewm(span=12, adjust=False).mean()
df[‘EMA26’] = df[‘Close’].ewm(span=26, adjust=False).mean()
df[‘MACD’] = df[‘EMA12’] – df[‘EMA26’]
df[‘Signal’] = df[‘MACD’].ewm(span=9, adjust=False).mean()

delta = df[‘Close’].diff()
gain = delta.copy()
loss = delta.copy()
gain[gain < 0] = 0 loss[loss > 0] = 0
loss = loss.abs()
avg_gain = gain.rolling(window=14).mean()
avg_loss = loss.rolling(window=14).mean()
rs = avg_gain / avg_loss
df[‘RSI’] = 100 – (100 / (1 + rs))

return df

Эта функция вычисляет ключевые технические индикаторы, включая SMA, полосы Боллинджера, MACD и RSI, для данных о ценах акций, содержащихся во входном DataFrame. Она обновляет DataFrame дополнительными столбцами для каждого индикатора, что позволяет проводить углублённый технический анализ исторических показателей акций.

python
def create_cover_page(pdf):
“””
Создаёт и сохраняет титульную страницу в PDF-отчёт.
“””
fig = plt.figure(figsize=(11.69, 8.27))
plt.axis(‘off’)
plt.text(0.5, 0.7, “Финансовый аналитический отчёт”, fontsize=24, ha=’center’)
plt.text(0.5, 0.62, “Анализ 5 акций с Yahoo Finance”, fontsize=16, ha=’center’)
plt.text(0.5, 0.5, “Включает технические индикаторы: SMA, Полосы Боллинджера, MACD, RSI”, fontsize=12, ha=’center’)
plt.text(0.5, 0.4, “Создано с помощью Python и matplotlib”, fontsize=10, ha=’center’)
pdf.savefig(fig)
plt.close(fig)

Эта функция создаёт визуально привлекательную титульную страницу с помощью matplotlib и добавляет её как первую страницу PDF-отчёта через предоставленный объект PdfPages. Затем она закрывает рисунок, чтобы освободить ресурсы.

python
def plot_price_chart(ticker, df):
“””
Создаёт график цен с SMA и полосами Боллинджера для заданного тикера.
“””
fig, ax = plt.subplots(figsize=(14, 7))
ax.plot(df.index, df[‘Close’], label=’Цена закрытия’, linewidth=1.5)
ax.plot(df.index, df[‘SMA20′], label=’SMA (20)’, linewidth=1.2)
ax.plot(df.index, df[‘SMA50′], label=’SMA (50)’, linewidth=1.2)
ax.plot(df.index, df[‘UpperBand’], label=’Верхняя полоса Боллинджера’, linestyle=’–‘)
ax.plot(df.index, df[‘LowerBand’], label=’Нижняя полоса Боллинджера’, linestyle=’–‘)
ax.fill_between(df.index, df[‘LowerBand’], df[‘UpperBand’], color=’lightgray’, alpha=0.3)
ax.set_title(f'{ticker}: Цена и скользящие средние с полосами Боллинджера’)
ax.set_xlabel(‘Дата’)
ax.set_ylabel(‘Цена’)
ax.legend()
ax.grid(True)
return fig

Эта функция создаёт подробный график цен на акции для заданного тикера, включая цену закрытия, 20-дневное и 50-дневное SMA, а также полосы Боллинджера. Она возвращает объект matplotlib figure, который можно сохранить или дополнительно обработать в PDF-отчёте.

python
def plot_macd_chart(ticker, df):
“””
Создаёт график MACD для заданного тикера.
“””
fig, ax = plt.subplots(figsize=(14, 5))
ax.plot(df.index, df[‘MACD’], label=’MACD’, linewidth=1.5)
ax.plot(df.index, df[‘Signal’], label=’Сигнальная линия’, linewidth=1.5)
ax.set_title(f'{ticker}: MACD’)
ax.set_xlabel(‘Дата’)
ax.set_ylabel(‘MACD’)
ax.legend()
ax.grid(True)
return fig

Эта функция создаёт график MACD для указанного тикера, отображая MACD и его сигнальную линию в динамике. Она возвращает объект matplotlib figure, который можно включить в более крупный PDF-отчёт или отобразить независимо.

python
def plot_rsi_chart(ticker, df):
“””
Создаёт график RSI для заданного тикера.
“””
fig, ax = plt.subplots(figsize=(14, 5))
ax.plot(df.index, df[‘RSI’], label=’RSI’, linewidth=1.5)
ax.axhline(70, color=’red’, linestyle=’–‘, linewidth=1, label=’Перекупленность (70)’)
ax.axhline(30, color=’green’, linestyle=’–‘, linewidth=1, label=’Перепроданность (30)’)
ax.set_title(f'{ticker}: RSI’)
ax.set_xlabel(‘Дата’)
ax.set_ylabel(‘RSI’)
ax.legend()
ax.grid(True)
return fig

Эта функция создаёт график RSI для заданного тикера акций, отображая значения RSI вместе с горизонтальными справочными линиями на уровнях перекупленности (70) и перепроданности (30). Она возвращает объект matplotlib figure, который можно включить в итоговый финансовый аналитический отчёт.

python
def main():
tickers = []
for i in range(5):
ticker = input(f”Введите тикер #{i+1}: “).upper().strip()
tickers.append(ticker)

pdf_filename = “финансовый_отчёт.pdf”

with PdfPages(pdf_filename) as pdf:
create_cover_page(pdf)

for ticker in tickers:
print(f”Загрузка данных для {ticker} с Yahoo Finance…”)
df = yf.download(ticker, period=’1y’)

if df.empty:
print(f”Для {ticker} не найдено данных. Переход к следующему тикеру.”)
continue

df = compute_indicators(df)

fig_price = plot_price_chart(ticker, df)
pdf.savefig(fig_price)
plt.close(fig_price)

fig_macd = plot_macd_chart(ticker, df)
pdf.savefig(fig_macd)
plt.close(fig_macd)

fig_rsi = plot_rsi_chart(ticker, df)
pdf.savefig(fig_rsi)
plt.close(fig_rsi)

print(f”PDF-отчёт создан и сохранён как ‘{pdf_filename}’.”)

Здесь основная функция запрашивает у пользователя ввод пяти тикеров акций, загружает данные за один год для каждого из них с Yahoo Finance, вычисляет ключевые технические индикаторы и создаёт соответствующие графики цен, MACD и RSI. Затем она объединяет все графики в многостраничный PDF-отчёт под названием «финансовый_отчёт.pdf» и выводит подтверждающее сообщение после сохранения отчёта.

python
if __name__ == “__main__”:
main()

Этот блок проверяет, выполняется ли скрипт напрямую, а не импортируется как модуль. Если это так, он вызывает функцию main().

В заключение мы продемонстрировали метод автоматизации финансового анализа с помощью Python. Вы узнали, как извлекать ценные данные, вычислять ключевые технические индикаторы и создавать подробные визуальные отчёты в формате многостраничного PDF. Этот интегрированный подход упрощает процесс анализа и предоставляет мощный способ визуализации рыночных тенденций и мониторинга показателей акций. По мере дальнейшего настройки и расширения этой системы вы сможете продолжать улучшать свои аналитические возможности и принимать более обоснованные финансовые решения.

Источник

Оставьте комментарий