Обо мне

Меня зовут Майк Стюарт, и я - своего рода ходячий стереотип. Я белый чувак поздно 20, который получил пару дипломов в традиционной области STEM, которая просто не чувствовала… того стоила. Это не из-за отсутствия любви к лабораторным наукам, я детально разбираюсь в гранулоцитах вместе с лучшими из них, но, оглядываясь вокруг, я обнаружил, что было так много препятствий: степени, звания, академическая родословная, траектории грантов. Казалось, что половина профессиональной битвы только что подошла к моменту, когда можно было делать то, что действительно находило интересным, если NIH тоже считал это интересным.

Итак, по прихоти, имея за спиной изрядную плату за обучение, я записался в Северо-западный учебный лагерь по наукам о данных, работая в лаборатории. Эй, мой брат был инженером-программистом, и он определенно сделал больше, чем я, и мы могли абстрагироваться от архитектуры программного обеспечения, и я чувствовал, что не совсем заблудился. Ради скидки, почему бы не окунуться в бассейн?

Как на CourseReports или на любом другом сайте с обзорами вам скажут, Bootcamp не подходят для того, чтобы намочить пальцы ног. Они больше для того, чтобы бросить вас в бассейн. Вот только бассейн довольно мелкий. Кроме того, если вам нужна работа, вы не будете плавать в бассейне, вы будете нырять в океане. Если отбросить посредственные метафоры, он очень быстро охватил многое. Он касался вещей, которые были удобными, а не оптимальными (ORM против хорошего дизайна базы данных; Keras вместо TensorFlow и т. Д.). Но я прошел через это, и все же я все еще не чувствовал, что столкнулся с проблемой, особенно в том, что делает науку о данных ... наукой о данных. Крупномасштабные данные тестируются в среде, где нет «правильного ответа», нет «единственного верного пути».

Поэтому, когда меня приняли в Программу наставничества ChiPy, я был очень взволнован, что меня встретил замечательный наставник, у которого был статистический опыт и который работал моделированием в Jordan Howes Nelson! Но я же скучная часть, поговорим об идее проекта.

О проекте

AutoAlpha родилась из моего желания делать больше в моделировании, чего не охватил мой буткемп. Конечно, мы импортировали Keras и использовали некоторые сделанные, например, наборы данных, но мы не получили никаких неопределенных данных, ничего беспорядочного. Я хотел что-то, что имело бы ощущение нулевой ступени входа, но могло бы масштабироваться намного дальше. С этой целью я хотел свести к минимуму то, что мешало такому количеству проектов Bootcamp: ETL. В реальном мире я понимаю, что это половина дела, но я хотел действовать быстро. Пожалуй, нет более чистого и надежного набора данных, чем данные о запасах. Если этого достаточно для миллиардеров, то и для меня! К счастью для меня, от IEX есть отличная бесплатная общедоступная конечная точка в Интернете, с которой вы можете легко получать ежедневные данные о запасах за 5 лет. Большой! Чистый, готовый, даже с некоторыми включенными данными временных рядов.

Понятно, что мне нужно было где-то хранить эти данные. Как бы хорошо ни было, что IEX делает свои данные свободно доступными, никто не хочет, чтобы какое-то приложение забивало их конечную точку для статических данных. Скажем, эта штука становится все более сложной, и мое приложение может попасть в черный список. Итак, нам нужно найти место для хранения данных. Чуть позже я займусь базами данных подробнее ...

Хорошо, у меня есть данные, что мне теперь делать? Кто угодно может нанести на график данные о запасах, SMA и данные о запасах. Обычно IEX создан для этого, но все это выглядело как работа. И компьютеры предназначены не для выполнения работы, а для машин, выполняющих работу за нас. Я видел много блогов Bootcamper о прогнозировании временных рядов по криптовалютам, акциям и т. Д., Но это всегда было одномерным. Я изучаю этот инструмент, поэтому вот как он предсказал эту вещь. Конец истории. Публиковать. Переходим к следующему модулю Keras.

Что ж, разве на фондовом рынке не только конкуренция? Разве не торгует ради принятия лучших решений, чем парень рядом с вами? Итак, если бы я хотел, чтобы машины предсказывали цены на акции, что было бы более подходящим, чем демонстрация не только того, как машины прогнозируют временные ряды, но и того, как разные модели работают лучше или хуже, и визуализировать это значимым образом. AutoAlpha - это кульминация одновременного анализа, обучения, прогнозирования, соревнования и визуализации. Самое приятное: если я сделаю только одну модель, которая будет успешной, я создам другую модель прогнозирования временных рядов и хорошо ее визуализирую! В лучшем случае я позволю другим участникам буткемпинга увидеть на едином наборе данных, как по-разному ведут себя модели, и попытаться объяснить, почему это так.

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

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

Зная, что данные о запасах, которые я буду собирать, будут интегрированы в форму JSON, я сразу же вспомнил о моем наборе инструментов Bootcamp с MongoDB. Ну, конечно, мы узнали о Mongo как о нашем решении NoSQL, но все, что я читал об этом, просто разрушило его. Ну зачем они этому учили, если это так плохо? Ответ - масштаб, скорость и простота. Вы можете добавить туда JSON, и это позволит участникам Bootcampers почувствовать, что они знают NoSQL. Проведите 5 секунд в Google, и вы поймете, что когда дело доходит до более сложных вещей, все не так просто. Но хорошо, я не хотел использовать реляционную базу данных, и я знал Mongo, поэтому я начал копаться и нашел Apache Cassandra. Первоначально разработанная Facebook, Cassandra была с открытым кодом, а коммерческое решение было создано DataStax. DataStax сделал действительно удобный метод установки .msi для моей среды разработки Windows и предоставил панель графического интерфейса, чтобы я мог видеть, что происходит, не открывая отдельное окно оболочки.

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

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

Мантра Кассандры - ее отказоустойчивость, и это не всегда верно, но в конечном итоге верно. Частично это достигается путем достижения консенсуса между узлами. Что касается моего проекта, то это перебор. Я управляю одним узлом. Но, допустим, мне нужно, чтобы моя программа работала со всеми индексами в мире, получая данные в реальном времени и выполняя их асинхронно. Я не могу дождаться, пока узел Токио свяжется с узлом Нью-Йорка, а модель NYSE не требует данных NI225. То же самое верно и для Facebook, поскольку он масштабировался по всему миру, поэтому они и разработали его!

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

Хорошо, это все хорошие фоновые материалы, но как они мне помогли? А это Java, так где же здесь Python? Что ж, DataStax поддерживает отличный драйвер Python, который позволяет пользователям, не использующим JVM, тоже получать удовольствие. Конечно, CQL было довольно просто добавить в CQLsh, но за 5 лет у меня было 505 компаний (у S & P505 просто нет такого же кольца). Я не хотел этого делать, я хотел, чтобы Python сделал это за меня.

Самая большая проблема, и это то, что сжигает много новичков / новичков, - это избегать соблазна скопировать слишком много из руководств по началу работы. Я потратил как минимум 2 часа на поиск ошибки атрибуции, потому что объект Column обрабатывался как объект ResultSet, и забавно простое решение заключалось в том, что я не импортировал класс Column. Но в примере этого не произошло - просто не проходит проверки, когда что-то не работает. Ниже приведены соответствующие фрагменты кода:

def GetAndReturnJSON(ticker):
    '''This function accepts a string corresponding to a stock ticker'''
    #Build out the url string from the ticker for 5 year history
    url = "https://api.iextrading.com/1.0/stock/"+ticker+"/chart/5y"
    session = requests.Session()
    response = session.get(url)
    return response.json()
def InsertStockData(ticker,JSON):
    #This may be an atrocious way to do this, but in the exploratory phase
    # I'm willing to define the model within the function for right now
    class SP500(Model):
        id = columns.UUID(primary_key=True)
        ticker = columns.Text() #This one will not be returned by IEX, but will be populated while iterating
        change = columns.Float()
        changeOverTime = columns.Double()
        changePercent = columns.Float()
        close = columns.Float()
        date = columns.Text() #The IEX returns it as a date string, which would need to be processed later
        high = columns.Float()
        label = columns.Text()
        low = columns.Float()
        open = columns.Float()
        unadjustedVolume = columns.BigInt()
        volume = columns.BigInt()
        vwap = columsn.Float()
    sync_table(SP500)
    daily_stock = SP500(ticker=ticker,
         change=JSON.change,
         changeOverTime=JSON.changeOverTime,
         changePercent=JSON.changePercent,
         close=JSON.close,
         date=JSON.date,
         high=JSON.high,
         label=JSON.label,
         low=JSON.low,
         open=JSON.open,
         unadjustedVolume=JSON.unadjustedVolume,
         volume=JSON.volume,
         vwap=JSON.vwap)
    daily_stock.save()
    return
jsontest = GetAndReturnJSON('AAPL')[0]
InsertStockData('AAPL',jsontest)

Так что это достаточно просто, правда? В конце концов, документы выглядели так:

#first, define a model
class ExampleModel(Model):
    example_id      = columns.UUID(primary_key=True, default=uuid.uuid4)
    example_type    = columns.Integer(index=True)
    created_at      = columns.DateTime()
    description     = columns.Text(required=False)

Но потом меня осенило:

AttributeError: ResultSet object has no attribute 'UUID'. You're probably treating a list of items like a single item. Did you call find_all() when you meant to call find()?

Почему бы ему не вернуть объект NoneType ?! Один импорт позже, и вдруг в DevCenter появляются таблицы! Вуаля!

Это было достаточно легко настроить, но, подумав, я задаюсь вопросом, была бы РСУБД быстрее. Очевидно, что программа наставничества - это обучение, но хорошее программирование - это оценка затрат и выгод. На данный момент я думаю, что Cassandra для AutoAlpha склоняет чашу весов в сторону большей стоимости, чем пользы, но обучение работе с ней, я думаю, принесет дивиденды, если я когда-нибудь закончу работать с такой системой профессионально.

Что дальше?

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

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

Последним шагом будет то, как это визуализировать. Возможно, простое сопоставление относительной доходности фонда с SPX или SPY дало бы некоторое представление о том, могут ли математические модели генерировать альфу или было бы лучше просто купить индекс? Я больше всего знаком с Flask, поэтому надеюсь, что в конечном итоге мне удастся быстро создать веб-сайт, используя D3.js или Plotly.js для визуализации.

Большая, огромная, чрезмерно амбициозная цель? Несколько моделей. Множественные индексы. С приложением, живущим в сети, а не на моем рабочем столе, извлекая собственную информацию и постоянно ее уточняя. Если вам интересно, ознакомьтесь с исследовательским JupyterNotebook в моем Github, который постепенно превратится в настоящее полнофункциональное приложение Python!