Хотя обсуждение было в основном посвящено максимизации функции пригодности, все вышесказанное применимо и к минимизации расходов. Любая техника максимизации может быть применена для минимизации, и наоборот: умножьте функцию пригодности на –1 для получения эквивалентной функции расходов; умножьте функцию расходов на –1, и получится функция пригодности. Если вам нравится алгоритм минимизации, но нужно применять максимизацию; можно использовать этот фокус вместо перекодировки алгоритма оптимизации.
 
   Линейное программирование
   Методы линейного программирования разработаны для проблем оптимизации, затрагивающих линейные функции пригодности или расходов с линейными ограничениями параметров или входных переменных. Линейное программирование обычно используется для решения задач по распределению активов. В мире трейдинга одно из возможных применений линейного программирования состоит в поиске оптимального размещения денежных средств в различные финансовые инструменты для получения максимальной прибыли. Если оптимизировать прибыль с учетом возможного риска, то применять линейные методы нельзя. Прибыль с поправкой на риск не является линейной функцией весов различных инвестиций в общем портфеле, здесь требуются другие методы, к примеру генетические алгоритмы. Линейные модели редко бывают полезны при разработке торговых систем и упоминаются здесь исключительно в ознакомительных целях.

Как потерпеть неудачу при оптимизации

   Большинство трейдеров не стремится к проигрышу – по крайней мере осознанно. Знание причин неудачи помогает ее избежать. Потерпеть неудачу при использовании оптимизатора очень просто, если соблюдать следующие правила. Во-первых, используйте маленькие (и поэтому непредставительные) выборки данных для тестирования. Во-вторых, убедитесь, что у системы много правил и параметров для оптимизации. Для любого исторического периода несложно получить отличный результат при наличии большого количества параметров в системе. Кроме того, проводите все тесты на одном образце данных. Ни в коем случае не проверяйте ваши результаты на данных, расположенных вне пределов исходной выборки. И наконец, избегайте статистических заключений. Следуя эти правилам, вы обязательно потеряете деньги, применив «оптимизированную» систему в реальной торговле.
   Чем будет вызвана неудача? В большинстве случаев система будет работать великолепно при тестировании, но плохо при реальной торговле. Специалисты по разработке нейронных сетей называют это «слабой генерализацией»; трейдеры знакомы с этим явлением по частым опустошениям денежного счета у брокера. Одно из последствий такого неудачного исхода – распространенное заблуждение о вреде оптимизации вообще.
   На самом же деле оптимизаторы не опасны, и не каждой оптимизации следует бояться. Опасна только неправильная оптимизация – как это бывает при попытках оптимизировать множество параметров на маленькой выборке данных, без проведения тестов за пределами выборки или статистического подтверждения – просто плохая практика, по ряду причин приводящая к разорительным результатам.
 
   Небольшие выборки
   Рассмотрим влияние на оптимизацию мелких выборок. Небольшие выборки рыночных данных вряд ли будут представительными для того рынка, который призваны охарактеризовать; следовательно, они будут заметно отличаться от других выборок данного рынка. Оптимизатор, запущенный с маленькой выборкой данных, верой и правдой будет искать лучшее решение и найдет его. Но лучшее решение для пробного образца может оказаться разрушительным для реальной торговли. Неудача произойдет не потому, что оптимизация получила неверное решение, а потому, что она получила решение некорректно поставленной задачи.
   Оптимизация неадекватных выборок также часто дает ответы, представляющие собой чисто математические артефакты. Когда количество точек с данными стремится к количеству настраиваемых параметров, большинство моделей (торговых, регрессионных или других) найдут идеальное решение для любого набора случайных данных. Здесь действует тот же принцип, который гласит, что линия (модель с двумя параметрами) может быть проведена через любые две точки, но не всегда может быть проведена через три произвольные точки. В статистике это известно как принцип степеней свободы; степеней свободы столько, на сколько общее количество точек данных в выборке превышает то количество точек, в которые всегда можно идеально вписать оптимизируемую модель благодаря подгонке параметров. Даже когда данных достаточно много для того, чтобы избежать полностью артефактного решения, некоторая часть пригодности модели тем не менее может быть обусловлена артефактами как побочным продуктом процесса оптимизации.
   Для моделей множественной регрессии существует формула, показывающая, насколько уменьшится коэффициент корреляции (показатель пригодности модели), если удалить артефактную составляющую. Формула коррекции, определяющая связь между количеством параметров (коэффициентов регрессии), подвергающихся оптимизации, размером выборки и снижением уровня кажущейся пригодности при испытании на другой выборке, представлена в виде формулы, написанной на языке FORTRAN:
   В этом уравнении N означает количество точек данных, P – количество параметров модели, R – коэффициент множественной корреляции, определенный на выборке данных процедурой оптимизации, RC – скорректированный коэффициент. Обратная формула, показывающая увеличение корреляции, вызванное оптимизацией (R), в зависимости от подлинной корреляции () выглядит следующим образом:
   Эти формулы справедливы только для линейной регрессии. Тем не менее их можно использовать для оценки качества генерализации, проводимой полностью обученной нейронной сетью (т. е. частным случаем нелинейной регрессии). При работе с нейронными сетями P будет означать общее количество весов связей в модели. Кроме того, убедитесь, что этими формулами используются простые корреляции; если нейронная сеть или регрессионная программа возвращает квадраты корреляций, следует извлечь квадратный корень.
 
   Большие наборы параметров
   Излишне большой набор свободных параметров или правил влияет на попытку оптимизации так же, как и недостаточное количество точек данных. Когда количество элементов, подвергающихся оптимизации, повышается, пропорционально растет способность модели подгонять их под любые неоднородности тестовой выборки, а следовательно, увеличивается вклад артефактов в эффективность модели. Результат оптимизации большого количества параметров или правил будет хорошо работать на тестовых данных, но плохо на данных вне выборки и в реальной торговле.
   Важно учитывать не общее количество параметров оптимизации, а отношение количества этих параметров к объему данных. Здесь также эвристически достоверна описанная выше формула для малых выборок: она показывает, как соотношение числа точек данных и параметров системы влияет на результат. При наличии избыточного количества параметров решение, полученное в результате оптимизации, будет оптимальным только для тестовой выборки данных.
 
   Отсутствие подтверждения
   Один из лучших способов попасть в беду – не проверить результаты при помощи тестов на данных, взятых вне оптимизационной выборки. Без такого подтверждения ошибочные решения, вызванные недостаточной выборкой или избытком параметров, не говоря уж о менее ясных причинах, будут не замечены вовремя. Торговая система, дающая на некотором образце данных высокие результаты, будет применена к реальной торговле, и в результате вы понесете тяжелые убытки. Трейдер, разрабатывающий системы без проверки на данных вне выборки, похож на пилота, управляющего неизвестной ему моделью самолета с завязанными глазами.

Как достичь успеха при оптимизации

   Во избежание провала и для увеличения вероятности успеха при оптимизации следует предпринять четыре шага. Во-первых, оптимизировать систему на максимально доступном представительном образце данных и использовать для анализа большое число виртуальных сделок. Во-вторых, использовать небольшое количество параметров (особенно с учетом размера выборки данных). В-третьих, провести тестирование на данных вне выборки, т. е. на данных, которые вы не использовали при оптимизации и, более того, не видели в глаза. В-четвертых, стоит провести оценку статистической значимости результатов.
 
   Большие представительные выборки
   Как было сказано выше, неудача часто возникает из-за некорректности задачи, поставленной перед оптимизатором. Следовательно, успех вероятен в случае нахождения правильного решения корректной задачи. Можно заключить, что торговые модели нужно оптимизировать на данных из ближайшего будущего. К сожалению, авторам книги неизвестен способ получения таких данных.
   Поскольку будущее еще не наступило, нельзя дать оптимизатору ту задачу, которую предстоит решать системе в процессе реальной торговли. Следовательно, требуется дать оптимизатору задание, решение которого было бы применимо к реальной торговле с максимальной степенью приближенности. Один из способов достичь этого состоит в том, чтобы использовать данные из прошлого, включающие характеристики, которых можно ожидать в будущем, т. е. бычьи и медвежьи периоды, периоды с трендами и без них и даже обвалы цен. Кроме того, данные должны быть максимально свежими для отражения текущих процессов на рынке. Такую выборку можно считать представительной.
   Помимо репрезентативности выборка должна быть достаточно велика. Большие выборки снижают вероятность возникновения артефактов или случайных результатов системы при оптимизации. Эффективность торговой системы, оптимизированной на большой выборке, не будет сильно отличаться от ее эффективности в реальной торговле.
   Впрочем, иногда приходится делать выбор между размером выборки и степенью ее репрезентативности. Увеличение размера выборки приводит к использованию старых ценовых данных, значимость которых для представления современного состояния рынка весьма сомнительна. В некоторых случаях существует четкая грань, за которой данные теряют значимость. Например, фьючерсы на индекс S&P 500 начали обращение на рынке в 1983 г., что оказало структурное влияние на рынок в целом. Это наблюдение становится менее важным при работе с внутридневной ценовой историей, где за относительно короткий период времени можно собрать данные о десятках и сотнях тысяч баров, не углубляясь в прошлое слишком далеко.
   В конце напоминаем, что при проведении оптимизаций и тестов следует учитывать количество сделок, проведенных системой. Как и объем выборок данных, количество сделок для достоверности должно быть значительным. Если система совершает всего несколько сделок, то, несмотря на количество точек данных в выборке, результат может оказаться следствием случайностей или артефактов!
 
   Минимум правил и параметров
   Для достижения успеха следует ограничивать число оптимизируемых правил и параметров, особенно при работе на небольших выборках данных. Чем меньше правил и параметров, тем больше вероятность устойчивой эффективности решений как на материале выборки, так и за ее пределами. Хотя при работе с несколькими тысячами сделок (1 год S&P 500 содержит примерно 100 000 одноминутных баров) можно оптимизировать несколько десятков параметров, при использовании данных на конец дня за несколько лет даже два-три параметра могут оказаться излишними. Если данная модель требует оптимизации многих параметров, то следует приложить усилия к сбору колоссального объема данных. Легендарный Ганн, как говорят, собрал данные по цене на пшеницу за тысячу лет. При невозможности использовать большие объемы данных следует проводить оптимизацию системы на портфеле нескольких финансовых инструментов с использованием одних и тех же правил и параметров на всех рынках – эта методика широко использована в данной книге.
 
   Подтверждение результатов
   После оптимизации правил и параметров торговой системы и получения хорошей эффективности на выборке данных важно так или иначе подтвердить эффективность этой системы, прежде чем рисковать реальными деньгами. Подтверждение дает трейдеру еще один шанс отказаться от неудачного решения. От систем, которые не подтвердили себя, следует отказываться, а использовать лишь подтвержденные. Подтверждение – критический шаг на дороге к успеху при оптимизации и при любом методе совершенствования работы торговой системы.
   Для гарантии успеха любое решение следует подтверждать тестами на данных вне выборки или статистическим анализом, но предпочтительно – обоими методами. Отбросьте любое решение, которое не будет прибыльным в тесте на данных, не входящих в первоначальную выборку, – при реальной торговле оно, скорее всего, провалится. Рассчитывайте статистическую значимость всех тестов – и в пределах выборки данных, и вне ее. Оценка статистической значимости показывает вероятность того, что пригодность системы на выборке данных соответствует ее пригодности в других условиях, включая реальную торговлю. Статистический анализ работает по принципу распределения вероятностей прибылей в сделках, совершаемых системой. Используйте только статистические методы, скорректированные для множественных тестов, когда анализируете результаты тестов в пределах выборки. Тесты вне пределов выборки следует оценивать стандартными, некорректированными методами. Подобные отчеты приводились в главе, посвященной симуляторам. Займитесь изучением статистики; это улучшит ваши трейдерские качества.
   Некоторые советуют проверять модель на чувствительность к малым изменениям параметров. Модель, которая малочувствительна к таким изменениям, считается «высоконадежной». Не обращайте на подобные заявления слишком много внимания. Фактически устойчивость к изменению параметров не может служить показателем надежности системы. Многие чрезвычайно надежные модели весьма чувствительны к изменениям некоторых параметров. Единственно достоверный показатель надежности системы – статистика, в особенности результаты тестов на данных вне пределов выборки.

Альтернативы традиционной оптимизации

   Существуют два альтернативных традиционной оптимизации подхода – это оптимизация с прогонкой вперед и самоадаптивные системы. Обе эти методики имеют то преимущество, что практически все тестирование проводится вне пределов выборки. Оцените результативность системы, проведите несколько статистических тестов, постройте график изменения капитала – и система готова к торговле. Все чисто и математически безукоризненно. Про коррекцию коэффициентов корреляции, множественные тесты, чрезмерную подгонку системы под ценовые данные и другие проблемы можно просто забыть. Более того, с современной компьютерной техникой модели с прогонкой вперед и самоадаптивные модели становятся практичными и даже несложными.
   Принцип оптимизации, или тестирования с прогонкой вперед, состоит в эмуляции шагов, действительно производимых системой, требующей периодической оптимизации. Метод работает следующим образом. Оптимизируйте систему на точках данных от 1 до М. Затем проведите виртуальную торговлю в точках данных от М + 1 до М + К. Повторно оптимизируйте систему на точках от К + 1 до К + М. Затем промоделируйте торговлю в точках от (К + М) + 1 до (К + М) + К. Пройдите таким образом через всю выборку данных. Как следует из примера, сначала оптимизируется система, потом моделируется торговля. Через некоторое время система снова оптимизируется, и торговля возобновляется. Эта последовательность гарантирует, что торговля всегда происходит на данных, более поздних, чем данные, использовавшиеся для оптимизации. Практически все сделки происходят на данных вне пределов выборки. При тестировании с прогонкой вперед М – окно оптимизации (или исторического обзора), а К – интервал повторной оптимизации.
   Самоадаптивные системы работают подобным образом, но в этом случае оптимизация или адаптивный процесс – часть системы, а не тестовой программы. Как только поступает новая точка данных, самоадаптивная система обновляет свое внутреннее состояние (правила или параметры) и затем принимает решение относительно следующей точки данных. При поступлении следующих данных выполняются принятые решения, и процесс повторяется. Внутренние изменения, при помощи которых система изучает рынок и адаптируется к нему, могут происходить не в каждой точке, а, например, в некоторые фиксированные моменты времени.
   Трейдер, планирующий использовать самоадаптивные системы, должен иметь мощную, основанную на компонентах платформу с использованием развитого языка программирования (С++, Object Pascal или Visual Basic) с возможностью доступа к библиотекам и компонентам третьих производителей. Эти компоненты рассчитаны на встраивание в создаваемые пользователем программы, включая специальные программы адаптивных систем. Чем больше компонентов доступно, тем меньше работы: как минимум трейдер, пытающийся использовать самоадаптивные системы, должен иметь доступ к генетическому оптимизатору и симулятору, которые могут быть легко встроены в модель. Адаптивные системы будут рассмотрены в следующих главах, показывая, как этот метод работает на практике.
   Несомненно, что системы с прогонкой вперед и самоадаптивные системы приобретут большую популярность в будущем с ростом эффективности рынков и сложности работы на них, а также с расширением доступности для рядовых трейдеров коммерческого программного обеспечения на их основе.

Инструменты и информация для оптимизации

   Аэродинамика, электроника, химия, биохимия, планирование и бизнес – это только некоторые из областей, где используется оптимизация. Поскольку оптимизация важна для такого количества приложений, в этом направлении ведется множество исследований, создано множество инструментов и накоплено много информации. Где же можно найти эту информацию? Какие существуют доступные продукты и инструменты?
   Оптимизаторы с лобовым подходом обычно встроены в программные пакеты, нацеленные на другие задачи, и редко доступны по отдельности. В мире программ для трейдинга такие оптимизаторы встроены в TradeStation и SuperCharts фирмы Omega Research (800-292-3453), Excalibur фирмы Futures Truth (828-697-0273) и MetaStock фирмы Equis International (800-882-3040). Если вы пишете собственные программы, при помощи несложного программирования написать алгоритм лобовой оптимизации можно безо всяких дополнительных библиотек. Программы и алгоритмы для оптимизации с лобовым подходом также полезны при проведении оптимизации под управлением пользователя.
   Хотя иногда генетические оптимизаторы бывают встроены в специализированные программы, они чаще встречаются в виде компонентов или библиотек классов, дополнений к различным пакетам или самостоятельных исследовательских инструментов. Примером библиотеки классов с учетом компонентного использования может служить OptEvolve, генетический оптимизатор на С++ фирмы Scientific Consultant Services (516-696-3333): этот многоцелевой генетический оптимизатор использует несколько алгоритмов, включая дифференциальную эволюцию, и продается в виде портативного кода на С++, пригодного для UNIX/LINUX, DOS и Windows. TS-Evolve фирмы Ruggiero Associates (800-211-9785) дает пользователям TradeStation возможность провести полноценную генетическую оптимизацию. Evolver фирмы Palisade Corporation (800-432-7475) представляет собой многоцелевой генетический оптимизатор для таблиц MS Excel; с ним поставляется DLL-библиотека, которая может быть использована с любой программой на любом языке, способной вызывать функции DLL. Так, программа GENESIS, написанная Джоном Грефенштеттом (John Grefenstette) из Naval Research Laboratory, представляет собой самостоятельный инструмент для исследователей и доступна в виде исходных кодов. Хотя генетические оптимизаторы могут включаться в состав пакетов моделирования для химиков и в другие специализированные продукты, они до сих пор не включены как стандартный компонент в программные пакеты для трейдеров.
   О генетических оптимизаторах существует достаточно много доступной информации. Генетические алгоритмы обсуждаются в ряде книг, журналов и изданий, на сайтах новостей в Интернете. Хороший анализ проблемы дан в книге Девиса Handbook of Genetic Algorithms (Davis, 1991). Прайсом и Стормом (Price и Storm, 1997) описан алгоритм для метода «дифференциальной эволюции», который оказался чрезвычайно мощным инструментом для задач оптимизации с рациональными параметрами. Генетические алгоритмы сейчас являются темой многих научных изданий и конференций. Оживленные дискуссии ведутся на страницах ряда новостных сайтов в Интернете, из которых наиболее примечателен comp.ai.genetic.
   Основы метода моделирования отжига приведены в книге Пресса и др. Numerical Recipes for C (Press et al., 1992) вместе с функциями для написания оптимизаторов с этим алгоритмом для комбинаторных задач и задач с рациональными параметрами. Книга Мастерса Neural, Novel & Hybrid Algorithms for Time Series Prediction (Masters, 1995) также содержит рассмотрение задач моделирования отжига, причем коды представлены на CD-приложении к книге. Как и генетическая оптимизация, моделирование отжига также является темой многих научных исследований, докладов на конференциях, статей и дискуссий в Интернете.
   Алгоритмы весьма сложных методов – сопряженных градиентов и переменной метрики – можно найти в иссследованиях Пресса и др. Numerical Recipes for C (Press et al., 1992) и Numerical Recipes (Press et al., 1986). Большой ассортимент процедур аналитической оптимизации содержится в уже упомянутом труде Мастерса Neural, Novel & Hybrid Algorithms for Time Series Prediction (Masters, 1995) и на прилагаемом к нему диске. Дополнительные процедуры для аналитической оптимизации доступны в составе библиотек IMSL и NAG (Visual Numerics и Numerical Algorithms Corp. соответственно) и в составе оптимизационного набора для MATLAB (многоцелевого математического пакета от Math Works, 508-647-7000, очень популярного в среде занимающихся финансовым планированием). Кроме того, в MS Excel встроен Solver – аналитический оптимизатор, основанный на методе Ньютона и сопряженных градиентах.
   Как источник общей информации об оптимизации при разработке торговых систем можно порекомендовать книгу Роберта Пардо Design, Testing and Optimization of Trading Systems (Robert Pardo, 1992). Кроме прочего, в книге приведены примеры прибыльной оптимизации, избежания чрезмерной подгонки системы под ценовые данные и проведения тестов с прогонкой вперед.

Какой оптимизатор подходит вам?

   Как минимум любому трейдеру следует иметь оптимизатор с возможностью проведения лобовой оптимизации и оптимизации под управлением пользователя. Если вы используете для разработки систем TradeStation или Excalibur, эти оптимизации вам уже доступны. С другой стороны, если вы используете Excel, Visual Basic, C++ или Delphi, вам придется разрабатывать собственный оптимизатор. Как показано выше, это достаточно просто, и для многих проблем лобовая оптимизация или оптимизация под управлением пользователя – лучший подход.
   Если для разработки вашей системы требуются более продвинутые методы, хороший выбор – генетический оптимизатор. При помощи лобового подхода и генетического оптимизатора можно решить практически любую задачу. В нашей работе мы почти не используем других инструментов! Пользователям TradeStation придется по вкусу TS-Evolve, предлагаемый Ruggiero Associates. Evolver фирмы Palisade Corporation хорош для пользователей Excel и Visual Basic. При разработке систем на С++ или Delphi выбирайте C++ Genetic Optimizer, предлагаемый Scientific Сonsultant Services, Inc. Генетический оптимизатор – наиболее универсальный инструмент среди оптимизаторов: даже задачи, более эффективно решаемые другими методами, могут быть медленно, но верно решены хорошим генетическим алгоритмом.
   А если вы все же хотите испытать аналитическую оптимизацию или симуляцию отжига, мы рекомендуем воспользоваться книгой Пресса и др. Numerical Recipes in C (Press et al., 1992) и вышеупомянутым трудом Мастерса (Masters, 1995) как источниками и информации, и кодов. Пользователи Excel могут попробовать также встроенный Solver.

Глава 4. Статистика

   Многие разработчики торговых систем не оценивают статистическую значимость результатов оптимизации. Это достаточно неприятно, учитывая, что статистика принципиально важна при оценке поведения торговых систем. Как, например, можно судить о причине успеха системы – реален ли он или основан на артефакте либо на «удачной» выборке данных? Задумайтесь об этом, ведь следующая выборка может быть не очередным тестом, а реальной торговлей. Если поведение системы определялось случаем, можно быстро лишиться капитала. Нужно найти ответ на следующий очень важный вопрос: высокая эффективность системы вызвана обнаружением по-настоящему оптимальных параметров или является результатом «подгонки» под исторические данные? Мы встречали много разработчиков систем, которые отказываются от любой оптимизации вообще по причине иррационального страха подгонки, не зная, что статистический анализ помогает бороться с этой опасностью. В общем, статистика может помочь трейдеру оценить вероятность того, что система в будущем будет работать так же прибыльно, как и в прошлом. В этой книге мы представили результаты статистического анализа везде, где это, по нашему мнению, полезно и уместно.