Рубрики
Без рубрики

Представляем мой новый Pet Project: Должен ли я ходль?

Моя крипто-одержимость от прошлого года, возможно, немного погибло, но я все еще оставаюсь долгосрочной игрой … Теги с ShowDev, MachineLearning, Python, Bitcoin.

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

Инструменты, как TowiHodl Отказ Это чрезвычайно простой веб-сайт, который больше ничего не делает, но выпивать Да или нет к вопросу, о том, хороший день, чтобы инвестировать в биткойн или нет. Акцент на слово Инвестировать => купить на более длительный срок. Я не заинтересован в чистых спекуляции, или манипулируемые схемы насоса и сброса насоса, которые затопили рынки в прошлом году. Кроме того, он должен пойти, не сказав, что это простой боковой проект, построенный в основном для веселых и обучающих целей, и никаких финансовых консультаций любого рода. Я не хочу нести никакой ответственности за потенциальные потери или пропущенные возможности для любого имени.

Как это работает?

Необработанные данные

В решении участвует справедливый бит машинного обучения. Во-первых, несколько десятков тысяч точек данных получают через открытый Poloniex API Отказ Каждая точка данных представляет собой 30-минутный интервал из истории цен на биткойн, содержащую данные, известные из обычных инструментов Charting и API:

  • открыть – цена в начале интервала
  • Закрыть – цена в конце интервала
  • Низкий – самая низкая цена, достигнутая на протяжении всего интервала
  • Высокий – самая высокая цена, достигнутая на протяжении всего интервала
  • quotevoleume – объемное движение, выраженное в единицах валюты цитаты, A.K.A BTC
  • Basevolume – движение объема, выраженное в единицах базовой валюты, USD, EUR или как в нашем случае Рост

Первые четыре лучше известны, чтобы выбрать энтузиастов и трейдеров, как то, что описывает Подсвечник :

Фото: Инвестопедия

Уборка и извлечение некоторых функций

Следующий шаг укроет необработанные данные в Pandas DataFrame :

Наличие нескольких тысяч подсвечников, можно использовать удивительные панды прокат Возможности, чтобы свернуть отношения HILO и скользящие средние значения, нормированные до максимума в данный период:

num_periods_in_7d = 2 * 24 * 7 # Once, every 30 min

df['hilo_7d'] = df['low'].rolling(num_periods_in_7d).mean() /
df['high].rolling(num_periods_in_7d).mean()
# Still volatile, but less so than the current price
df['ma_30'] = df['avg_price'].rolling(30).mean()

# Reacting slowly to rapid changes. Can be used as a line of
# support / resistance
df['ma_6400'] = df['avg_price'].rolling(6400).mean()

# Gives an idea how far the average price is from a past peak,
# or if it is at the peak itself
df['ma_30_6400_ratio'] = df['ma_30'] / 
df['avg_price'].rolling(6400).max()

Соберите несколько из них, и вы будете эффективно установить простой способ представления Ценовые узоры через определенное окно времени:

Чтобы сэкономить вам еще подробную информацию, такие вопросы, как они довольно популярны в техническом анализе, и поступают под название «осцилляторы». Было доказано, что цены не просто идут не в одном направлении, но ведут себя несколько, как силы в физике. Например, движение восходящего движения вызвано силой, применяемой к цене группой покупки. Он не может подняться на неопределенный срок (даже на крипто-земле), но в конечном итоге сталкивается с силой сопротивления, которая заставляет цену вниз. Вот почему после нормализации цены линии напоминают синусоидальные волны и могут быть проанализированы как таковые. Для тех из вас интересует более технические аналитические основы, я бы предложил ознакомиться с концепциями Поддержка и сопротивление Отказ

Классификация случаев

Основываясь только на входах, как наш алгоритм обучения машины знает, какой из них указывает на потенциальное движение вверх или вниз? Это верно, нам нужно классифицировать их первым. Один простой способ сделать это, состоит в том, чтобы сравнить цену в любой момент времени T с ценой некоторое время в будущем (скажем, в неделю) – T' . Если цена в неделю вниз по дороге больше цена во времени T , мы отмечаем корпус как 1 (Uptrend) или, альтернативно, AS -1 (Downtrend). Использование функции переключения Pandas’s-and-and-Backward, это кусок пирога:

# negative shifting will pair 
df['future_price'] = df['ma_6400'].shift(-1 * num_periods_in_7d)

df['future_price_chg'] = (df['future_price'] / df['ma_6400']) - 1
df.loc[df['future_price_chg'] >= 0, 'label'] = 1
df.loc[df['future_price_chg'] <= 0, 'label'] = -1

Выбор алгоритма машинного обучения

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

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

class sklearn.tree.DecisionTreeClassifier(criterion='gini', 
                                          splitter='best', 
                                          max_depth=None, 
                                          min_samples_split=2, 
                                          min_samples_leaf=1, 
                                          min_weight_fraction_leaf=0.0, 
                                          max_features=None, 
                                          random_state=None, 
                                          max_leaf_nodes=None, 
                                          min_impurity_decrease=0.0, 
                                          min_impurity_split=None, 
                                          class_weight=None, 
                                          presort=False)

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

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

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

inputs_train, inputs_test, labels_train, labels_test = train_test_split(inputs, labels)

tree_classifier = DecisionTreeClassifier()
tree_classifier.fit(inputs_train, labels_train)

# The testing data has not been fed to the estimator before
score = tree_classifier.score(inputs_test, labels_test)

Во время тренировки вы также можете представить фитинг EPOCH-WISE, используя что-то вроде входных данных. Складное имя – это необычное имя для разделения исходных данных, установленных в ряд подмножеств, и выводят точки обучения и тестирования данных от каждого:

from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeClassifier

tree_classifier = DecisionTreeClassifier()

for train_index test_index in KFold(n_splits=10, random_state=None, shuffle=False):
    X_train, Y_train = inputs.iloc[train_index], labels.iloc[train_index]
    X_test, Y_test = inputs.iloc[test_index], labels.iloc[test_index]

    tree_classifier.fit(inputs_train, labels_train)

    # This score relates to the particular subset only
    # You can yield it and average out the scores for all subsets
    # at then end. You can also fit each subset into a new tree.
    # When predicting the overall score, all trees need to be called,
    # and the results of their scores averaged out. 
    score = tree_classifier.score(inputs_test, labels_test)

Примечание на случайных лесах

Другой, возможно, даже лучший вариант – использовать случайные леса. Случайный лес представляет собой коллекцию деревьев, сгенерированные с использованием рандомизированных гиперпараметров (максимальная глубина, мин. Количество раскол, максимальное количество узлов листовых узлов и т. Д.). Когда происходят прогнозы, каждое дерево предлагается прогнозировать результат отдельно, а большинство голосов принимается:

Источник: Wikimedia.

Случайный лес обучен и тестирован в значительной степени так же, как одно дерево решений:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

# An important parameter here is the number of trees in the forest
tree_classifier = RandomForestClassifier(n_estimators=50)

# Cross-val-score combines folding, splitting, and scoring in one function
score = cross_val_score(tree_classifier, X=inputs, y=labels, cv=10).mean()

Независимо от того, как вы его подходите, когда-то обучался, классификатор может быть использован для прогнозирования результата будущего события, кормили его текущими данными ценообразования (, конечно, преобразованы в входные функции):

current_point_as_inputs = extract_inputs_from_data_frame(df.iloc[-1]))

# This call will return either `1` or `-1` (our labels)
end_class = tree_classifier.predict(current_point_as_inputs)

# This call will return an array of probabilities for each class to occur
class_probs = tree_classifier.predict_proba(current_point_as_inputs)
# class_probs => [0.23, 0,77]

Рендеринг выходов и планирования ежедневных обновлений

Сделав наш классификатор вывода решения, пришло время отображать его посетителям сайта. Поскольку вся эта операция читается из и размещена на GitHub, я использую магию Трэвис Чтобы извлечь и преобразовывать исторические данные, подайте его через классификатор дерева решений, и обратите внимание на вывод, используя статический генератор сайта для Python, называется Пеликан Отказ Трэвис поддерживает запланированные восстановление кукурузы определенного ветви, которые идеально подходят для моей цели. Итак, по сути, я делаю все это, используя в значительной степени, используя только работу короны, а какое-то дисковое пространство GitHub для хранения визуализированных выходов. Давайте поговорим о неверной архитектуре, пожалуйста? 😀.

Что в этом для меня?

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

Наслаждайтесь, и не стесняйтесь оставлять меня отзывы или поделиться словом на Twitter с друзьями.

ЗАМЕТКА: Этот пост появился первым в моем блоге Отказ

Оригинал: “https://dev.to/preslavrachev/introducing-my-new-pet-project-should-i-hodl-594j”