1.1 Python: жизненно важный инструмент в финансовой индустрии

Python, представленный Гвидо ван Россумом в 1991 году, стал важным инструментом в финансовой сфере. Это связано с диапазоном приложений Python и простым, но мощным синтаксисом. Python позволяет программистам компактно излагать свои идеи, предлагая значительную экономию времени по сравнению с другими языками программирования, такими как C++ или Java.

Сила Python заключается в его большом активном сообществе разработчиков, которые расширили функциональность Python для удовлетворения различных потребностей. Python известен своим принципом "батареи включены", который относится к комплексной стандартной библиотеке, поставляемой с Python. Эта библиотека включает инструменты для создания графических пользовательских интерфейсов, подключения к веб-серверам, обработки данных JSON и многого другого. Python подходит для самых разных задач, от веб-разработки и анализа данных до машинного обучения.

Популярность Python в сфере финансов проистекает из множества библиотек, чистого синтаксиса и универсальности. Специалисты по финансам часто работают со сложными структурами данных и выполняют сложные вычисления. Библиотеки Python, такие как NumPy, pandas и TensorFlow, предоставляют ценные инструменты для манипулирования данными, статистического моделирования и приложений машинного обучения — все важные финансовые элементы.

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

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

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

start = '2020-01-01'
end = '2020-12-31'
df = yf.download('AAPL', start=start, end=end)
df['Return'] = df['Adj Close'].pct_change()
# Better presentation of df.head()
pd.set_option('display.expand_frame_repr', False)
print(df.head().to_string(index=False))
# Better graph
plt.figure(figsize=(10, 6))
sns.set_style("whitegrid")
sns.lineplot(data=df['Return'], color='green')
plt.title('Return of AAPL', fontsize=20)
plt.xlabel('Date', fontsize=16)
plt.ylabel('Return', fontsize=16)
plt.show()
# cumulated return
df['Cumulated Return'] = (1 + df['Return']).cumprod()
plt.figure(figsize=(10, 6))
sns.set_style("whitegrid")
sns.lineplot(data=df['Cumulated Return'], color='green')
plt.title('Cumulated Return of AAPL', fontsize=20)
plt.xlabel('Date', fontsize=16)
plt.ylabel('Cumulated Return', fontsize=16)
plt.show()

# output:
"""
[*********************100%***********************]  1 of 1 completed
     Open      High       Low     Close  Adj Close    Volume    Return
74.059998 75.150002 73.797501 75.087502  73.347946 135480400       NaN
74.287498 75.144997 74.125000 74.357498  72.634842 146322800 -0.009722
73.447502 74.989998 73.187500 74.949997  73.213615 118387200  0.007968
74.959999 75.224998 74.370003 74.597504  72.869278 108872000 -0.004703
74.290001 76.110001 74.290001 75.797501  74.041489 132079200  0.016086
""";

Не беспокойтесь о кодах, если вы не понимаете их сейчас, мы скоро рассмотрим детали.

2. Альтернативы Python в финансах

Несмотря на популярность Python, другие языки играют свою роль в финансовой индустрии. R, MATLAB, C++ и Java — достойные внимания конкуренты.

  • R известен своими обширными пакетами для статистического анализа и визуализации данных. Однако R должен улучшиться в областях, требующих надежности, эффективности или масштабируемости. Например, R может понадобиться помощь с большими наборами данных или в случаях, когда скорость выполнения имеет решающее значение.
  • MATLAB отличается превосходным набором инструментов, включая встроенные алгоритмы обработки сигналов, анализа изображений и машинного обучения. Однако MATLAB переживает спад в финансовом секторе из-за высокой стоимости лицензии.
  • C++ идеально подходит, когда необходимо точно контролировать использование памяти и ЦП. Часто этот язык выбирают для высокочастотных торговых приложений, где критична скорость исполнения. Тем не менее, C++ имеет крутую кривую обучения и требует больше времени для разработки, чем Python.
  • Java — это строго типизированный объектно-ориентированный язык, часто используемый в крупномасштабных финансовых приложениях. Его предпочитают за его надежность и широкий спектр библиотек. Тем не менее, это может быть излишним для более простых задач или быстрого прототипирования.

Python, язык с открытым исходным кодом, предлагает преимущества удобочитаемости R, набора инструментов MATLAB и универсальности Java, предлагая более быстрые возможности прототипирования, чем C++. Это делает его желательным выбором для многих финансовых проектов, если конкретные требования не предполагают иное.

Машинное обучение в финансах использует вычислительные и статистические методы для прогнозирования и автоматизации процессов принятия решений. Python предоставляет инструменты для реализации и тестирования моделей машинного обучения с такими библиотеками, как scikit-learn, TensorFlow и PyTorch.

Рассмотрим следующий пример Python, демонстрирующий простой финансовый расчет — совокупный годовой темп роста (CAGR).

Эта функция Python вычисляет совокупный годовой темп роста (CAGR). CAGR является полезной мерой роста за несколько периодов времени. Его можно рассматривать как скорость роста, которая приводит вас от первоначальной стоимости инвестиций к конечной стоимости инвестиций, если вы предполагаете, что инвестиции увеличивались в течение определенного периода времени. Функция calculate_cagr принимает три аргумента:

  • start_value, которое представляет начальную стоимость инвестиций.
  • end_value, которое представляет стоимость инвестиций в конце периода времени.
  • периоды, которые представляют собой количество периодов времени (чаще всего лет)
  • Вычисление внутри функции (конечное_значение/начальное_значение) ** (1/периоды) является формулой для CAGR. Это деление конечного значения на начальное значение, возведение результата в степень 1, деленного на количество периодов, а затем вычитание 1, чтобы получить скорость роста в виде десятичной дроби.
  • Оператор печати форматирует вывод в строку и выводит ее на консоль. В этом конкретном примере первоначальная инвестиция составляет 10 000 долларов США, конечная стоимость составляет 20 000 долларов США, а количество периодов равно 5. Таким образом, рассчитывается совокупный годовой темп роста для инвестиций в размере 10 000 долларов США, которые выросли до 20 000 долларов США за 5 периодов (вероятные годы).
def calculate_cagr(start_value, end_value, periods):
    return (end_value/start_value) ** (1/periods) - 1

print(f"The CAGR is {calculate_cagr(10000, 20000, 5)}")
# output: The CAGR is 0.1486983549970351

Код

  • первая загрузка исторических данных для тикера SPY (индексный фонд S&P 500) из Yahoo Finance. Он предварительно обрабатывает это, чтобы каждый день извлекать «максимальные» и «минимальные» цены, которые используются в качестве входных данных (X) и выходных данных (y) соответственно для простой модели линейной регрессии.
  • Затем набор данных разбивается на наборы для обучения и тестирования в соотношении 80–20. Модель линейной регрессии обучается на обучающих данных. Модель оценивается путем просмотра средней абсолютной ошибки ее прогнозов на тестовых данных, которая представляет собой среднюю абсолютную разницу между прогнозами модели и фактическими низкими ценами.
  • Затем отображается диаграмма рассеяния всех «высоких» и «минимальных» цен, а прогнозы модели на тестовых данных показаны красной линией.
  • Наконец, модель используется для прогнозирования «минимальной» цены, когда «высокая» цена равна 100. Прогнозируемая цена распечатывается.
import yfinance as yf
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
import matplotlib.pyplot as plt

ticker_symbol = 'SPY'
df = yf.download(ticker_symbol, '2019-01-01', '2022-12-31')
X = df['High'].values.reshape(-1,1)
y = df['Low'].values.reshape(-1,1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
model = LinearRegression()  
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
plt.scatter(X, y, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=2)
plt.title('High vs Low prices of SPY')
plt.xlabel('High Price')
plt.ylabel('Low Price')
plt.show()
print(model.predict([[100]]))
# output
# [*********************100%***********************]  1 of 1 completed
# Mean Absolute Error: 2.6486590595879775