Pull to refresh

Эволюционирующие торгующие системы

Reading time 6 min
Views 6.3K
AI наступает, и мы этого не боимся. Предлагаю озадачить его зарабатыванием капусты на бирже. Для начала, а там посмотрим.

Термины


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

Актив агента — список счетов с наличием средств на них 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). Под хаотичные курсы крипты можно подстраиваться лишь в небольших пределах, но… использование этого подхода для торговли другими активами, чья волатильность не так хаотична и имеет периоды сезонности, может дать лучшие результаты.

Исходники полигона доступны здесь.
Tags:
Hubs:
+14
Comments 16
Comments Comments 16

Articles