Термины
Агент это программа, имеющая счета в различных валютах на одной бирже, работа которой должна вести к увеличению их совокупной стоимости.
Актив агента — список счетов с наличием средств на них A = [A1,A2,..] где A1, A2,… суммы в соответствующей валюте.
Стоимость актива. Мы должны иметь универсальное мерило актива, которое позволяет оценивать актив. Примем как данность что это $. A$ (счет) является частью актива. Также примем, что у нас есть алгоритм-возможность оценить стоимость каждого счета в списке через $.
Агент может быть закрытым (полагаться только на собственный актив) либо открытым (брать взаймы). Для простоты примем, что у нас закрытый.
Каждая операция агента имеет свою стоимость So(Ax->Ay, Sum) которую будем мерять нашим мерилом $ и временем To(Ax->Ay).
Окружение агента — другие агенты или люди с похожими или непохожими алгоритмами работы + любая действительная на этот момент информация.
Стратегия агента. Это алгоритм, который получает на вход информацию о состоянии счетов, историю активности биржи, свою активность, текущую активность биржи (стаканы), а в ответ совершает или не совершает набор действий.
Стратегии могут опираться только на текущую активность биржи (примитивные),
учитывать информацию с других бирж(средние), учитывать историю активности и обнаруженные статистические закономерности (глубокие). Пессимистические или оптимистические — отличаются в оценке риска операций. Частичные или полные. Полная стратегия покрывает все аспекты функционирования агента. Частичные могут комбинироваться для образования полной.
Оптимальность стратегий и их выбор. В норме агент имеет несколько стратегий, переключение между которыми происходит при некотором стабильном (больше некоторого интервала времени) изменении окружения.
Инертность агента — сколько времени агент игнорирует изменение окружения. Или стратегия, которая определяет его устойчивость к возмущениям окружения. Более инертный агент может как выиграть так и проиграть, не поддавшись “панике” окружения.
Допустим мы имеем три набора неполных стратегий:
St операции покупки = [1,2,3,4]
St операции продажи = [5,6,7,8]
St инертности = [9,10,11,12]
Сочетания этих стратегий дает 64 уникальных варианта поведения агента, которые
Оказываются правильными(полезными) для окружений [O1, O2,O3] и бесполезными для [O4,O5,O6] или вредными для [O7, ..]
Анализируя работу стратегий и их комбинаций в работе в различных окружениях
Мы можем построить метастратегию, которая будет переключать варианты поведения агента в зависимости от детектируемого в данный момент окружения.
Платформа агентов (далее платформа, MetaBot) представляет собой специфического агента, который создает, координирует, удаляет агентов на подключенных биржах. Также как и агент она архитектурно состоит из набора управляющих стратегий, которые могут комбинироваться для улучшения функционирования всей системы в целом. Платформа хранит историю всех операций и прочие полезные данные, позволяющие составляющим ее стратегиям эффективно (в $) управлять подчиненными агентами, анализируя общие статистические закономерности и историю влияния комбинаций стратегий на успех в конкретных окружениях. Платформа управляется метастратегией, чьи параметры эволюционируют во времени для достижения максимальной прибыли.
Окружение биржевого агента состоит из других агентов и действительной информации на данный момент. Изменения окружения для агента делятся на оптимальные, нормальные, критические, катастрофические и т.д. по степени успешности операций. Извещая платформу о своем состоянии и проводимых операциях, агент действует до тех пор, пока платформа ‘Удовлетворена’ состоянием и динамикой его счетов, иначе она его закрывает. Платформа иначе оценивает совокупные активы и может принимать решения о передачи актива от одного агента другому, которые могут работать на одной бирже или на разных. Задача платформы обеспечить максимизацию совокупного актива, находящегося у всех агентов.
Рассмотрим содержимое простой реализации стратегии агента (на Scala) для обработки Orderbook биржи:
//минимальный период между операциями
var minDelayBetweenOperationsSec: Long
//возможна ли операция сообразно параметрам стратегии
//возвращает 0, если операция нецелесообразна или > 0 если покупка актива имеет смысл //или < 0 если продажа актива имеет смысл
def action(rateVolume: TimeRate): Double
//наблюдаемые тренды для разных периодов
def middleValues() : Seq[Double]
Привнесем в это геном, который будет развиваться в процессе работы системы.
StrategyParams это геном стратегии бота, содержащий множество Gene для параметризации стратегии:
case class StrategyParams(low: IntGene, middle: IntGene, high: IntGene, intense: DoubleGene, threshold: DoubleGene, delay: IntGene)
где low, middle, high являются периодaми в минутах для усредненных по нему стоимостей актива.
Они используются для предсказания движения стоимости.
Intense означает активность или агрессивность бота. С большими значениями параметра бот делает сделки на большие суммы и(или) оценивает предсказания с большим оптимизмом.
Threshold означает минимальную уверенность бота в предсказании, которая побуждает его совершить операцию. Delay — инертность, минимальное время между активациями.
Постулируется, что существует оптимальная стратегия бота на любой период, описанная StrategyParams параметрами, которые можно вычислить по истории движения курса актива. Ее параметры можно вычислить, используя эволюционный алгоритм отбора геномов. Вычисление имеет вид:
def evalBots(trs: Seq[TimeRate]) = EvolutionFactory(
candidate = defaultBotStrategyParams,
populationConfig = PopulationConfig(500),
evolutionConfig = EvolutionConfig(100),
errorRate = (c: StrategyParams) => {errorBot(c, trs)}
).
trs — история Orderbook,
populationConfig — сколько одновременно ботов конкурируют за выживание между собой, evolutionConfig — сколько итераций жизни и размножения нужно сделать. В процессе итераций, боты имеющию меньше активов с меньшей вероятностью дают потомство с другими ботами, что в конечном итоге при достаточно большой популяции и количестве перерождений-эволюций должно привести нас к идеальному боту (ботам).
Получив-рассчитав такого бота(ов) для известного периода (истории), нужно как-то использовать его для эффективной торговли в будущем. Платформа-Metabot и ее MetaStrategy займется этим вопросом.
Рассмотрим содержимое простой реализации стратегии платформы:
MetaStrategy(rateSensitivity: DoubleGene, volumeSensitivity: DoubleGene, profitSensitivity: DoubleGene, criticalForce: DoubleGene, volumesSize: IntGene, delaySwitching: IntGene)
где rateSensitivity, volumeSensitivity, profitSensitivity описывают насколько поведение Платформы чувствительно к изменению параметров цены актива, объема торгов, и снижению ожидаемой прибыли от операций.
criticalForce устанавливает пороговое значение, основанное на комплексной оценке вышеозначенных параметров, превышение которого является сигналом неэффективности текущей стратегии бота (не платформы) и вычисления еe(текущей стратегии бота) более удачной версии.
Фрагмент реализации:
val force = rateForce * volumeForce * profitForce
if (force >= strategy.criticalForce.value.get)
changeBot(force / strategy.criticalForce.value.get, extremeBot, tr)
Описав алгоритм стратегии платформы, использующий параметры MetaStrategy, мы можем запустить аналогичный эволюционный процесс для выращивания популяции эффективных метаботов-платформ, самый эффективный из которых станет основой торговой системы.
Для проверки эффективности этих идей был создан прототип торговой системы по криптовалюте, который можно использовать как испытатательный полигон. Для работы полигона требуются данные по истории курсов и их средних по периодам значений, которые хранятся в Influx и генерируются самим полигоном путем вытяжки через открытый API биржи bitfinex. См. object HistoryExtractor.
Результаты испытаний
В процессе прогонов удалось найти некоторые простые стратегии для агентов, которые без использования управляющего Metabot показывали 14% прибыли в год для тестовой 2.5 лет истории. Хотя и впечатляет, это не гарантируют те же проценты на будущих периодах. Поведение системы в реал тайм не испытывалось. Использование Metabot стратегий, рассчитанных на коротких периодах (месяц и менее) не давало прибыли, но для больших периодов вполне возможны эффективные мета-стратегии. Их расчет был затруднен ввиду большой вычислительной сложности (месяцы бесперебойной работы среднего PC). Под хаотичные курсы крипты можно подстраиваться лишь в небольших пределах, но… использование этого подхода для торговли другими активами, чья волатильность не так хаотична и имеет периоды сезонности, может дать лучшие результаты.
Исходники полигона доступны здесь.
Комментарии (16)
thatsme
12.08.2019 21:01Как-то тут на хабре, было вот это .
В принципе чем не база для HFT? Исторические данные за год или несколько будут только во вред. И при каждом невыгодном ходе, генерировать новое поколение, и прогонять на предыдущих данных в окне месяц. Ну или не месяц, но окно должно плыть по графику, и не слишком много исторических данных в себя включать.
george3 Автор
12.08.2019 21:22>>thatsme
1. Это не HFT ни разу. Исторические данные и результат по ним — единственный критерий истинности. Нейросети не позволяют работать с динамическими моделями, неограниченными во времени (без потерь в точности). только пальцем в небо гадать. LSTM к примеру, как и любые другие подобные имеют фиксированную глубину. Для генетических алгоритмов с этим все ок. 2. Экстремально — оптимальное значение стратегии бота считается довольно быстро (секунды) если речь идет о диапазоне 0..2000 минут. А смена стратегий бота происходит условно в 5..400 минут (это эволюционный параметр метастратетии метабота). Никаких затыков с производительностью быть тут не может.thatsme
12.08.2019 21:50Ну я разве против исторических данных вообще? Просто их избыток особенно учитывая изгибы рынка крипто-трейдинга, как мне кажется, может только навредить. Поэтому и предлагаю slide-window спроецированное на предыдущий достаточно короткий сегмент времени.До тех пор пока бот на этом slide-window не научится проходить без ошибки (а slide-window, и реал-тайм данные включает), он просто учится, как только появилось поколение которое держится на трассе с хорошей прибылью, то можно включать HFT. T.e. flappy-bird это и есть HFT, если бот уже обучен. Ну не знает он математики и стратегий, но торговать в real-time по идее должен с большим или меньшим успехом.
george3 Автор
12.08.2019 22:34Поэтому и предлагаю slide-window спроецированное на предыдущий достаточно короткий сегмент времени.
Так и есть. Экстремально — оптимальное значение стратегии бота считается за короткий период == strategy.delaySwitching metabota. HFT это вообще ни о чем по моему мнению. на крипте 100%.thatsme
12.08.2019 23:37> HFT это вообще ни о чем по моему мнению. на крипте 100%.
Странно, но целая куча контор даже на крипте работают с HFT, и как-бы HFT рынком уже давно манипулирует, и против HFT вводят всякие правила (не явные, а чтоб затруднить, типа длительность размещения бида, до отмены и т.п.). Биржам-то HFT максимум дохода приносит, так-что они не против.george3 Автор
13.08.2019 07:00Зарабатывать и втирать очки людям — сильно разные вещи. Имхо HFT может работать только там где колебания курсов мизерные вокруг одной константы при больших сделках. Классические биржи. Там эта система покажет совсем другую картину в прибыли и стратегии. На криптобиржах правила эти вводятся не против HFT а против манипуляции курсом, когда ставятся куча мизерных бид/ask которые создают иллюзию движения курса. ну и нагрузку на биржу эти манипуляторы создают недетскую. Но… я не большой спец в биржах. Прошу отнестись к этому с пониманием)
savostin
13.08.2019 11:03А не подскажите где на графиках видно 14%
george3 Автор
13.08.2019 12:58Зеленая линия — это график роста совокупного актива простого агента. В программе это class BotStrategyMix.
Рассчитать таких агентов можно так: дробим историю на диапазоны по X дней. считаем по ним
val extremeBotX = new BotStrategyMix(BotStrategy.optimalStrategy4(timeHistoryRates))
далее полученных агентов прогоняем по всей истории и выбираем того, который дает 14%.
см. например BotsStrategiesCalculator.calcMapBestStrategies как исходную точку
algotrader2013
14.08.2019 23:49Сложная тема… статистически значимого датасета для не HFT стратегий не получишь.
А для HFT велико влияние обратной связи от агентов, о которых мы понятия не имеем, как они работают, и не можем их промоделировать.
george3 Автор
15.08.2019 04:13статистически значимого датасета для не HFT стратегий не получишь.
Это история, которую можно копить самому либо запросив ее через API бирж с минутным разрешением. No problem at all.
А для HFT велико влияние обратной..
HTF для крипты смысла не имеет. Проверено в другой системе.
rboots
Как «пишутся» боты для биржи:
— взять 1000 случайных стратегий
— прогнать на исторических данных
— около 500 стратегий покажут прибыль
— взять лучшего бота и бегать по инвесторам, предлагая прибыль 347% в год
И никто никогда не задумывается оценкой статистической значимости, методикой постановки эксперимента и другими базовыми в любом другом исследовании вещами.
george3 Автор
Это явно не ко мне.)) См. раздел «Результаты испытаний»
Стратегии случайны только вначале. Потом лезут по градиенту.
Как и написал 14%. На крипте. При чем тут я) Но спасибо за внимание)
SemenPV
Если бы были универсальные долговременные выйгрышные стратегии с доходностью выше среднерыночной, то к данному моменту все акции в мире принадлежали бы этому человеку.
Слышал что это ожидается и идёт мониторинг подобного сценария.
zzzNIKITAzzz
Как по мне вы слишком серьезно относитесь к этой публикации, я думаю автор и не претендует на «власть и богатство во всем мире», а просто показывает свой опыт совокупления эволюционок с валютными биржами.
Да и сам материал сам по себе достаточно любопытный, но я бы хотел больше теоретической части видеть, потому может сам тоже попробую подобным заняться (а почему бы и не да?) и результатом поделиться с сообществом тоже.