Предисловие
Зачем изучать этот курс?
Что вы получили от изучения этого курса? Прежде всего, этот курс основан на языках программирования JavaScript и Python. Язык — это всего лишь технология, и в конечном итоге нам еще предстоит применить эту технологию к отрасли. Количественная торговля — это новая отрасль, которая в настоящее время находится на этапе быстрого развития и испытывает огромный спрос на таланты.
Благодаря систематическому изучению этого курса вы сможете глубже понять область количественной торговли. Если вы студент, который готовится войти в область количественной торговли, он также будет вам полезен. Если вы биржевой или энтузиаст фьючерсных инвестиций, то количественная торговля может полностью помочь вашей субъективной торговле. Разрабатывая торговые стратегии, вы можете получать прибыль на финансовом рынке и расширять свои инвестиционные и финансовые каналы управления и платформы.
Прежде чем это сделать, позвольте мне рассказать о моем личном опыте торговли. Я не финансист, а статистик. Он начал заниматься субъективной торговлей акциями, когда был студентом. Позже, по воле случая, он стал практикующим специалистом по количественной торговле в отечественном частном инвестиционном фонде, в основном занимаясь стратегическими исследованиями и разработками.
Я работаю в сфере трейдинга уже более десяти лет и разработал различные типы стратегий. Моя инвестиционная философия такова: контроль рисков превыше всего, ориентация на абсолютную доходность. Название нашего курса: От количественной торговли к управлению активами — разработка стратегии CTA для получения абсолютной доходности.
1. Логика зарабатывания денег с помощью стратегий фьючерсного CTA
1.1 Понимание призыва к действию Futures
Некоторые люди могут спросить: «Что такое CTA?» Что именно такое CTA? За рубежом CTA называют консультантом по торговле сырьевыми товарами, а в стране его обычно называют инвестиционным менеджером. Традиционные CTA объединяют средства большого числа инвесторов, затем доверяют их профессиональным инвестиционным институтам и, наконец, инвестируют во фьючерсы на фондовые индексы, товарные фьючерсы и фьючерсы на казначейские облигации через торговых консультантов (то есть CTA).
Но на самом деле, поскольку мировой рынок фьючерсов продолжает расти и развиваться, концепция CTA также постоянно расширяется, и ее сфера применения значительно превосходит традиционные фьючерсы. Он может инвестировать не только в фьючерсный рынок, но и в рынок процентных ставок, фондовый рынок, валютный рынок, рынок опционов и т. д. Пока этот продукт имеет определенный объем исторических данных, соответствующая стратегия CTA может быть разработаны на основе этих исторических данных.
До 1980-х годов технология электронной торговли была не очень развита. В то время большинство трейдеров оценивали будущую тенденцию товарных фьючерсов, вручную рисуя технические индикаторы, такие как индикаторы Уильямса, KDJ, RSI, MACD, CCI и т. д. Позднее некоторые трейдеры создали специальные фонды CTA, чтобы помочь клиентам управлять активами. Фонды CTA в истинном смысле начали появляться только с популяризацией электронной торговли в 1980-х годах.
Изменения в шкале управления фондом CTA

Единица: Миллиарды долларов США
Если взглянуть на представленную выше диаграмму, особенно с ростом количественной торговли, размер глобальных фондов CTA увеличился со 130,6 млрд долларов США в 2005 году до более чем 300 млрд долларов США в 2015 году. Кроме того, стратегия CTA также стала одной из наиболее распространенных инвестиционных стратегий мировых хедж-фондов.
Эффективность фондов CTA также возросла вместе с их масштабом. Давайте взглянем на индекс Barlake CTA на рисунке ниже. Индекс Barlake CTA является репрезентативным отраслевым эталоном для глобальных консультантов по торговле сырьевыми товарами. С конца 1979 года по конец 2016 года совокупная доходность индекса фонда Barlake CTA достигала 28,95%, при годовой доходности 9,59%, коэффициенте Шарпа 0,37 и максимальной просадке 15,66%.
Потому что в портфеле распределения активов стратегии CTA обычно имеют крайне низкую корреляцию с другими стратегиями. Как показано в красном круге на рисунке ниже, во время мирового медвежьего рынка акций с 2000 по 2002 год и мирового кризиса субстандартного ипотечного кредитования в 2008 году индекс Barlake CTA Fund не только не упал, но и достиг положительной доходности. Когда кризисы происходят в на рынках акций и облигаций CTA может обеспечить высокие доходы. Кроме того, мы также видим, что уровень прибыли индекса Barclays Commodity CTA с 1980 года всегда был выше, чем у S&P 500, а его просадка также намного ниже, чем у S&P 500.
Развитие CTA в моей стране началось только в последнее десятилетие, но импульс очень сильный. Это в основном из-за относительно открытой торговой среды внутренних товарных фьючерсов, низкого порога торгового капитала, маржинальной системы, которая позволяет длинные и короткие два -way торговля и низкие комиссии за транзакции. Техническая архитектура биржи более продвинута, чем у акций, и в системе легче торговать и т. д.
С 2010 года фонды CTA в основном существуют в форме фондов прямых инвестиций. Поскольку внутренняя политика постепенно открывает инвестиционный охват специальных счетов фондов, фонды CTA начинают существовать в форме специальных счетов фондов. Их более прозрачные и открытые методы работы также стали необходимым инструментом для распределения активов для большего числа инвесторов.
Как показано на рисунке выше, с точки зрения сложности начала работы, порогового значения капитала, метода исполнения торговой стратегии и стыковки API стратегия CTA также больше подходит для индивидуальных трейдеров, чем другие торговые стратегии. Внутренние фьючерсные контракты очень малы. Например, один лот кукурузы или соевого шрота можно продать за несколько тысяч юаней, практически без порога капитала. Кроме того, поскольку некоторые стратегии CTA исходят из традиционного технического анализа, это относительно легко по сравнению к другим стратегиям.
Процесс проектирования стратегии CTA также относительно прост. Сначала исторические данные предварительно обрабатываются, а затем вводятся в количественную модель. Количественная модель включает торговые стратегии, сформированные математическим моделированием, программным дизайном и другими инструментами, и генерирует торговые сигналы путем расчета и анализ этих данных. Конечно, в реальной разработке это не так просто, как показано на картинке выше. Это просто для того, чтобы дать всем общую концепцию.
1.2 Типы стратегий фьючерсного CTA
С точки зрения торговых стратегий стратегии CTA также разнообразны: они могут быть трендовыми стратегиями или арбитражными стратегиями; они могут быть средне- и долгосрочными стратегиями в больших циклах или краткосрочными стратегиями в пределах дня; логика стратегии может быть основана на Технический анализ или фундаментальные основы. Поверхностный анализ; это может быть субъективная торговля или систематическая торговля.
Существуют различные методы классификации стратегий CTA. По методу торговли их можно разделить на: субъективную торговлю и систематическую торговлю. Развитие стратегий CTA за рубежом относительно продвинулось, и стратегия CTA систематической торговли достигла почти 100%. По методу анализа его можно разделить на: фундаментальный анализ и технический анализ. По источнику дохода ее можно разделить на: трендовую торговлю и свинг-трейдинг.
В целом на всем торговом рынке трендовые стратегии составляют около 70% стратегий CTA, стратегии возврата к среднему — около 25%, а контртрендовые или разворотные стратегии — около 5%. Среди них трендовую стратегию, которая составляет наибольшую долю, можно разделить на: высокочастотную торговлю, внутридневную торговлю, средне-краткосрочную торговлю и средне-долгосрочную торговлю в зависимости от периода удержания позиции.
Стратегия высокочастотного маркет-мейкинга
В настоящее время на рынке представлены две основные стратегии высокочастотной торговли: стратегия высокочастотного маркет-мейкинга и стратегия высокочастотного арбитража. Стратегия маркет-мейкинга заключается в обеспечении ликвидности на торговом рынке. То есть, на торговом рынке с маркет-мейкерами, если кто-то хочет купить или продать, маркет-мейкер должен обеспечить, чтобы его приказ мог быть выполнен. Если на рынке недостаточно ликвидности и ордер не может быть исполнен, маркет-мейкер должен покупать и продавать чужие контрагенты.
Высокочастотные арбитражные стратегии
Высокочастотный арбитраж — это торговля двумя сильно коррелированными акциями или ETF и комбинациями ETF. Основываясь на методе расчета ETF, тот же метод можно использовать для расчета ожидаемой цены ETF. Цена индекса ETF может быть вычтена из ожидаемой цены ETF, чтобы получить разницу в цене. Обычно эта разница в цене будет действовать в пределах ценового канала. Если разница в цене прорвется через верхний и нижний каналы, вы можете торговать этой разницей в цене и ждать чтобы вернуть разницу в цене и получить от нее прибыль.
Внутридневные стратегии
Если следовать буквальному значению, то до тех пор, пока позиции не переносятся на следующий день, это можно назвать стратегией дневной торговли. Поскольку период удержания позиции при внутридневной торговле обычно относительно короткий, после входа на рынок невозможно получить прибыль немедленно, и рынок быстро покидают. Таким образом, этот метод торговли несет меньший рыночный риск. Однако поскольку рынок быстро меняется за короткий промежуток времени, внутридневные стратегии обычно предъявляют более высокие требования к трейдерам.
Среднесрочные и долгосрочные стратегии
Теоретически, чем дольше период удержания, тем больше емкость стратегии и тем ниже соотношение риска и доходности. Особенно в институциональных транзакциях, поскольку возможности краткосрочных стратегий ограничены, а крупные фонды не могут войти на рынок и выйти с него за короткий период времени, будет выделяться больше средне- и долгосрочных стратегий. Обычно период удержания составляет несколько дней, месяцев или даже дольше.
Данные стратегии CTA
В целом, стратегии CTA используют минутные, часовые и дневные данные в качестве объектов исследования, включая цену открытия, максимальную цену, минимальную цену, цену закрытия, объем торгов и т. д. Только небольшое количество стратегий CTA используют тиковые данные. Например, в- глубинные данные, такие как цена покупки, цена продажи, объем покупки, объем продажи и т. д. в данных L2.
Когда речь заходит об основных идеях стратегий CTA, первое, что приходит на ум, — это традиционные технические индикаторы, поскольку общедоступных справочных материалов по этому поводу больше, логика обычно проще, и большинство из них основано на статистических принципах. Например, различные технические индикаторы, с которыми все знакомы: MA, SMA, EMA, MACD, KDJ, RSI, BOLL, W&R, DMI, ATR, SAR, BIAS, OBV и так далее.
На рынке также есть несколько классических торговых моделей, которые можно использовать в качестве справочных и улучшаемых, в том числе: комбинация нескольких скользящих средних, DualThrust, R-Breaker, метод торговли Turtle, метод торговли Grid и т. д.
Все вышеперечисленное является торговыми стратегиями, основанными на традиционном техническом анализе. Процесс заключается в извлечении факторов или условий покупки и продажи с вероятностными преимуществами на основе исторических данных и правильных торговых концепций, и предположении, что рынок продолжит иметь эту модель в будущем . Наконец, используйте код, реализуйте торговые стратегии и полностью автоматизируйте свою торговлю. Открытие позиции, фиксация прибыли, остановка убытков, добавление позиций, сокращение позиций и т. д. — все это, как правило, не требует вмешательства человека. По сути, это стратегия покупки по высокой цене и продажи по низкой цене с использованием положительного коэффициента автокорреляции временного ряда цен.
Самым большим преимуществом стратегии CTA является то, что она может обеспечить абсолютную прибыль независимо от того, растет или падает текущий рынок, особенно когда рынок быстро меняется между бычьим и медвежьим рынками или когда рыночный тренд очевидно плавный. Преимущество эта стратегия очень большая. Короче, есть тенденция. В прибыли есть. Однако если рынок находится в нестабильном состоянии или тренд неочевиден, эта стратегия может привести к покупке на максимумах и продаже на минимумах, постоянному движению вперед и назад для остановки потерь.
1.3 Принципы прибыли фьючерсных стратегий CTA
Причина, по которой стратегии фьючерсного CTA могут приносить прибыль, в основном заключается в следующем:
- Ценовые движения носят рефлексивный характер и всегда продолжаются в форме тренда. Когда инвесторы видят рост цен, они скупают их, что приводит к дальнейшему росту цен. То же самое касается и падения цен. Поскольку инвесторы ведут себя более нерационально, иногда мы видим, что цены растут до ненормального уровня, когда они растут, и падают до ненормального уровня, когда они падают.
- Каждый инвестор имеет асимметричную толерантность к соотношению прибыли и убытков, а также различную толерантность к риску. Большинство розничных инвесторов предпочитают выбирать более консервативный метод торговли, основанный на следовании за трендом, поскольку рынок с большей вероятностью будет двигаться в тренде.
- Формирование цен определяется транзакциями, а транзакциями управляют люди. Однако человеческую природу трудно изменить, поэтому фиксированные модели появляются неоднократно. Стратегия эффективна при бэктестинге на исторических данных. Это указывает на то, что она может быть эффективной в будущем.
Еще одной характеристикой торговли по тренду является то, что вы теряете небольшую сумму денег, когда рынка нет, и зарабатываете много денег, когда рынок появляется. Однако каждый, кто занимался торговлей, знает, что рынок находится в нестабильном состоянии большую часть времени. времени, и только в небольшой промежуток времени это становится тенденцией. Цитаты. Таким образом, стратегия следования за трендом имеет более низкий процент выигрышей при торговле, но в целом прибыль и убыток по каждой сделке относительно велики.
Поскольку стратегии следования за трендом имеют нестабильную доходность, многие инвестиционные институты формируют инвестиционный портфель, используя несколько разновидностей и несколько стратегий, которые также будут включать определенное количество стратегий разворота. Стратегия разворота заключается в том, что временной ряд цен имеет отрицательный коэффициент автокорреляции, что означает продажу по высокой цене и покупку по низкой цене.
Корреляция между CTA и традиционными активами

Если взглянуть на график выше, то теоретически, сталкиваясь с различными изменениями рыночных цен одновременно, несколько стратегий с разными стилями или низкой корреляцией будут генерировать торговые сигналы, которые иногда будут одинаковыми, а иногда разными. Поскольку несколько кривых доходности накладываются друг на друга, общие доходности дополняют друг друга, и кривая доходности становится более пологой, тем самым снижая волатильность доходности.
Из вышеизложенного можно сделать вывод, что вместо разработки стратегии уровня мастера лучше разработать несколько посредственных подстратегий. Так как же контролировать эти стратегии? Здесь мы можем обратиться к алгоритму случайного леса в машинном обучении. Случайный лес — это не независимый алгоритм, это структура принятия решений, которая включает в себя несколько деревьев решений. Она эквивалентна родительской стратегии, расположенной над подстратегией дерева решений. Организуйте и контролируйте кластеры дочерних политик с помощью родительских политик.
Далее нам нужно разработать мастер-стратегию. Мы можем оценить ликвидность, прибыльность и стабильность различных товаров на всем рынке товарных фьючерсов, отсеять портфели товарных фьючерсов с низкой волатильностью, а затем провести отраслевую нейтральность. Благодаря диверсифицированному выбору промышленность, общая волатильность может быть дополнительно снижена. Наконец, фактический товарный фьючерсный многовариантный портфель формируется посредством сопоставления рыночной стоимости для торговли.
Каждый продукт также может быть настроен с использованием стратегий с несколькими параметрами. Вы можете выбрать комбинацию параметров, которая имеет хорошую производительность бэктеста. Когда рыночный тренд очевиден, стратегии с несколькими параметрами обычно работают последовательно, что эквивалентно добавлению позиций. Когда рынок находится в волатильный рынок, можно использовать стратегии с несколькими параметрами для повышения производительности. Стратегии часто ведут себя непоследовательно, поэтому каждая из них идет в лонг или шорт, чтобы хеджировать риски, что эквивалентно сокращению позиций. Это может еще больше снизить максимальную доходность портфеля, сохранив при этом общую доходность неизменной.
2. Классический случай стратегии CTA Futures
Ньютон однажды сказал: «Если я вижу дальше других, то это потому, что я стою на плечах гигантов».
Стратегии CTA, публично доступные на рынке, включают стратегию скользящей средней, стратегию полос Боллинджера, метод торговли «Черепашки», стратегию импульса, арбитражную стратегию и т. д. У всех количественных торговых стратегий есть одна особенность: они умрут на свету. Как только стратегия станет достоянием общественности, она постепенно станет неэффективной. Но это не мешает нам изучать эти стратегии и использовать их суть, чтобы мы могли смотреть на проблемы с точки зрения стоящих на плечах гигантов.
2.1 Анализ фундаментальных показателей фьючерсов (запасы, базис, цена)
Фундаментальный анализ не должен беспокоиться о краткосрочных ценовых тенденциях. Он считает, что стоимость в конечном итоге отразится на цене. Он больше касается анализа факторов, лежащих в основе цены, и оценки того, сколько стоит это разнообразие. Обычно применяется метод анализа «сверху вниз»: от макрофакторов, факторов разнообразия и других факторов.
Если мы посмотрим на картинку выше, то увидим, что существует множество факторов, влияющих на цены на сырьевые товары, в общей сложности десятки наименований. Если же мы разберем их еще подробнее, то их будет еще десятки, и эти данные постоянно меняются. Отдельные розничные инвесторы не в состоянии получить такие огромные объемы данных, не говоря уже о проведении объективного анализа.
На самом деле фундаментальный анализ товарных фьючерсов не означает анализ всех факторов. Нам нужно только усвоить основные элементы фундаментального анализа, чтобы найти закономерности из сложной информации.
Макро факторы
Макроэкономические данные сложны и изменчивы. Каждый день и каждую минуту политики, центральные банки и инвестиционные банки в разных странах публикуют множество экономических данных, как официальных, так и неофициальных. За исключением политических и экономических кризисов, макроанализ является хорошим материалом для разговора, но не очень практичен. Питер Линч, известный американский эксперт по управлению фондами, однажды выразил свое мнение: «Я трачу не более пятнадцати минут в год на анализ экономических тенденций».
Факторы разнообразия
В фундаментальном анализе анализ продукта в основном анализирует премии и скидки, соотношение спроса и предложения, товарные запасы, прибыль отрасли и т. д. Можно сказать, что овладение анализом товарных фьючерсных факторов продукта может в принципе определять большинство рыночных тенденций.
Друзья, которые занимались фьючерсной торговлей, знают, что фьючерсы на отечественные товары можно просто разделить на: промышленные товары и сельскохозяйственные продукты. Методы анализа для промышленных и сельскохозяйственных продуктов различны. Мы объясним с двух сторон: спроса и предложения. Для промышленных продуктов предложение относительно стабильно. Если не произойдет крупного технологического прорыва, маловероятно, что производственные мощности будут рост в краткосрочной перспективе. С течением времени происходят существенные изменения, поэтому фактором, влияющим на цены на промышленную продукцию, является в основном спрос. Спрос на сельскохозяйственную продукцию относительно стабилен. В долгосрочной перспективе наблюдаются изменения в спросе на сельскохозяйственную продукцию, но в краткосрочной перспективе спрос на сельскохозяйственную продукцию имеет тенденцию к стабильности. Таким образом, фактор, влияющий на цену сельскохозяйственной продукции в основном это предложение.
Следовательно, согласно законам экономики, именно соотношение спроса и предложения в конечном итоге определяет цену товара. Теоретически, пока мы можем получить данные о спросе и предложении, мы можем судить о будущей цене товара. Для промышленных продуктов данные о поставках получить относительно легко, но данные о спросе получить трудно. Для сельскохозяйственных продуктов данные о спросе получить относительно легко, но данные о поставках получить трудно.
На самом деле, мы можем пойти дальше и сделать вычитание. Взаимный результат спроса и предложения на экономическом рынке — это запасы. Мы можем использовать данные о запасах, чтобы судить о силе взаимосвязи между рыночным спросом и предложением. Если запасы определенного товара очень велики, это означает, что сила рыночного предложения превышает спрос, и цена товара упадет, если внешние условия останутся неизменными. Если запасы определенного товара очень малы, это означает, что сила рыночного спроса превышает предложение, и цена товара вскоре вырастет, если внешние условия останутся неизменными.
Помимо анализа товарных запасов, необходимо также проанализировать разницу цен между спотовым рынком и фьючерсным рынком, что является так называемым базисом. Если фьючерсная цена выше спотовой цены, мы называем это премией; если фьючерсная цена ниже спотовой цены, мы называем это скидкой. Согласно системе поставки фьючерсов, на дату поставки фьючерса цена фьючерса должна быть равна спотовой цене.
Независимо от того, является ли это премией или скидкой, из-за ограничений системы поставки фьючерсов, теоретически фьючерсная цена на дату поставки должна быть равна спотовой цене. По мере приближения даты поставки спотовая цена и фьючерсная цена будут стремиться к согласованности: одна — это возврат фьючерса к спотовой цене, другая — возврат спота к фьючерсу.
Основываясь на вышеизложенных принципах, мы можем использовать инвентарь и базис для одновременного определения будущих фьючерсных цен. Если запасы товара невелики, а фьючерсная цена значительно ниже спотовой, то можно сделать вывод, что спрос на спотовом рынке превышает предложение, и вероятность будущего роста спотовой цены высока. По мере приближения даты поставки фьючерсные цены будут расти, сравнявшись со спотовой ценой, и вероятность роста фьючерсных цен в будущем возрастает.
Наконец, мы определили наиболее вероятное направление будущих цен через запасы и базис, но более точных точек покупки и продажи нет, поэтому необходим технический анализ, чтобы дать четкие сигналы входа и выхода. Вся структура фундаментального анализа такова: низкий уровень запасов + большая скидка + технический анализ, бычий сигнал = длинная позиция; высокий уровень запасов + большая премия + технический анализ, медвежий сигнал = короткая позиция.
2.2 Правила торговли черепахами
Когда речь заходит о торговых стратегиях, мы должны поговорить о типичных правилах торговли Черепах. Правила торговли Черепахами берут свое начало в одном из самых известных экспериментов в истории торговли, когда сырьевой спекулянт Ричард Деннис хотел выяснить, рождаются ли великими трейдерами или становятся. С этой целью в 1983 году он набрал 13 человек и обучил их основным концепциям фьючерсной торговли, а также своим собственным методам и принципам торговли. Таких студентов называют «морскими черепахами».
За следующие четыре года «Черепахи» достигли среднегодовой доходности в 80%. Деннис также продемонстрировал, что, используя простую систему и правила, люди с небольшим или нулевым опытом торговли могут стать отличными трейдерами. Однако некоторые Черепахи продают Правила Черепашьей Торговли на сайте с целью получения прибыли. Чтобы положить конец такому поведению, двое первых Черепашек, Кертис Фейт и Артур Мэддок, решили сделать Правила торговли Черепахами доступными для свободного доступа на веб-сайте.
После того, как правда вышла наружу, люди обнаружили, что правила торговли Черепах используют оптимизированный канал Дончиана и индикатор ATR для управления позициями. После десятилетий исторических испытаний он стал методом торговли, который обычные розничные инвесторы могут использовать для легкого зарабатывания денег, и он по-прежнему эффективен для определенных продуктов.
Основные принципы Turtle
- Получите преимущество: найдите торговую стратегию с положительным ожидаемым значением, поскольку она принесет положительную прибыль в долгосрочной перспективе.
- Управляйте рисками: контролируйте риски и стойте на своем, иначе вы можете не дожить до того дня, когда добьетесь результатов.
- Непоколебимая приверженность: только неуклонно реализуя свою стратегию, вы сможете по-настоящему добиться систематических результатов.
- Простота и ясность: в долгосрочной перспективе простые системы более устойчивы, чем сложные.
Итак, давайте посмотрим, что на самом деле говорится в Правилах Черепашьей Торговли?
- Рынки - что покупать и продавать, по сути, на каких рынках торговать. Черепахи были фьючерсными трейдерами, и они выбирали только рынки с большими объемами торговли и высокой ликвидностью, потому что выбор рынков с низкими объемами торговли увеличивал риск потери деньги. Дополнительное проскальзывание при выходе с рынка также приведет к тому, что вы упустите много возможностей тренда.
- Размер позиции. То, сколько покупать или продавать, является очень важной частью всей стратегии, но большинство людей обычно игнорируют ее или относятся к ней неправильно. Правила торговли Черепах используют ATR (индикатор среднего истинного диапазона) для расчета открытых позиций, дополнительных сигналов и сигналов стоп-лосса. Это очень умная конструкция, которая предназначена для корректировки размера позиции в соответствии с абсолютной волатильностью рынка. Когда волатильность рынка сильная, размер позиции уменьшается, а когда волатильность рынка слабая, размер позиции увеличивается . Сначала определяется единица, формула этой единицы: (общая сумма активов*1%)/СТР. Начальная позиция составляет 1 единицу. Даже если падение продукта в этот день достигнет уровня ATR, убыток в этот день можно контролировать в пределах 1% от общих активов. Если цена вырастет на 0,5 единицы, длинная позиция увеличится на 1 единицу, максимум до 4 единиц.
- Вход на рынок - Вход Черепахи на рынок опирается на канал Дончиана. Когда цена поднимается выше самой высокой цены предыдущих 20 или 55 линий К, она входит на рынок, чтобы делать длинные позиции. Когда цена падает ниже самая низкая цена из предыдущих 20 или 55 K-линий, он входит в рынок, чтобы делать длинные позиции. , просто входите в рынок и открывайте короткие позиции. Входите в сделку при появлении сигнала, не дожидаясь закрытия или следующей К-линии.
- Стоп-лосс. В долгосрочной перспективе сделки без стоп-лосса не будут успешными, но большинство трейдеров держат убыточные позиции в надежде, что рынок развернется. У Черепах были строгие правила, когда выходить из убыточной позиции. Если длинная позиция удерживалась, а цена падала на 2 единицы, длинная позиция закрывалась со стоп-лоссом. Если вы удерживаете короткую позицию и цена вырастает на 2 единицы, короткая позиция будет закрыта со стоп-лоссом.
- Тейк-профит. Тейк-профит Черепахи означает потерю значительной части плавающей прибыли, с чем многим трейдерам трудно смириться. Если вы в данный момент занимаете длинную позицию, а цена падает ниже нижней дорожки 10-дневного канала Дончиана, закройте все длинные позиции; если вы в данный момент занимаете короткую позицию, а цена поднимается выше верхней дорожки 10-дневного канала Дончиана, закройте все длинные позиции. Канал Дончиана, закрыть все короткие позиции.
Из этого мы видим, что хотя Правила торговли Черепах выглядят простыми, на самом деле они сформировали прототип реальной торговой системы. Они охватывают все аспекты полной торговой системы и не оставляют места для трейдеров. Есть место для субъективного воображения и принятия решений, что позволяет выявить преимущества запрограммированной работы системы. В том числе: правила входа и выхода, управление фондами и контроль рисков и т. д.
Самое большое преимущество метода Turtle Trading в том, что он помогает нам установить эффективный метод торговли. Это стратегия, которая сочетает в себе пакетное открытие, динамический стоп-профит и стоп-лосс, а также следование рыночному тренду, особенно использование значения ATR и позиции менеджмент. Эту концепцию стоит изучить. Конечно, у него также есть общая проблема со стратегиями следования за трендом, а именно фиксация нереализованной прибыли. Плавающая прибыль, полученная в результате погони за ростом, с большой вероятностью может быть потеряна из-за последующего резкого падения. Он очень силен в крупном тренде, но плохо работает на волатильном рынке.
3. Практическая разработка будущих стратегий CTA
3.1 Разработка стратегии тренда CTA на основе языка май
В конце прошлого века магический метод торговли начал становиться популярным в сфере финансовых инвестиций в Соединенных Штатах. После того, как тысячи людей практиковали его, люди обнаружили, что этот метод эффективен и имеет большую практическую ценность. В то же время , он был признан многими экспертами по инвестициям. Он признан профессиональными трейдерами и по-прежнему может быть прекрасно применен практически ко всем областям финансовых инвестиций, будь то валюта, золото, акции, фьючерсы, сырая нефть или индексы и облигации. Это метод работы хаоса.
Слово хаос изначально относится к описанию хаотического состояния вселенной. Идея заключается в том, что результат неизбежен, но его невозможно рассчитать из-за существующих знаний, потому что само вычисление также изменяет результат, а максимум или минимум Результат может появиться в конце, но неизбежности нет. результат. Это очень похоже на торговлю на рынке, где участники изменяют рынок, анализируя его и совершая сделки купли-продажи. Рынок вечно изменчив. Когда участники узнают о новой рыночной форме, рынок также узнает, что она признана участниками, и тогда происходит мутация. И он определенно будет иметь тенденцию мутировать в направлении, неизвестном участникам. Он достаточно мудр, чтобы помешать участникам уловить его меняющиеся закономерности. Другими словами, рынок нестабилен, и понимание прошлого рынка не может представлять будущее.
Метод работы «Хаос» — это полный набор инвестиционных идей, торговых стратегий и сигналов входа и выхода, изобретенных Биллом Вильямсом. В настоящее время многие международные инвесторы используют методы работы с хаосом для участия в рыночных транзакциях. Из-за отстающего развития финансового рынка моей страны и того факта, что теория хаоса является относительно новой идеей, в Китае мало людей, которые изучают методы работы с хаосом. Поскольку метод операций «Хаос» является универсальной торговой стратегией, которую можно применять практически во всех областях финансовых инвестиций, включая акции, облигации, фьючерсы, иностранную валюту и цифровые валюты, в этом курсе в качестве отправной точки используется упрощенная версия стратегии «Хаос». . Улучшить инвестиционный интерес и доходность для всех.
Как следует из названия, теоретической основой метода работы хаоса является теория хаоса, предложенная метеорологом Эдвардом Лоренцем и являющаяся одним из величайших научных открытий конца XX века. Именно он предложил знаменитый «эффект бабочки». Билл Уильямс творчески применил теорию хаоса в области финансовых инвестиций и объединил ее с фрактальной геометрией, нелинейной динамикой и другими дисциплинами, чтобы создать серию очень эффективных индикаторов технического анализа.
Весь метод работы хаоса состоит из пяти измерений (технических индикаторов):
Давайте посмотрим на картинку выше. Линия Аллигатора — это набор линий баланса, которые используют фрактальную геометрию и нелинейную динамику. Ее суть — расширенная экспоненциально взвешенная скользящая средняя, которая является разновидностью скользящей средней, но метод расчета немного сложнее чем обычная скользящая средняя. Некоторые. Далее давайте посмотрим, как определить линию Аллигатора на языке майя:
// 参数
N1:=11;
N2:=21;
// 定义价格中线
N3:=N1+N2;
N4:=N2+N3;
HL:=(H+L)/2;
// 鳄鱼线
Y^^SMA(REF(HL,N3),N4,1);
R:=SMA(REF(HL,N2),N3,1);
G:=SMA(REF(HL,N1),N2,1);
Сначала мы определяем два внешних параметра N1 и N2, а затем вычисляем средний HL самой высокой цены и самой низкой цены на основе внешних параметров. Затем мы вычисляем средний HL с различными параметрами соответственно. Для поцелуя в губы это малый цикл средней линии. Чтобы снова усреднить, зубы — это среднее значение среднего периода средней линии, а челюсть — это среднее значение большого периода средней линии. В этой стратегии мы используем челюсти.
Понятие фрактала очень наглядно определено в Методе Операции Хаос. Можно использовать аналогию: откройте ладонь пальцами вверх. Средний палец — верхний фрактал, мизинец и безымянный палец слева, а указательный Указательный и большой пальцы справа представляют неповрежденную область. К-линия нового максимума. Базовый фрактал состоит из этих 5 К-линий. Затем вы можете определить фрактал, используя следующий код:
// 分形
TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2;
BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2;
TOP:=REF(H,TOP_N);
BOTTOM:=REF(L,BOTTOM_N);
MAX_YRG^^MAX(MAX(Y,R),G);
MIN_YRG^^MIN(MIN(Y,R),G);
TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP);
BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);
После расчета линии Аллигатора и фрактала мы можем написать простую стратегию работы хаоса, основанную на этих двух условиях, используя набор экспоненциально взвешенных скользящих средних в качестве эталонной цены для расчета индикаторов линии Аллигатора и фрактала. Конечно, изначальная стратегия операции «Хаос» более сложна. Код выглядит следующим образом:
// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1);
// 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓
SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1);
// 如果收盘价跌破鳄鱼的下巴时,多头平仓
C<Y,SP(BKVOL);
// 如果收盘价升破鳄鱼的下巴时,空头平仓
C>Y,BP(SKVOL);
Для простоты понимания я включил в код подробные комментарии. Мы можем просто перечислить торговую логику этой стратегии следующим образом:
- Открыть длинную позицию: Если в данный момент нет длинного ордера, а цена закрытия пробивает верхний фрактал, а верхний фрактал находится выше линии Аллигатора.
- Открыть короткую позицию: если на данный момент нет коротких ордеров, а цена закрытия опускается ниже нижнего фрактала, а нижний фрактал находится ниже линии Аллигатора.
- Выход из длинной позиции: если цена закрытия опускается ниже челюсти Аллигатора.
- Выход из короткой позиции: если цена закрытия пробьет челюсть Аллигатора.
Далее давайте взглянем на результаты бэктеста этой простой стратегии работы с хаосом. Чтобы приблизить бэктест к реальной торговой среде, комиссия за транзакцию установлена в два раза выше биржевой, а для открытия и закрытия позиций добавлено проскальзывание в 2 скачка. Тип данных для бэктестинга — индекс арматуры, тип торговли — непрерывный основной арматурный стержень, а открытая позиция зафиксирована на уровне 1 лота. Ниже представлен предварительный отчет о результатах бэктестинга на уровне 1 часа.
Судя по кривой капитала и данным бэктестинга, стратегия работает хорошо, а общая кривая капитала устойчиво растет. Однако характеристики рынка арматуры изменились с конца 2016 года: от прежнего высоковолатильного одностороннего тренда к широкому диапазону колебаний. Судя по кривой капитала, прибыль явно слабая с 2017 года.
Короче говоря, суть метода работы хаоса заключается в поиске точки разворота. Вам не нужно беспокоиться о том, как пойдет рынок, или является ли прорыв истинным или ложным. Если фрактал пробит, вы можете войти в рынок напрямую. Никогда не пытайтесь предсказать рынок, но будьте наблюдателем и последователем.
3.2 Разработка арбитражной стратегии CTA на основе языка JavaScript
В своей книге «Алхимия финансов», написанной в 1987 году, Сорос однажды выдвинул важное положение: я считаю, что рыночные цены всегда неверны в том смысле, что они предвзяты по отношению к будущему. Он считает, что гипотеза эффективности рынка является лишь теоретическим предположением. На самом деле участники рынка не всегда рациональны, и в каждый момент времени для них невозможно полностью получить и объективно интерпретировать всю информацию. Более того, даже если тот же Информация, отзывы у всех разные. Другими словами, сама цена уже включает в себя ошибочные ожидания участников рынка, поэтому рыночные цены всегда неверны по своей сути. Это может быть источником прибыли для арбитражеров.
Исходя из вышеизложенных принципов, мы знаем, что на неэффективном фьючерсном рынке рыночные воздействия на контракты на поставку в разные периоды не всегда синхронизированы, а их ценообразование не является полностью эффективным. Затем, основываясь на ценах контрактов на поставку одного и того же предмета торговли в разные периоды, если между двумя ценами имеется большая разница в цене, вы можете покупать и продавать фьючерсные контракты разных периодов одновременно, проводя кросс-периодный арбитраж.
Как и товарные фьючерсы, цифровые валюты также имеют комбинацию связанных с ними кросс-периодных арбитражных контрактов. Например, на бирже OkEX существуют: ETC Weekly, ETC Biweekly и ETC Quarterly. Например, предположим, что разница в цене между еженедельными и ежеквартальными акциями ETC остается около 5 в течение длительного времени. Если в определенный день спред достигает 7, мы ожидаем, что в какой-то момент в будущем спред вернется к 5. Затем вы можете продавать ETC еженедельно и покупать ETC ежеквартально, чтобы играть на понижении спреда. наоборот.
Несмотря на то, что такая разница в ценах существует, ручной арбитраж часто сопряжен со множеством неопределенностей из-за длительных ручных операций, низкой точности и влияния изменений цен. Прелесть количественного арбитража заключается в выявлении арбитражных возможностей с помощью количественных моделей и формулировании стратегий арбитражной торговли, а также в автоматическом размещении торговых ордеров на биржах с помощью запрограммированных алгоритмов, чтобы быстро и точно выявлять возможности и эффективно и стабильно получать прибыль.
На этом курсе вы научитесь использовать количественную торговую платформу Inventor и фьючерсные контракты ETC на бирже OkEX в торговле цифровой валютой, а также использовать простую арбитражную стратегию, чтобы продемонстрировать, как использовать мгновенные арбитражные возможности и использовать каждую возможность, чтобы увидеть и получить прибыль, одновременно хеджирование возможных рисков.
Создание стратегии арбитража криптовалют с кросс-периодами
Уровень сложности: Нормальный
Стратегическая среда
- Тема транзакции: Ethereum Classic (ETC)
- Данные о разнице цен: ETC еженедельно - ETC ежеквартально (тест на коинтеграцию пропущен)
- Торговый цикл: 5 минут
- Соответствие позиций: 1:1
- Тип транзакции: Один и тот же продукт за разные периоды
Стратегическая логика
- Условия открытия длинного спреда: если на текущем счете нет позиций и спред меньше нижней дорожки Болла, открывайте длинную позицию по спреду. То есть: купить ETC на неделю и продать ETC на квартал.
- Условия открытия короткой позиции по спреду: Если на текущем счете нет позиций, а спред больше верхней границы, открывайте короткую позицию по спреду. То есть: продать ETC на неделю и купить ETC на квартал.
- Условия закрытия длинного спреда: Если на текущем счете имеется недельная длинная позиция по ETC и квартальная короткая позиция по ETC, и спред больше средней дорожки фунта, длинный спред будет закрыт. То есть: продать ETC на неделю и купить ETC на квартал.
- Условия закрытия короткого спреда: Если на текущем счете открыта короткая позиция по ETC на этой неделе и длинная позиция по ETC в квартале, а спред меньше средней дорожки болла, короткий спред будет закрыт. То есть: купить ETC на неделю и продать ETC на квартал.
Выше приведено простое описание логики стратегии арбитража цифровых валют по периодам. Так как же реализовать ваши идеи в программе? Сначала мы попытались построить структуру на платформе количественной торговли Inventor.
function Data() {} // 基础数据函数
Data.prototype.mp = function () {} // 持仓函数
Data.prototype.boll = function () {} // 指标函数
Data.prototype.trade = function () {} // 下单函数
Data.prototype.cancelOrders = function () {} // 撤单函数
Data.prototype.isEven = function () {} // 处理单只合约函数
Data.prototype.drawingChart = function () {} // 画图函数
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 计算boll技术指标
data.trade(); // 计算交易条件下单
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
//入口函数
function main() {
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
Представьте себе, как выглядит наш процесс транзакций в надзорной торговле? Принципиальной разницы в системной торговле нет, это не более чем: получение данных, расчет данных, размещение ордеров и обработка после размещения ордеров. То же самое верно и в программе. Сначала программа выполнит основную функцию в строке 20. Это соглашение. Когда программа завершит предварительную обработку торговой стратегии (если таковая имеется), она войдет в режим бесконечного цикла, то есть, Режим раундового опроса. В режиме опроса функция onTick будет выполняться многократно.
Затем в функции onTick мы имеем процесс торговли в субъективной торговле: сначала получаем основные данные о ценах, затем получаем баланс счета, затем рассчитываем индикатор, затем начинаем рассчитывать торговые условия и размещаем ордер, и, наконец, обработка после размещения заказ, включая: отмену заказов, составление чертежей и обработку отдельных контрактов.
Сравнивая стратегические идеи и торговые процессы, вы можете легко построить структуру стратегии. Всю стратегию можно упростить до трех шагов:
- Предварительная обработка транзакций.
- Получайте и рассчитывайте данные.
- Оформите заказ и займитесь его выполнением.
После того, как структура торговой стратегии создана, вам необходимо заполнить необходимый код детализации в структуре стратегии на основе фактического торгового процесса и деталей транзакции.
1. Предварительная обработка транзакций
1. Объявите необходимые глобальные переменные
- Объявите объект диаграммы для ее настройки.
var chart = {} - Вызовите функцию Chart для инициализации диаграммы.
var ObjChart = Chart ( chart ) - Объявите пустой массив для хранения последовательности разницы цен.
var bars = [] - Объявите переменную для записи временной метки исторических данных
var oldTime = 0
2. Настройте внешние параметры стратегии
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
3. Определить функции обработки данных
- Базовая функция данных: Данные ( )
Создайте конструктор Data и определите его внутренние свойства. Включает: данные счета, данные позиции, временную метку данных K-line, цену спроса/предложения арбитражного контракта A/B и форвардные/обратные арбитражные спреды.
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
- Функция получения позиции: mp ( )
Пройти весь массив позиций и вернуть количество позиций указанного контракта и направления. Если нет, вернуть false
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
- Функции K-линии и индикатора: boll ( )
Синтезируйте новую последовательность K-линий на основе данных прямого/обратного арбитражного спреда. И возвращает данные о верхнем рельсе, среднем рельсе и нижнем рельсе, рассчитанные индикатором Болла.
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
- Функция заказа: торговля ( )
Передайте название контракта и тип ордера, затем разместите ордер по цене рассмотрения и верните результат после размещения ордера. Поскольку необходимо разместить одновременно два ордера в разных направлениях, цена покупки/продажи преобразуется внутри функции в соответствии с наименованием контракта ордера.
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
- Функция отмены заказа: cancelOrders()
Получите массив всех невыполненных заказов и отмените их один за другим. И если есть невыполненный заказ, возвращается false, а если нет невыполненного заказа, возвращается true.
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
- Обработка удержания одного контракта: isEven()
Когда мы сталкиваемся с односторонней ситуацией в арбитражной торговле, мы просто закрываем все позиции, чтобы ее урегулировать. Конечно, вы также можете перейти на метод повторного заказа.
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
if (positionData[i].Type == 0) { // 如果是多单
type = 10; // 设置下单参数
} else if (positionData[i].Type == 1) { // 如果是空单
type = -10; // 设置下单参数
}
// 平掉所有仓位
this.trade(positionData[i].ContractType, type, positionData[i].Amount);
}
}
}
- Функция рисования: drawingChart ( )
Вызовите метод ObjChart.add(), чтобы отобразить на графике необходимые рыночные данные и данные индикаторов: верхнюю дорожку, среднюю дорожку, нижнюю дорожку и положительный/отрицательный спред.
Data.prototype.drawingChart = function (boll) {
var nowTime = new Date().getTime();
ObjChart.add([0, [nowTime, boll.up]]);
ObjChart.add([1, [nowTime, boll.middle]]);
ObjChart.add([2, [nowTime, boll.down]]);
ObjChart.add([3, [nowTime, this.basb]]);
ObjChart.add([4, [nowTime, this.sabb]]);
ObjChart.update(chart);
}
4. В функции входа main() выполните код предварительной обработки транзакции. Этот код выполняется только один раз после запуска программы. включать:
- Фильтрация менее важной информации в консоли
SetErrorFilter ( ) - Установите цифровую валюту для торговли
exchange.IO ( ) - Очистите ранее нарисованную диаграмму перед запуском программы.
ObjChart.reset ( ) - Очистите предыдущую информацию в строке состояния перед запуском программы.
LogProfitReset ( )
После определения вышеописанной предварительной обработки перед торговлей мы перейдем к следующему шагу, войдем в режим опроса и повторно выполним функцию onTick(). И установите время сна, когда Sleep() опрашивает, поскольку некоторые API криптовалютных бирж имеют встроенное ограничение доступа в течение определенного периода времени.
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
2. Получить и рассчитать данные
- Получите основные объекты данных, остатки на счетах и данные индикаторов Болла для использования в торговой логике.
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
}
3. Оформите заказ и получите ответ
- Согласно вышеизложенной логике стратегии, совершайте операции купли-продажи. Сначала он определяет, выполняются ли условия цены и индикатора, затем определяет, выполняются ли условия позиции, и, наконец, выполняет функцию торгового ордера ( ).
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
- После размещения заказа необходимо обрабатывать нештатные ситуации, такие как невыполненные заказы и наличие одного контракта. и рисование диаграмм.
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
Выше мы создали простую стратегию межпериодного арбитража цифровой валюты, состоящую всего из 200 строк. Полный код выглядит следующим образом:
// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
__isStock: true,
tooltip: {
xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
},
title: {
text: '交易盈亏曲线图(详细)'
},
rangeSelector: {
buttons: [{
type: 'hour',
count: 1,
text: '1h'
}, {
type: 'hour',
count: 2,
text: '3h'
}, {
type: 'hour',
count: 8,
text: '8h'
}, {
type: 'all',
text: 'All'
}],
selected: 0,
inputEnabled: false
},
xAxis: {
type: 'datetime'
},
yAxis: {
title: {
text: '价差'
},
opposite: false,
},
series: [{
name: "上轨",
id: "线1,up",
data: []
}, {
name: "中轨",
id: "线2,middle",
data: []
}, {
name: "下轨",
id: "线3,down",
data: []
}, {
name: "basb",
id: "线4,basb",
data: []
}, {
name: "sabb",
id: "线5,sabb",
data: []
}]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳
// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
// 获取持仓
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
// 下单
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
// 取消订单
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
// 处理持有单个合约
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
if (positionData[i].Type == 0) { // 如果是多单
type = 10; // 设置下单参数
} else if (positionData[i].Type == 1) { // 如果是空单
type = -10; // 设置下单参数
}
// 平掉所有仓位
this.trade(positionData[i].ContractType, type, positionData[i].Amount);
}
}
}
// 画图
Data.prototype.drawingChart = function (boll) {
var nowTime = new Date().getTime();
ObjChart.add([0, [nowTime, boll.up]]);
ObjChart.add([1, [nowTime, boll.middle]]);
ObjChart.add([2, [nowTime, boll.down]]);
ObjChart.add([3, [nowTime, this.basb]]);
ObjChart.add([4, [nowTime, this.sabb]]);
ObjChart.update(chart);
}
// 交易条件
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
//入口函数
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
Арбитражная торговля возникла из стратегии торговли акциями Morgan Stanley. Ее концепция заключается в следующем: колебания разницы цен двух сильно коррелированных продуктов подчиняются «процессу попкорна», то есть разница цен постоянно возвращается к среднему значению из положения, отклоняющегося от исторического среднего значения. , а затем еще одно отклонение от среднего значения.
Из этого мы можем получить прибыль, покупая по низкой цене и продавая по высокой, основываясь на разнице цен. Затем, согласно принципу стандартного отклонения в статистике, полосы Боллинджера состоят из средней линии и верхней и нижней линий, рассчитанных по стандартному отклонению образуют три сетки. Это очень полезно в арбитражной торговле спредами.
После тестирования было установлено, что если следовать данной стратегии, то без учета комиссий за обработку и издержек воздействия прибыль каждый раз не очень высока, но общая прибыль относительно стабильна. Следует отметить, что поскольку это статистический арбитраж, существует риск того, что разница в цене увеличится в противоположном направлении, и при его проектировании мы должны учитывать проблему стоп-лосса. Во-вторых, нам также необходимо обратить внимание на стоимость воздействия. Когда ликвидность двух контрактов, участвующих в сделке, снижается, это окажет значительное влияние на доходность, и инвесторам следует избегать этого по мере необходимости.
4. Расширенная итерация разработки стратегии CTA
4.1 Как избежать ловушек стратегий фьючерсного CTA
На последних двух занятиях мы написали трендовую стратегию на языке Mai и арбитражную стратегию на JavaScript и не обнаружили никаких проблем при бэктестинге стратегии. Однако количественная торговля заключается не только в написании программы и последующей прямой торговле по ней после успешного тестирования на исторических данных.
По сути, бэктестинг — это всего лишь моделирование стратегии, которое используется только для оценки эффективности стратегии на исторических данных, что позволяет трейдерам быстро оценивать и отказываться от некоторых торговых стратегий.
Во многих случаях стратегии, которые выглядят отлично в бэктестинге, часто не соответствуют стандартам бэктестинга в реальной торговле. Существует множество причин, некоторые из которых находятся вне контроля трейдера, но некоторые из неудач связаны с общими или потенциальными ошибками .
Статические данные против динамических данных
Когда мы делаем количественный анализ, мы должны сначала иметь концепцию статических данных и динамических данных. При бэктестинге мы используем статические исторические данные. Цены каждой K-линии являются полными, и каждый торговый сигнал может быть продан на 100%. Но данные на реальном рынке динамичны. Например, если самая высокая цена больше самой высокой цены в течение 1 часа после открытия, то покупайте. Однако, если текущая K-линия не была завершена, то самая высокая цена является динамической и торговый сигнал может мигать туда-сюда . Такая ситуация свидетельствует о том, что стратегия использует будущие функции при определении условий сделок купли-продажи.
Будущая функция
Что такое будущая функция? Давайте сначала посмотрим, как это объясняет энциклопедия Baidu: если величина зависит от другой величины, например, величины A и величины B, и изменение B вызывает изменение A, то A является функцией B. Если B является более поздней величина, A — это Для более ранней величины, A изменяется вместе с B, а A — будущая функция B. Все могут быть в замешательстве.
Проще говоря, это функция, которая ссылается на будущие данные, например, используя завтрашнюю цену для прогнозирования завтрашней цены. Если технический индикатор содержит будущую функцию, его сигнал неопределенный. Часто торговый сигнал выдается в данный момент, но при появлении следующей K-линии сигнал исчезает или меняет положение.
Цена закрытия — это будущая функция. До завершения последней K-линии цена закрытия всегда меняется. Вам необходимо дождаться завершения K-линии, чтобы определить цену закрытия. Поскольку цена закрытия сама по себе является функцией будущего, все технические индикаторы, основанные на цене закрытия, также являются функциями будущего.
Таким образом, если технический индикатор использует подтвержденную цену закрытия в качестве своих основных данных, а сигналы покупки и продажи не меняются независимо от того, сколько времени прошло, можно сказать, что этот технический индикатор не ссылается на будущую функцию. Однако основными данными, которые он использует, являются цены закрытия, которые еще не подтверждены, поэтому этот технический индикатор относится к будущей функции, а сигналы покупки и продажи могут меняться в реальных приложениях.
Прошлые цены
Функция будущего использует будущие цены, но может также использовать прошлые цены. Это проблема, которую многие новички склонны упускать из виду. Чтобы лучше проиллюстрировать эту проблему в будущем, давайте рассмотрим пример: если текущая максимальная цена выше максимальной цены в течение 1 часа после открытия, покупайте по цене открытия. Очевидно, что в условиях этого сигнала покупки и продажи нет ничего неправильного, но цена, используемая для размещения ордера, — это прошлая цена.
В бэктесте стратегия является нормальной, поскольку движок бэктеста, основанный на статических данных, может завершить транзакцию в 100% случаев, пока есть сигнал на покупку. Однако на реальном рынке, когда самая высокая цена больше, чем самая высокая цена в течение 1 часа после открытия. В это время вы, безусловно, больше не можете использовать прошлую цену открытия для размещения ордеров.
Ценовой вакуум
Так называемый ценовой вакуум относится к цене, отображаемой на графике K-line, но цена не может быть продана на реальном рынке. Он в основном делится на следующие ситуации:
- Каждый, кто занимался торговлей, знает, что трудно покупать, когда цена достигает своего верхнего предела, и трудно продавать, когда цена достигает своего нижнего предела. Однако можно торговать и на основе бэктеста.
- Механизм сопоставления на бирже: приоритет цены и приоритет времени. Некоторые продукты часто имеют огромное количество заказов. Если вы размещаете заказ на покупку или продажу в режиме реального времени, вы должны ждать, пока другие заказы будут выполнены, прежде чем вы сможете завершить транзакцию. В некоторых случаях цена могла измениться до того, как вы сможете завершить транзакцию. Однако во время бэктестинга, если ваша стратегия заключается в размещении ордеров, то транзакция будет завершена своевременно, что отличается от реальной торговой среды.
- Если вы используете стратегию арбитража, то прибыль от бэктестинга будет очень высокой, поскольку каждый раз при бэктестинге вы предполагаете, что уловили эти ценовые разницы. В реальности многие спреды недоступны или доступен только один отрезок. Как правило, тот, который не благоприятствует вашему направлению, будет продан первым, поэтому вам нужно немедленно заполнить другой отрезок. В это время проскальзывание уже произошло. Это не 1 или 2 пункта, но сама арбитражная стратегия зарабатывает деньги на разнице цен этих пунктов. Эту ситуацию невозможно смоделировать в бэктестинге. Фактическая прибыль не так хороша, как при бэктестинге.
- Хотя события черного лебедя не являются обычным явлением, они все равно оказывают большое влияние на количественную торговлю. Например, в случае события черного лебедя швейцарского франка график показывает, что есть как высокое открытие, так и низкое закрытие. Фактически, в экстремальных Рыночные условия дня. Цена в середине — вакуум, большое количество стоп-ордеров вызывает панику, ликвидность равна нулю, а транзакции очень сложны, но стоп-лоссы могут быть достигнуты при бэктестинге.

Переобучение
Переобучение — это распространенная ошибка новичков в количественной торговле. Что такое переобучение? Давайте рассмотрим простой пример: сдавая экзамены в школе, некоторые люди используют тактику задавать много вопросов и запоминать каждый вопрос. Если вопросы немного изменятся во время экзамена, он не сможет на них ответить. Потому что он запоминал подход к каждому вопросу очень сложным образом, но не абстрагировал общие правила.

Как показано на рисунке выше, если модель достаточно сложна, она может прекрасно адаптироваться к данным. То же самое касается переобучения в количественной торговле. Если ваша стратегия сложна и имеет много внешних параметров, то в ограниченном историческом тесте данных всегда найдется один или несколько параметров, которые могут идеально соответствовать стратегии. В соответствии с историческими рыночными условиями .
Однако в будущей реальной торговле изменения цен могут превысить ограничения вашей стратегии. Фактически, суть разработки количественной торговой стратегии заключается в процессе сопоставления локальных неслучайных данных с большим объемом, казалось бы, случайных данных. Поэтому, нам нужно использовать статистику. Как мы можем использовать знания, чтобы избежать этой ловушки?
Компромиссным решением является использование как данных из выборки, так и данных извне. Разделите все данные на две части, используйте данные выборки в качестве обучающего набора и займитесь бэктестингом данных. Данные, не входящие в выборку, используются в качестве тестового набора для проверки. Если исторических данных мало, можно также использовать метод перекрестного тестирования.
Если вы обнаружили, что данные за пределами выборки не работают хорошо, но вы считаете, что жаль отказываться от модели или вы не хотите признавать, что ваша модель плоха, и продолжаете оптимизировать модель за пределами выборки - данные, не входящие в выборку, пока они не начнут работать так же хорошо на данных вне выборки, тогда в конечном итоге пострадает тот, кто... Это должны быть ваши реальные деньги.
Ошибка выжившего
Ошибка выжившего может быть объяснена следующими примерами:
- Если встать в правильном месте, даже свиньи смогут летать.
- Все отзывы о парашютах, продаваемых через интернет, положительные, потому что нет ни одного человека, у которого возникли бы проблемы с парашютами.
- Репортеры опрашивали людей в автобусе, чтобы узнать, купили ли они билеты, поскольку те, кто не мог купить билеты, вообще не могли сесть в автобус.
- Средства массовой информации пропагандируют возможность выигрыша в лотерею, поскольку средства массовой информации не будут активно пропагандировать людей, которые не выиграли в лотерею.
Из приведенных выше примеров мы видим, что информация, которую люди обычно получают, на самом деле была проверена, что приводит к выборочному игнорированию большого количества данных или образцов. В результате выводы, основанные на ошибке выжившего, отклонились от реального времени. Затем в количественной торговле нам также нужно рассмотреть, является ли результат бэктеста результатом удачи. Во многих случаях результат бэктеста может быть лучшим результатом всего бэктеста. Обратите внимание на следующую картинку:

Картинка слева — очень хорошая торговая стратегия. Она имеет хорошую кривую капитала, не имеет больших просадок и может получать стабильную прибыль. Но, пожалуйста, посмотрите на картинку справа, это просто самая результативная из сотен торговых бэктестов. С другой стороны, когда мы смотрим на финансовый рынок, там всегда больше звезд, чем долгоживущих. Если стратегия трейдера соответствует рыночным условиям, то рыночные условия каждого года могут создавать партию звезд, но это редко можно увидеть звезду, которая может быть долгоживущей более трех лет подряд. Именинник со стабильной прибылью.
Влияние на стоимость
Если вы не размещаете отложенный ордер, во время торговли вы можете столкнуться с проскальзыванием цены. Для активно торгуемых продуктов цена спроса и цена предложения обычно отличаются на один пункт. Для менее активно торгуемых продуктов спред может быть больше. Каждый раз, когда вы хотите активно торговать, вам нужен как минимум один спред, а то и больше. Однако при бэктестинге нам не нужно рассматривать вопрос транзакции. Пока есть сигнал, транзакция может быть завершена. Поэтому для имитации реальной торговой среды необходимо добавить хотя бы одно проскальзывание.
Особенно для стратегий с относительно высокой частотой торговли, при бэктестинге стратегии, если проскальзывание не включено, кривая капитала всегда будет наклонена вверх. Как только добавляется разумное проскальзывание, оно немедленно превращается в убыток. Кроме того, это явление вызвано не только проблемой спреда. В реальной торговой среде необходимо учитывать такие вопросы, как задержка сети, программные и аппаратные системы, а также отклик сервера.
Политика Пропускной способности
Одна и та же стратегия может иметь совершенно разные или даже противоположные результаты на эффективных и неэффективных рынках. Например, на неэффективных рынках, таких как внутренний фондовый рынок, товарные фьючерсы и иностранные цифровые валюты, емкость высокочастотных стратегий сама по себе не очень велика из-за небольшой базы объема торговли. Если больше людей будут их использовать, то будет не будет никакой маржи прибыли, и даже оригинальные высокочастотные стратегии не будут прибыльными. Прибыльная стратегия превращается в убыточную. Однако на эффективном валютном рынке есть место для множества различных типов высокочастотных стратегий.
Выше перечислены проблемы и подводные камни, которые могут возникнуть при разработке и использовании стратегии. Для опытного разработчика торговых систем бэктестинг является обязательным. Потому что он может сказать вам, можно ли подтвердить эффективность стратегической идеи в исторических транзакциях. Однако зачастую бэктестинг не гарантирует будущей прибыльности. Поскольку в бэктестинге слишком много подводных камней, вы не поймете его, пока не потратите деньги на то, чтобы извлечь некоторые уроки. И эти уроки усваиваются с реальными деньгами. Этот курс, по крайней мере, поможет вам избежать многих количественных ошибок и ловушек.
4.2 Установление оптимального управления позицией
В «Воспоминаниях биржевого спекулянта» есть интересный эпизод: Старый Индюк (первоначально его звали Партридж), работавший в той же компании ценных бумаг, что и главный герой Ливермор, всегда совершал крупные покупки и продажи. Всякий раз, когда кто-то предлагал ему Продать его после получить прибыль, а затем выкупить ее обратно после того, как цена акций упадет. Старый Индейец всегда искренне говорит: «Нет, вы знаете, это бычий рынок!»
Даже Ливермор наконец вздохнул: Нет ничего хорошего в том, чтобы правильно предсказать тренд. На рынке всегда можно найти много людей, которые были настроены по-бычьи на бычьем рынке и по-медвежьи на медвежьем рынке. Но они всегда умеют торговаться с рынком, стараясь купить по самой низкой цене и продать по самой высокой. Как и в случае со старой индейкой, те, кто действительно зарабатывает большие деньги, это те, кто правильно видит рынок и крепко держит свои позиции. Это также самая сложная вещь, которой нужно научиться. Это касается не только выбора целей и времени, но и более важного вопроса: насколько большой должна быть позиция (риск)?
У всех неудачливых трейдеров однобокое мышление. При торговле жадные люди смотрят только на выгоды, а не на риски, в то время как робкие люди смотрят только на риски, а не на выгоды. Те, кто одновременно и жадные, и робкие, забывают о рисках, когда Рынок растет. Забудьте о росте на пути вниз. Но успешные трейдеры учитывают как риск, так и вознаграждение, то есть на каждый заработанный доллар они берут на себя несколько долларов риска. Тогда показателем для измерения доходности и риска является соотношение доходности и риска.
Многие знают, что чем больше прибыль, тем больше риск, то есть доходность пропорциональна риску. По мнению некоторых людей, соотношение между доходностью и риском должно быть следующим: горизонтальная ось представляет процент риска, а вертикальная ось — процент прибыли:

Однако в реальных сделках доходность и риски далеки от того, чтобы быть такими простыми, как прямая линия между двумя точками, по крайней мере, они не всегда движутся линейно. Реальный риск — это максимальный убыток, который вы можете понести при ожидаемой доходности, то есть то, что мы называем максимальной волатильностью. Хотя иногда максимальный плавающий убыток не обязательно равен убытку на момент закрытия сделки, максимальный плавающий убыток реален.
Из этого мы можем узнать, что соотношение прибыли и риска на рисунке выше не является истинным представлением. В реальной торговой среде соотношение прибыли и риска должно быть таким, как показано на рисунке ниже:

Давайте посмотрим на картинку выше. Желтая кривая представляет собой колебание чистой стоимости при различных рисках. Поскольку ожидаемая доходность продолжает расти, риск также постепенно растет. Если мы установим банкротство на уровне 0,5, что означает, что максимальный убыток достигнет 50%, то это провальная торговая стратегия. Хотя конечная прибыль от этой стратегии положительная, на самом деле она обанкротилась в середине пути.
Даже если ваша стратегия является стратегией положительного ожидания, она все равно обанкротится из-за неправильного управления позициями. Так что с этой точки зрения, сколько покупать или продавать важнее, чем когда покупать или продавать. Как управлять позициями с научной точки зрения стало фундаментальным вопросом в финансовых транзакциях. Поэтому прежде чем попытаться решить эту проблему, давайте рассмотрим, как делать ставки в азартных играх с научной точки зрения.

Возьмем в качестве примера подбрасывание монеты. Если предположить, что обе стороны монеты имеют одинаковый вес, то если выпадет лицевая сторона, то прибыль составит 2 юаня, а если выпадет обратная сторона, то убыток составит 1 юань. Очевидно, что это игра с положительным ожиданием, с вероятностью выигрыша 50% и проигрышем 2 юаня. Возникает вопрос: теперь у вас есть 100 юаней, как вы можете делать ставки неоднократно, чтобы 100 юаней достигли 1 миллиона юаней как можно быстрее?
Если мы не подумаем об этом как следует, то подумаем, что поскольку прибыль от каждой ставки составляет 50%,*2-50%*1, что составляет 50%. Для того, чтобы быстро получить максимальную прибыль, следует вкладывать как можно больше капитала в каждую азартную игру. Ставка должна быть 100%.
Но очевидно, что неразумно вкладывать 100% капитала в каждую азартную игру, поскольку если вы проиграете хотя бы один раз, капитал пропадет, даже если вероятность этого очень мала. Потому что, если вы играете достаточно часто, проигрыш денег неизбежен.
Кто-то может спросить: если ставка в 100% неразумна, то как насчет ставки в 90% или ниже? На самом деле, чтобы решить эту проблему, мы можем провести эксперимент, смоделировав эту азартную игру, и посмотреть, каковы результаты каждой ставки. Как показано на следующем рисунке:
Из рисунка видно, что когда мы постепенно уменьшаем позицию с 90%, 80%, 70%, 60% и 50%, результаты одной и той же ставки совершенно разные. Осторожные друзья, возможно, уже заметили, что по мере того, как позиция постепенно сокращается, конечные средства на самом деле постепенно увеличиваются.
Кто-то может спросить, не лучше ли ставить меньше каждый раз, например, 10%? Вы же не можете рассчитать все коэффициенты ставок, верно? Это проблема, которую призвана решить знаменитая формула Келли. В статистике формула Келли может максимизировать долгосрочные темпы роста стратегии с положительным ожидаемым повторным ставкам путем расчета оптимального коэффициента ставок в каждой игре.
Более того, если предположить, что основной капитал и ставка могут быть разделены бесконечно, то использование формулы Келли сделает невозможным банкротство в любой азартной игре. Особенно в реальном применении финансовых транзакций это стратегия управления позицией, которая сочетает в себе как наступление, так и защиту. Давайте посмотрим, как рассчитывается формула Келли, взгляните на следующую картинку:
- f — оптимальный коэффициент ставки существующего основного долга
- b — коэффициент, который также можно назвать соотношением прибыли и убытка в торговле.
- p — показатель успешности
- q — интенсивность отказов
Затем мы можем использовать формулу Келли для расчета примера азартных игр в этом классе. При начальном капитале в 100 юаней, если процент выигрышей составляет 50%, а коэффициент равен 2, какой коэффициент ставок следует использовать, чтобы сделать капитал наиболее прибыльно? Самая быстрая скорость достигает 1 миллиона юаней. Используя формулу Келли, процесс расчета выглядит так:
(0.5*(2+1) -1)/2=0.25
Коэффициент выигрыша 50% равен 0,5, умноженному на коэффициент 2 плюс 1, затем вычтенному 1 и, наконец, разделенному на 2. Результат равен 0,25, что означает, что в каждой азартной игре 25% от основного капитала используется для ставок. Максимальная скорость может достигать 1 миллиона юаней. Мы можем вручную смоделировать его на основе результатов расчетов, чтобы проверить его правильность.
Картинка выше — результат ручного моделирования. Посмотрите на последнюю строку. Для той же ставки после более чем 100 раундов 25% позиций впервые достигли 1 миллиона юаней. Результаты 90%, 80%, 70% и 60% позиций отрицательные, что в полной мере демонстрирует, что даже торговая стратегия с положительным ожиданием обанкротится из-за неправильного управления позициями.
Мы также видим, что 50% позиций в конечном итоге не проиграют и не выиграют, что также соответствует результату закона больших чисел. Чтобы еще больше проиллюстрировать проблему, в ходе ручного моделирования была также добавлена позиция 10%. Хотя конечный результат был положительным, эффект был на несколько порядков хуже, чем у позиции 25%.
Вы увидели силу формулы Келли. Если вы выбираете 10% основной позиции в реальном применении, то в более чем 100 ставках ваш основной станет больше 30 000. Хотя прибыль огромна, Однако, по сравнению с результатом 25% основной позиции эквивалентно отсутствию прибыли. Это сила знания.
Если вы хотите использовать формулу Келли, чтобы зарабатывать деньги в жизни, вам нужно соответствовать условиям применения формулы Келли. Нет сомнений, что эта азартная игра должна исходить от финансового рынка. В частности, в количественной торговле с помощью бэктестинга исторических данных можно приблизительно рассчитать соответствующий процент выигрышей и коэффициенты.
Конечно, фактическое применение формулы Келли в финансовых транзакциях не так просто. Есть еще много деталей, с которыми нужно разобраться, например, стоимость средств в кредитных транзакциях, невозможность разделить средства и позиции в реальных транзакциях, и разница между выигрышным коэффициентом и позицией в транзакциях. Коэффициенты меняются динамически и т. д. Но, несмотря ни на что, формула Келли показывает нам, как определить наилучший метод управления позициями.
















