Полный провал

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

Что это позволило мне сделать, так это возиться с нейронными сетями, начиная с Ruby Fann, затем перейдя на Encog, а затем на Keras, где я начал играть с более сложными моделями.

Я играл с двумя типами анализа:

  1. Перекачивание значений Технического индикатора в качестве временных шагов в слои LSTM и выполнение огромной оптимизации гиперпараметров.
  2. НЛП с использованием модифицированных версий моделей Keras IMDB LSTM, подключенных к подмножеству пожарного шланга Twitter.

Ни один из них не дал мне преимущества и на самом деле работал довольно плохо (до такой степени, что мне казалось, что мне нужен переключатель «делать полную противоположность прогнозу»)

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

Со временем я опубликую модели и код в открытом доступе, так как они могут кому-то пригодиться. Они довольно хакерские, так как обычно создавались на Tube или когда у меня было свободное время (которое сократилось с тех пор, как у нас родилось двое детей).

Естественный интерфейс к финансовым рынкам

Я работаю в Microsoft в команде Azure, занимаясь рабочими нагрузками с открытым исходным кодом для наших клиентов, и это означает, что я ежедневно экспериментирую с некоторыми действительно хорошими технологиями. Многое из этого связано с машинным обучением и масштабируемой инфраструктурой — двумя вещами, которыми я увлечен, и у меня есть опыт попыток взломать рынки.

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

Он будет связан с LUIS, WebApps для Linux, Docker, Azure Functions и CosmosDB, чтобы конечный пользователь мог общаться с ботом о финансовых инструментах.

Например, Майкрософт недооценен? или Какой инструмент с наибольшей доходностью в финансовом секторе за последние 2 недели? будут переведены в расчет Индекса относительной силы тикера MSFT и разбивки инструментов в финансовом секторе FTSE соответственно.

Это относительно просто, но полагается на интеграцию некоторых хороших облачных технологий.

Я сделаю все возможное, чтобы не привязывать код или реализацию конкретно к Azure, чтобы их можно было использовать повторно как можно проще, но для функций LUIS и Azure трудно отказаться от зависимости от продуктов Microsoft (хотя не стесняйтесь чтобы поднять PR, если вы хотите изменить код!)

Среда разработки

Первое, что мне нужно сделать, это настроить локальную среду разработки, для этого я буду использовать подсистему Windows для Linux. Я не буду вдаваться в подробности его настройки, так как Джек Хэммонс (менеджер программ для WSL) прекрасно собрал это для нас здесь https://msdn.microsoft.com/en-gb/commandline/wsl/install_guide.

Я буду вести локальную разработку на MongoDB с намерением перенести это в Azure Cosmos, в котором есть встроенная поддержка Mongo API и который предоставляет мне хороший глобально избыточный сервис (это тоже недорого, что мне нравится).

justin@MININT-SK0C811:~$ sudo apt-get install mongodb

И просто проверить, что мы можем подключиться, и создать базу данных Fluid

justin@MININT-SK0C811:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> use fluid
switched to db fluid
>

Хорошо, у нас все хорошо!

Я буду писать большую часть кода для Fluid на Python через VS Code, но с этого момента запускаю его под WSL. Но перед этим нам нужны данные для работы с

Данные

Одним из лучших мест для получения данных по рынкам (на законных основаниях) является Quandl. Они предоставляют набор данных на конец дня (EOD) для чуть более 3000 компаний США, которые я буду использовать для этого упражнения, которое вы можете найти здесь:

https://www.quandl.com/data/WIKI-Wiki-EOD-Stock-Prices

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

Перейдите на Quandl и зарегистрируйте учетную запись. Данные EOD можно использовать бесплатно.

Однако в нем отсутствуют какие-либо метаданные о компаниях, и для этого нам понадобятся некоторые данные из NASDAQ:

http://www.nasdaq.com/screening/companies-by-industry.aspx?exchange=NASDAQ&render=download

Это обеспечивает хороший объем метаданных, которые помогут нам, когда дело доходит до отображения удобных для пользователя ответов (таких как бегущая строка, название компании, сектор и отрасль среди прочего).

С обоими наборами данных мы стремимся достичь чего-то в этом родстве:

Импортируйте информацию о компании NASDAQ в Mongo/Cosmos.

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

Это позволит импортировать все данные из списка NASDAQ и поместить их в коллекцию «companies» в базе данных Fluid. Как только это будет выполнено, мне нужно проверить, что данные выглядят хорошо:

justin@MININT-SK0C811:~$ mongo fluid
MongoDB shell version: 2.6.10
connecting to: fluid
> db.companies.findOne()
{
 “_id” : ObjectId(“59354502e89b3a02fd053345”),
 “Sector” : “Finance”,
 “LastSale” : “7.8”,
 “Name” : “1347 Property Insurance Holdings, Inc.”,
 “” : “”,
 “Summary Quote” : “http://www.nasdaq.com/symbol/pih”,
 “Symbol" : “PIH”,
 “Industry” : “Property-Casualty Insurers”,
 “MarketCap” : “46462774.8”,
 “IPOyear” : “2014”,
 “ADR TSO” : “n/a”
}
> db.companies.find({“Symbol”:”MSFT”})
{ “_id” : ObjectId(“59354509e89b3a02fd053a9b”), “Sector” : “Technology”, “LastSale” : “71.7501”, “Name” : “Microsoft Corporation”, “” : “”, “Summary Quote” : “http://www.nasdaq.com/symbol/msft", “Symbol” : “MSFT”, “Industry” : “Computer Software: Prepackaged Software”, “MarketCap” : “553947704000.723”, “IPOyear” : “1986”, “ADR TSO” : “n/a” }
>

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

Импорт данных EOD из Quandl

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

Следует отметить еще несколько вещей: если вы используете этот код, обязательно получите ключ API Quandl из раскрывающегося списка «Настройки учетной записи» в своем профиле. Quandl ограничивает количество вызовов до 10 000 в день, что более чем достаточно для начальной загрузки данных.

Также кажется, что данные NASDAQ и данные Quandl не совпадают 1:1, а в некоторых случаях вообще не совпадают. После того, как произошел импорт свечей, есть довольно много компаний, у которых нет связанных с ними данных EOD. Это будет учтено в коде приложения, чтобы можно было запрашивать только компании с соответствующими свечами.

Следующие шаги

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