От нуля до единицы в Financial ML Developer с SKlearn

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

Базовые знания о факторном инвестировании

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

Исторические корни факторного инвестирования можно проследить до нескольких десятилетий назад. В 1960-х ученые-новаторы, такие как Юджин Ф. Фама и Кеннет Р. Френч, провели новаторское исследование, которое заложило основу для современного факторного инвестирования. Они определили конкретные факторы риска, которые могли бы объяснить колебания доходности акций, такие как фактор стоимости (акции с низким соотношением цены к балансовой стоимости, как правило, превосходят по доходности), фактор размера (акции с малой капитализацией, как правило, превосходят по доходности акции с большой капитализацией). , и фактор импульса (акции с недавними положительными ценовыми тенденциями, как правило, продолжают расти лучше других).

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

Основная причина, по которой факторное инвестирование так популярно, может заключаться в том, что факторное инвестирование можно легко объяснить в области управления инвестициями.

Шаг за шагом со sklearn

В моей последней статье я рассказываю о финансовом машинном обучении с помощью Scikit-Learn и использую набор данных 200+ финансовых индикаторов акций США (2014–2018) от Kaggle. В этой статье я буду использовать тот же набор данных. Итак, Вы можете просмотреть подробности из моей последней статьи.

Обычная процедура и та, что использовалась Фамой и Френчем (1992). Идея проста. В одно свидание,

  1. ранжировать фирмы по определенному критерию
  2. Сформируйте J≥2 J≥2 портфелей (т. е. однородных групп), состоящих из одинакового количества акций в соответствии с ранжированием (в этой статье используется средний размер)

Мы начнем с простого фактора, фактора размера. Мы объединим акции в две группы: большие/малые. Посмотрим, может ли размер генерировать альфу.

# Define a variable for filtering
filter_value = df_2014[["Market Cap"]].median()[0]

# Filter rows based on the variable
Big_Cap = df_2014[df_2014['Market Cap'] > filter_value]
Small_Cap = df_2014[df_2014['Market Cap'] < filter_value]

print("Big cap alpha", Big_Cap["Alpha"].mean())
print("Small cap alpha", Small_Cap["Alpha"].mean())

Мы видим, что в 2014 г. у компаний с большой капитализацией альфа была 3,91, у акций с малой капитализацией -3,28.

Давайте посмотрим на другие годы.

Year_lst = ["2014", "2015", "2016", "2017", "2018"] 
dic_alpha_bigcap = {}

for Year in Year_lst :

    data =   df_all[df_all['Year'] == Year]
    filter_value = data[["Market Cap"]].median()[0]
    Big_Cap = data[data['Market Cap'] > filter_value]

    print("Year : ", Year )
    print("Big cap alpha", Big_Cap["Alpha"].mean())

    dic_alpha_bigcap [Year] = Big_Cap["Alpha"].mean()

Year_lst = ["2014", "2015", "2016", "2017", "2018"] 
dic_alpha_Small_Cap = {}

for Year in Year_lst :

    data =   df_all[df_all['Year'] == Year]
    filter_value = data[["Market Cap"]].median()[0]
    Small_Cap = data[data['Market Cap'] < filter_value]

    print("Year : ", Year )
    print("Small cap alpha", Small_Cap["Alpha"].mean())

    dic_alpha_Small_Cap [Year] = Small_Cap["Alpha"].mean()

На данный момент, мы можем сделать вывод, что 2014 -2019 год Большая шапка. выполнить больше Маленькая шапка. Мы сделаем это для всех переменных.

def filter_data_top (column,df_all ) :

    Year_lst = ["2014", "2015", "2016", "2017", "2018"] 
    dic_alpha = {}

    for Year in Year_lst :
        data =   df_all[df_all['Year'] == Year]
        filter_value = data[[column]].median()[0]
                            
        filterdata = data[data[column] > filter_value]                   
        
        print("Year : ", Year )
        print(column, filterdata["Alpha"].mean())
        
        dic_alpha[Year] = filterdata["Alpha"].mean()

    return dic_alpha

def filter_data_below (column,df_all ) :

    Year_lst = ["2014", "2015", "2016", "2017", "2018"] 
    dic_alpha = {}

    for Year in Year_lst :
        data =   df_all[df_all['Year'] == Year]
        filter_value = data[[column]].median()[0]
                            
        filterdata = data[data[column] < filter_value]                   
        
        print("Year : ", Year )
        print(column, filterdata["Alpha"].mean())
        
        dic_alpha[Year] = filterdata["Alpha"].mean()

    return dic_alpha
lst_alpha_all_top = []

for factor in df_all.columns[2:] :
    try:        
        print(factor)
        dic_alpha = filter_data_top (column= factor,df_all = df_all)
        
        df__alpha = pd.DataFrame.from_dict(dic_alpha, orient='index',columns=[factor])
        lst_alpha_all_top.append(df__alpha)
    
    except:
        print("error")

Наконец, мы получаем альфа-таблицу.

Вы можете заговорить.

df_below_alpha.iloc[:,8:15].plot(figsize= (10, 6))
plt.legend(loc = "best");

Большой вопрос Какой фактор может генерировать альфу?

При анализе доходности акций, если мы предположим, что все доходности всех акций сложены в векторе r, а x является лаговой переменной, которая демонстрирует предсказательную силу в регрессионном анализе, может возникнуть соблазн сделать вывод, что x является хорошим предиктором доходности, если оценочный коэффициент b-hat является статистически значимым на основе указанного порога. Чтобы проверить важность x как фактора прогнозирования доходности, мы можем использовать тесты важности факторов, где x рассматривается как фактор, а y — это альфа. В уравнении Фамы и Френча y обычно представляется как возврат, но его также можно интерпретировать как возврат минус Ri и Ri-Rf, что по сути является альфой. Хотя мы не будем вдаваться в детали этого раздела здесь, вы можете обратиться к статье this, если вам интересно узнать больше об этой теме».

Примечание. Нам нужно изменить переменную на процентиль

Year_lst = ["2014", "2015", "2016", "2017", "2018"] 
dic_rank  = {}

for Year in Year_lst :

    data =   df_all[df_all['Year'] == Year]
    df_rank = df_all.rank(pct=True)

    dic_rank[Year] = df_rank
df_rank = pd.concat(dic_rank)

Я представлю еще одну технику под названием «Максимальный информационный коэффициент». Максимальный информационный коэффициент (МИК) — это статистическая мера, которая количественно определяет силу и нелинейность связи между двумя переменными. Он используется для оценки взаимосвязи между двумя переменными и определения наличия какой-либо значимой взаимной информации или зависимости между ними. MIC особенно полезен в тех случаях, когда взаимосвязь между двумя переменными не является линейной, поскольку он может фиксировать нелинейные связи, которые могут быть упущены линейными методами, такими как корреляция.

MIC считается важным, поскольку он предлагает несколько преимуществ:

  1. Фиксирует нелинейные связи. В отличие от линейной корреляции, которая измеряет только линейные отношения, MIC может фиксировать нелинейные связи между переменными. Это делает его полезным в сценариях, где связь между переменными не может быть хорошо описана линейной зависимостью.
  2. Измеряет как силу, так и нелинейность: MIC сочетает в себе показатели как силы, так и нелинейности связи, обеспечивая целостную оценку взаимосвязи между переменными. Это позволяет ему обнаруживать сложные закономерности зависимости, включая как линейные, так и нелинейные отношения.
  3. Устойчивость к шуму и масштабу: MIC устойчив к шуму и масштабным различиям между переменными, что делает его пригодным для анализа данных с различными уровнями шума или ошибок измерения.
  4. Предоставляет нормализованное значение: МИК нормализуется до значения от 0 до 1, где 0 указывает на отсутствие связи, а 1 указывает на полную связь. Это упрощает интерпретацию и сравнение силы связей между различными наборами данных или переменными.
  5. Приложения в различных областях: MIC широко используется в различных областях, таких как финансы, биоинформатика, экология и социальные науки. Он нашел применение при выборе признаков, уменьшении размерности и выявлении сложных шаблонов в больших наборах данных.

Мы используем minepy для тестирования MIC.

X_ = X["Revenue Growth"]
y = df_all["Alpha"]

mine = MINE( est="mic_approx")
mine.compute_score(X_, y)
mine.mic()

Как использовать машинное обучение для улучшения факторного инвестирования

Ранее мы объясняли, как работает факторное инвестирование. Методы машинного обучения (ML) можно использовать для улучшения факторного инвестирования различными способами. Алгоритмы машинного обучения могут помочь определить релевантные факторы с прогностической силой, оптимизировать комбинацию факторов, определить оптимальные сроки воздействия факторов, улучшить управление рисками, оптимизировать формирование портфеля и использовать альтернативные источники данных. Анализируя исторические данные и применяя алгоритмы машинного обучения, инвесторы могут выявлять факторы, оптимизировать их комбинацию и динамически корректировать риски в зависимости от рыночных условий. Методы машинного обучения также могут улучшить меры по управлению рисками и включать альтернативные данные для лучшего понимания.

Мы используем линейную регрессию, используя класс LinearRegression из модуля sklearn.linear_model в Python. Цель состоит в том, чтобы подогнать модель линейной регрессии к данным в df_rank DataFrame, чтобы предсказать значения зависимой переменной, обозначенной как y, используя значения независимой переменной, обозначенной как X, которая получена из столбца «коэффициент PE». df_rank.

Импорт линейной регрессии

from sklearn.linear_model import LinearRegression

Эта строка импортирует класс LinearRegression из модуля sklearn.linear_model, который обеспечивает реализацию линейной регрессии в scikit-learn, популярной библиотеке машинного обучения на Python.

Определите зависимую переменную:

y = df_all["Alpha"]

Эта строка назначает столбец «Альфа» df_all DataFrame переменной y, которая представляет зависимую переменную в модели линейной регрессии.

X = df_rank[["PE ratio"]].fillna(value=df_rank["PE ratio"].mean())

Эта строка присваивает DataFrame, содержащему столбец «Коэффициент PE» df_rank DataFrame, переменной X, которая представляет собой независимую переменную в модели линейной регрессии. Метод fillna() используется для заполнения любых отсутствующих значений в столбце «коэффициент PE» средним значением столбца.

PElin_reg = LinearRegression()

Эта строка создает экземпляр класса LinearRegression и присваивает его переменной PElin_reg.

Соответствуйте модели линейной регрессии:

PElin_reg.fit(X, y)

Эта линия сопоставляет модель линейной регрессии с данными, используя значения X в качестве независимой переменной и y в качестве зависимой переменной.

Извлеките коэффициенты модели:

PElin_reg.intercept_, PElin_reg.coef_

Эти строки извлекают точку пересечения и коэффициент(ы) модели линейной регрессии, которые представляют оценочные параметры модели. Доступ к перехвату осуществляется с использованием атрибута intercept_, а доступ к коэффициентам осуществляется с использованием атрибута coef_. Эти значения могут дать представление о взаимосвязи между независимыми переменными и зависимой переменной в модели линейной регрессии.

Повторить с РОЭ

from sklearn.linear_model import LinearRegression
y = df_all["Alpha"]
X = df_rank[["ROE"]].fillna(value=df_rank["ROE"].mean() )


ROElin_reg = LinearRegression()
ROElin_reg.fit(X, y)
ROElin_reg.intercept_, ROElin_reg.coef_

И сюжет

import matplotlib.pyplot as plt

X1 = df_rank[["PE ratio"]].fillna(value=df_rank["PE ratio"].mean() )
X2 = df_rank[["ROE"]].fillna(value=df_rank["ROE"].mean() )

plt.figure(figsize=(6, 4))  # extra code – not needed, just formatting
plt.plot( X1, PElin_reg.predict(X1), "r-", label="PE")
plt.plot(X2  , ROElin_reg.predict(X2) , "b-", label="ROE")

# extra code – beautifies and saves Figure 4–2
plt.xlabel("$x_1$")
plt.ylabel("$y$", rotation=0)
# plt.axis([1, 1, ])
plt.grid()
plt.legend(loc="upper left")

plt.show()

Мы видим, что линия PE имеет более высокий наклон (coef_). Следовательно, мы можем сказать, что PE может предсказать значение альфа. Если у нас есть 3 акции, и мы хотим знать, какая из них будет работать.

Здесь мы попытаемся предсказать ранг Альфы из 10 переменных.

y = df_all["Alpha"]
X = df_rank.fillna(value=df_rank.mean() )
bestfeatures = SelectKBest(k=10, score_func=f_regression)
fit = bestfeatures.fit(X,y)

повторить

from sklearn.linear_model import LinearRegression

top_fest = featureScores.nlargest(10,'Score')["Specs"].tolist()

y = df_rank["Alpha"]
X = df_rank[top_fest].fillna(value=df_rank[top_fest].mean() )


lin_reg = LinearRegression()
lin_reg.fit(X, y)

lin_reg.predict(X)

Обрабатывать данные

df_ =  df_all[["Unnamed: 0", "Sector", "Year"]]
df_["Alpha_rank"] = df_rank["Alpha"]
df_["Predict_Alpha"] = lin_reg.predict(X)

распечатать MSE

from sklearn.metrics import mean_squared_error
X = df_["Unnamed: 0"]
Y1 = df_["Alpha_rank"]
Y2 = df_["Predict_Alpha_rank"]

mean_squared_error(Y1, Y2)

MSE = 0,07, это указывает на то, что в среднем квадраты различий между прогнозируемыми значениями и фактическими значениями (т. е. остатками) относительно малы. Более низкий MSE обычно указывает на лучшую производительность модели, поскольку это означает, что прогнозы модели ближе к фактическим значениям.

Но,

import matplotlib.pyplot as plt

X = df_["Unnamed: 0"].head(30)
Y1 = df_["Alpha_rank"].head(30)
Y2 = df_["Predict_Alpha"].head(30)

plt.figure(figsize=(6, 6))  # extra code – not needed, just formatting
plt.plot( X, Y1, "r.", label="Alpha")
plt.plot( X , Y2 , "b.", label="Predict_Alpha")

# extra code – beautifies and saves Figure 4–2
plt.xlabel("$x_1$")
plt.ylabel("$y$", rotation=0)
# plt.axis([1, 1, ])
plt.grid()
plt.legend(loc="upper left")

plt.show()

Мы видим, что хотя MSE меньше, но мы видим, что прогнозируемое значение находится посередине. Это связано с ограничениями модели регрессии Liner.

Вычислительная сложность

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

Градиентный спуск

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

from sklearn.linear_model import SGDRegressor

sgd_reg = SGDRegressor(max_iter=100000, tol=1e-5, penalty=None, eta0=0.01,
                       n_iter_no_change=100, random_state=42)
sgd_reg.fit(X, y.ravel())  # y.ravel() because fit() expects 1D targets

Кривые обучения

Иногда у нас слишком много переменных. Мы хотим, чтобы данные обучения соответствовали намного лучше, чем обычная линейная регрессия. В этом случае мы используем 100 переменных. Мы используем функцию Learning_curve, чтобы помочь нам.

from sklearn.model_selection import learning_curve

train_sizes, train_scores, valid_scores = learning_curve(
    LinearRegression(), X, y, train_sizes=np.linspace(0.01, 1.0, 40), cv=5,
    scoring="neg_root_mean_squared_error")
train_errors = -train_scores.mean(axis=1)
valid_errors = -valid_scores.mean(axis=1)

plt.figure(figsize=(6, 4))  # extra code – not needed, just formatting
plt.plot(train_sizes, train_errors, "r-+", linewidth=2, label="train")
plt.plot(train_sizes, valid_errors, "b-", linewidth=3, label="valid")

# extra code – beautifies and saves Figure 4–15
plt.xlabel("Training set size")
plt.ylabel("RMSE")
plt.grid()
plt.legend(loc="upper right")
#plt.axis([0, 80, 0, 2.5])

plt.show()

Оптимальные данные о размере тренировочного набора — это красная линия рядом с синей линией. Если красная линия намного ниже синей, это называется Underfit. С другой стороны, если красная линия намного выше синей линии, Overfit.

Вне ……………………

В этот момент мы получим коэффициент. Коэффициент может сказать, какие факторы определяют доходность. У нас все еще есть много деталей, которые мы пропустили (нормализация, разработка факторов и т. Д.). Другие алгоритмы (регуляризованные линейные модели, регрессия Лассо, эластичная сеть), включая использование ML на различных этапах. .

Ссылка:

Машинное обучение для факторного инвестирования Гийома Кокере

  1. «Достижения в области финансового машинного обучения» Маркоса Лопеса де Прадо: в этой книге представлен подробный обзор пересечения финансов и машинного обучения, включая методы факторного моделирования, управления рисками и оптимизации портфеля с использованием алгоритмов машинного обучения.
  2. «Машинное обучение для факторного инвестирования: эмпирические методы систематической торговли» Маркоса Лопеса де Прадо:
  3. «Прикладное машинное обучение» Келлехера, Мак Нами и Д'Арси
  4. «Количественный моментум: практическое руководство по построению системы выбора акций на основе импульса», Уэсли Р. Грей и Джек Р. Фогель.
  5. Практический мл с scikit-learn keras и tensorflow от Geron Aurelien
  6. Чертежи машинного обучения и науки о данных для финансов: от построения торговых стратегий до роботов-советников с использованием Python от Hariom Tatsat, Sahil Puri, Brad Lookabaugh

Блокнот



Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate