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

Данные

Во-первых, я создал данные о функциях из данных финансового отчета по акциям США.

Вот список названий функций:

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

Вот пример данных:

Всего около 340 000 строк, всего 2390 компаний. Диапазон дат 2004 ~ 2019.

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

Для расчета признаков я использовал свой собственный код Scala. Как вы знаете, наиболее важной/проблемной частью является конвейер данных, включая расчет признаков. Любой может создать обучающую модель с существующими данными, возможно, даже ученик средней школы.

Модель

Для машинного обучения я использовал алгоритм Random Forest от Spark с простыми параметрами.

Для RF я подогнал одну и ту же модель 10 раз и записал максимум и минимум, среднее значение результатов.

Для глубокого обучения я использовал простую модель DNN (глубокая нейронная сеть) от Tensorflow, как показано ниже:

model = keras.Sequential([
    keras.layers.Dense(25, activation='relu',
                       kernel_initializer='he_normal',
                       bias_initializer='zeros',
                       input_shape=[33]),
    keras.layers.Dropout(0.2),
            keras.layers.Dense(25, activation='relu',
                       kernel_initializer='he_normal',
                       bias_initializer='zeros',
                       input_shape=[33]),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(1, activation='sigmoid',
                       kernel_initializer='glorot_uniform',
                       bias_initializer='zeros')])
opt = keras.optimizers.SGD(learning_rate=0.0001)
model.compile(loss='binary_crossentropy', optimizer = 'adam',
              metrics =['accuracy', tf.keras.metrics.Precision(name='precision'), tf.keras.metrics.TruePositives(name='TP')])

Состоит из 3-х плотных слоев с 2-мя дропаутами. Я запустил 20 эпох, а размер партии составил 64.

Результат

Вот итог подгонки:

Я использовал две функции для целей: возврат вперед на 6 млн и возврат вперед на 10 млн. Пороговое значение метки равно 10%, что означает, что если 6M прямой возврат выше 10%, это 1 или 0 и так далее.

Как видите, модель DNN показывает гораздо лучшие результаты, чем модель RF. И модель DNN дает гораздо больше истинно-положительных результатов.

Что касается точности, которая считается наиболее важным показателем для финансового анализа, для модели RF точность теста имеет более низкое значение, чем значение поезда, а также ниже 0,5. Но для DNN значения обучения и теста почти одинаковы, что заставляет нас чувствовать облегчение.

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

Если вы видите последнюю строку, количество TP равно 3032. И общий период составляет около 16 лет, то есть около 150–200 строк (возможно, акций) в год, что кажется разумным размером создания корзины акций.

И последние 3 столбца показывают средние/минимальные/максимальные значения целевых значений из истинных прогнозируемых данных (в последнюю эпоху). Если вы видите средние столбцы, даже если пороговое значение для маркировки составляет 10% (второй столбец), среднее значение намного выше этого. И, как видите, особенно интересны максимальные значения. Например, из последней строки максимальное значение составляет 4900%, что означает, что среди акций в определенное время, предсказанное как верное, цена акций выросла примерно в 50 раз выше начальной цены за один год. Кажется, что в среднем значении преобладают те немногие высокоэффективные люди.

А вот линейная диаграмма для моделей DNN:

Как вы можете видеть, обе модели имеют почти плоские тренды точности. Возможно, модель плохо изучает данные, или количество истинных данных слишком мало, поэтому даже при высокой точности это не может сильно повлиять на точность. И точность тестовых данных («val_pre») выше, чем точность обучающих данных («pre») для обеих моделей.

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