На Смарт-Лабе редко, поэтому тут напоминалка про
Spreads по мотивам этого
поста, который до меня даже через Фейсбук добрался, и не мог пройти мимо. Цифры — ответ на оригинальный пост. Мой комментарий странным образом изчез из оригинального поста, ниже его полная копия.
Сорри, гайз:
1 — история и реальная торговля — один код
2 — тайм-фреймы вообще нерелевантны, соединение серий идет по time stamp. Главное самим помнить, где он для свечек — в начале или конце, и использовать .Lag(1) где нужно
3 — событийная архитектура — это ад, однажды разобравшись в функциональных преобразованиях серий пути назад нет. Shared mutable state спрятан и совсем не shared.
4 — помимо стандартных проектов VS, можно писать в F#/C# interactive REPL
5 — higher-order преобразования серий (Window,ZipLag,Map,Scan,Filter,Repeat,ZipN) позволяют написать индикатор любой сложности в несколько строк кода и спрятать всю логику и состояние в лямбдах
6 — визуализация в Excel (через add-in) или FSharp.Charting или OxyPlot.
7 — это логика стратегий/системы, можно реализовать через структуры данных с несколькими timestamps — отправка, получение, биржа
8 — хранилище данных с сжатием 4+х и random access в сериям встроено, ZipN позволяет склеивать не только исторические серии, но и серии в реальном времени (например, считать индекс S&P500 по нерегулярным тикам). Обращаться к сериям можно из разных процессов, синхронизация идет через memory mapped files. Скорость как у TeaFiles, размер ФОРТС ордер лога всего на 20% больше, чем .qsh (QScalp) с Цериха, но дает random access к любому тику любого инструмента.
9 — WIP, код для walk forward давно написан, но не выложен. Как показала практика, оптимизация про среднему в эпсилон окрестности полным перебором через разумный шаг — самое быстрое и стабильное решение. Так как мы не знаем форму целевой функции и ее производные в общем случае, то всякие градиенты,
swarm-оптимизация и прочие методы нестабильны и нифига не быстрее (swarm у нас был заметно дольше, пока сходился). Любая НЕ walk-forward оптимизация почти бессмысленна и полезна разве что для первичной проверки где горячо-холодно.
10 — благодаря дизайну схемы данных у нас вообще нет различия между историческими и реальными данными, работа с ними всегда идет одинаково.
11 — трейдинг is out of scope & WIP. Трейдинг через close source системы (а не через прямой API) довольно стремное занятие для портфелей и сложных стратегий. Вместо отправок ордеров, мы формируем порфель желаемых позиций, посылаем его «умному трейдеру» (сервис), тот сравнивает их с текущими и приводит текущие к желаемым по умному алгоритму, например сохраняя бету порфеля и по очереди входя в лонг/шорт, одновременно проверяя риски, churn, health, etc. Возможно скоро будет выложен пример для
github.com/finsight/QuikSharp (самый быстрый и удобный коннектор к Квику на .NET, который тоже OPEN SOURCE и бесплатный).
Бонус:
* Off-heap memory mapped dictionary для доступа из разных процессов
* Интеграция с R
* OPEN SOURCE!
Простой пример стратегии, который при этом хорошо иллюстрирует логику работы с сериями (история + реальное время, индикаторы, торговля), тут: http://hotforknowledge.com/2015/12/29/how-to-write-the-simplest-trading-strategy-using-spreads/.
Spreads — OPEN SOURCE и БЕСПЛАТНОЕ решение. Это не готовая коробочка для трейдинга, а гибкий инструмент для complex event processing, на котором можно построить решения любой сложности. За $399 в месяц вас ждет индивидуальная поддержка, консультация по стратегиям и трейдингу, написание и оптимизация стратегий под ключ, 24/7 bug-fix, пожизненный доступ ко всем будущим версиям с дополнительным функционалом, тайский массаж, бесплатное пиво и прочие плюшки… (не является офертой, если нужно, контакты на ГитХабе ).
Ядро библиотеки стабильно и давно используется. В процессе разработка дополнительного функционала, например репликация по сети, красивые графики и т.д. Но так как это открытый код, мы принимаем pull requests :)
строго говоря, состояние находится в замыканиях, а не в лямбдах. Лямбда — это функция, в математическом смысле, у нее нет никакого состояния, это отображение. Честно говоря, достало уже все это передергивание понятий в этом вашем программировании. Все это идет от избытка сахара, ИМХО. Люди вообще перестают понимать, что у них в коде творится.
квик-коннектор это к локально запущенному квику или к серваку ихнему через инет?
портфель позиций вместо ордеров это хорошо конечно, но если я эти позиции желаю открывать лимитниками по определенным ценам, то тогда как?