Примечание редакторам Data Science. Хотя мы разрешаем независимым авторам публиковать статьи в соответствии с нашими правилами и рекомендациями, мы не поддерживаем вклад каждого автора. Не следует полагаться на работы автора без консультации с профессионалами. См. Подробности в наших Условиях для читателей.

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

Концепция:

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

Из-за волатильности акций я не буду использовать цену закрытия акции для ее прогнозирования, а буду использовать соотношение между прошлой и текущей ценой закрытия. Чтобы понять, как работает программа, мы должны сначала понять действующий алгоритм:

Что такое гауссовский наивный байесовский классификатор?

Gaussian Naive Bayes - это алгоритм, который классифицирует данные путем экстраполяции данных с использованием распределения по Гауссу (идентично нормальному распределению), а также теоремы Байеса.

Преимущества:

  • Работает с небольшими наборами данных

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

  • Не требует интенсивных вычислений

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

Недостатки:

  • Не удается изучить большие данные

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

Код:

Разобравшись с принципами работы гауссовского наивного байесовского алгоритма, перейдем к программе:

Шаг 1 | Предпосылки:

import yfinance
from scipy import stats
aapl = yfinance.download('AAPL','2016-1-1','2020-1-1')

Это две библиотеки, которые я буду использовать в своем проекте: yfinance - для загрузки биржевых данных, а scipy - для создания гауссовских дистрибутивов.

Я скачал данные об акциях Apple с 2016 по 2020 год, чтобы получить воспроизводимые результаты.

Шаг 2 | Преобразование в гауссовские распределения:

def calculate_prereq(values):
    std = np.std(values)
    mean = np.mean(values)
    return std,mean
def calculate_distribution(mean,std):
    norm = stats.norm(mean, std)
    return norm
def extrapolate(norm,x):
    return norm.pdf(x)
def values_to_norm(dicts):
    for dictionary in dicts:
        for term in dictionary:
            std,mean = calculate_prereq(dictionary[term])
            norm = calculate_distribution(mean,std)
            dictionary[term] = norm
    return dicts

Функция «calculate_prereq» помогает вычислить стандартное отклонение и среднее значение: две вещи, необходимые для создания гауссовского распределения.

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

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

Шаг 3 | Сравните возможности:

def compare_possibilities(dicts,x):
    probabilities = []
    for dictionary in dicts:
        dict_probs = []
        for i in range(len(x)):
            value = x[i]
            dict_probs.append(extrapolate(dictionary[i],value))
        probabilities.append(np.prod(dict_probs))
    return probabilities.index(max(probabilities))

Эта функция просто просматривает словари (разные классы) и вычисляет вероятность повышения или понижения цены с учетом соотношений между ценами за последние десять дней. Затем он возвращает индекс в списке словарей, класс, который классификатор Байеса вычисляет как имеющий наивысшую вероятность.

Шаг 4 | Запустите программу:

drop = {}
increase = {}
for day in range(10,len(aapl)-1):
    previous_close = aapl['Close'][day-10:day]
    ratios = []
    for i in range(1,len(previous_close)):
        ratios.append(previous_close[i]/previous_close[i-1])
    if aapl['Close'][day+1] > aapl['Close'][day]:
        for i in range(len(ratios)):
            if i in increase:
                increase[i] += (ratios[i],)
            else:
                increase[i] = ()
    elif aapl['Close'][day+1] < aapl['Close'][day]:
        for i in range(len(ratios)):
            if i in drop:
                drop[i] += (ratios[i],)
            else:
                drop[i] = ()
                
new_close = aapl['Close'][-11:-1]
ratios = []
for i in range(1,len(new_close)):
    ratios.append(new_close[i]/new_close[i-1])
for i in range(len(ratios)):
    if i in increase:
        increase[i] += (ratios[i],)
    else:
        increase[i] = ()
            
X = ratios
print(X)
dicts = [increase,drop]
dicts = values_to_norm(dicts)
compare_possibilities(dicts,X)

Эта последняя часть объединяет все функции и собирает 9 коэффициентов для курса акций за последние 10 дней. Затем он выполняет программу и возвращается, если цена вырастет или упадет. Возвращаемое значение - это индекс словаря в списке dicts. Если он равен 1, прогнозируется снижение цены. Если он равен 0, прогнозируется рост цены.

Заключение:

Эта программа представляет собой всего лишь базовую структуру гауссовского наивного байесовского алгоритма. Вот несколько способов улучшить мою программу:

  • Увеличьте количество функций

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

  • Ссылка на Alpaca API

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

Мои ссылки:

Если вы хотите увидеть больше моего контента, нажмите эту ссылку.