Финансовая лаборатория

Биржевая торговля и торговые роботы


При создании торговых стратегий Вам нужно не только решать вопрос о том, какие индикаторы использовать, но и самое главное - какие параметры для индикаторов нужно применять для того, чтобы торговая стратегия приносила прибыль. Действительно, скользящая средняя с малым периодом усреднения будет генерировать торговые сигналы намного чаще чем та же самая скользящая средняя с периодом усреднения в несколько раз больше.

Для того, чтобы узнать - какие параметры индикаторов являются наиболее подходящими нужно изучить результаты тестирования стратегии с разными величинами. Вручную это был бы очень долгий, можно сказать - бесконечный процесс. Однако программа Wealth-Lab имеет целый арсенал средств для работы с параметрами торговых стратегий.

Параметры торговых систем

Параметры торговой стратегии (сокращенно называются - СТРАПы) дают возможность быстро, буквально на лету выполнить оптимизацию торговой стратегии используя удобные ползунки, которые располагаются в самом низу панели данных.

Что такое оптимизация торговых стратегий?

Процесс оптимизации торговой стратегии предполагает неоднократный запуск этой стратегии с использованием ряда различных значений параметров и сбор результатов каждого запуска.

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

В Wealth-Lab 6.3 Вы можете оптимизировать стратегию используя любое количество параметров (конечно же в рамках допустимого лимита времени и компьютерной памяти) для одного финансового инструмента либо для набора данных (DataSet) при бектестинге одновременно нескольких финансовых инструментов.

Wealth-Lab по умолчанию имеет два разных метода оптимизации: полный (Exhaustive) и метод Монте-Карло (об этих методах речь пойдет далее). Но хочется упомянуть, что можно использовать и другие методы оптимизации, которые создают сторонние разработчики.

Как: добавить в торговую стратегию, разработанную в программе Wealth-Lab оптимизируемые параметры

Добавить параметры оптимизации для торговой стратегии очень просто - просто выполняйте шаги, которые изложены далее.

Метод 1: автоматический метод создания параметров торговой стратегии

В окне, где располагается график стратегии захватите мышкой и бросьте на график один или более индикаторов. Для того, чтобы автоматически сгенерировать код графика и увидеть слайдеры (ползунки, которые устанавливают значение оптимизируемых параметров), нужно сделать следующее:

После того, как Вы "бросили" на график индикаторы, Вы можете с помощью простого нажатия кнопки на панели инструментов функций получить код этих индикаторов и увидеть этот код в окне редактора стратегий. Имея доступ к коду отображения индикаторов, Вы автоматически получаете и синтаксис этих индикаторов, благодаря чему Вы можете создать из этих индикаторов ряды данных (DataSeries), которые требуются для Вашей стратегии.

Помимо того, научившись преобразовывать индикаторы в их код, отображаемый в окне редактора стратегии, Вы приобретаете прекрасный способ автоматической генерации кода для слайдеров. Этот способ способен значительно экономить Ваше время в будущем.

Давайте более подробно рассмотрим - как это делается.

Предположим, что Вы собираетесь запрограммировать стратегию, которая использует в качестве индикаторов простую скользящую среднюю (SMA) и индикатор RSI. Конечно же, Вы можете использовать для этой цели построитель стратегий, однако в этот раз Вы хотите сделать это вручную.

Итак, какие же шаги нужно предпринять для этого:

1. Откройте новое окно графика (нажмите одновременно Ctrl+Shift+C)

2. "Бросьте" на график стандартные индикаторы SMA и RSI, изменив по Вашему желанию их параметры.

3. Нажмите на панели инструментов функций кнопку для получения кода. Нажатие этой кнопки приведет к автоматическому преобразованию графика в окно стратегии. Выполните эту появившуюся стратею и откройте окно с редактором стратегии.

Создание кода индикаторов

Полуавтоматический способ создания торговых параметров

4. Эти действия создают код стратегии, который отображает на графике все те индикаторы, которые Вы изначально размещали на графике, а также здесь будут созданы все операторы и переменные необходимые для создания слайдеров. В зависимости от того, какой шаблон кода стратегии у Вас установлен по умолчанию, код такой стратегии будет выглядеть следующим образом:

Пример (как выполнить пример приведенного кода)...


using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;

namespace WealthLab.Strategies
{
    public class MyStrategy : WealthScript
    {
        //Pushed indicator StrategyParameter statements (объявление переменных типа StrategyParameter для индикаторов)

        private StrategyParameter slider1;

        private StrategyParameter slider2;

        public MyStrategy()
        {

            //Pushed indicator CreateParameter statements (инициализация переменных типа StrategyParameter для индикаторов)
            slider1 = CreateParameter("SMA_Period_1", 50, 2, 200, 20);
            slider2 = CreateParameter("RSI_Period_2", 14, 2, 200, 20);
        }

        protected override void Execute()
        {
            for (int bar = 20; bar < Bars.Count; bar++)
            {
                if (IsLastPositionActive)
                {
                    //code your exit rules here (правила для выхода из позиции)
                }

                else
                {
                    //code your entry rules here (правила для входа в позицию)
                }
            }

            //Pushed indicator ChartPane statements (создание области на графике для индикаторов)

            ChartPane paneRSI1 = CreatePane(40, true, true);

            //Pushed indicator PlotSeries statements (отображение индикаторов на графике)

            PlotSeries(PricePane, SMA.Series(Low, slider1.ValueInt), Color.FromArgb(255, 128, 0, 0), LineStyle.Solid, 1);
            PlotSeriesOscillator(paneRSI1, RSI.Series(Close, slider2.ValueInt), 70, 30, Color.FromArgb(63, 0, 0, 255), Color.FromArgb(63, 255, 0, 0), Color.FromArgb(255, 0, 0, 128), LineStyle.Solid, 2);
        }
    }
}

5. В появившемся коде стратегии Вы увидите два метода PlotSeries*(), которые располагаются в самом низу кода. Скопируйте SMA.Series() и RSI.Series() внутри этих методов вместе со всеми их параметрами. Создав соответствующие ряды данных (DataSeries) и присвоив им скопированные значения, Вы сможете использовать эти ряды данных в Вашей стратегии. Готовый кусок кода будет выглядеть так:

Пример (как выполнить пример приведенного кода)...

DataSeries sma = SMA.Series(Low,slider1.ValueInt);
DataSeries rsi = RSI.Series(Close,slider2.ValueInt);

Обратите внимание, что этот кусок кода должен размещаться до торгового цикла.

Надеюсь, Вы убедились, что весь этот код может быть создан буквально за несколько секунд.

Метод 2: полуавтоматическое создание параметров

1. Из любого окна стратегии нажмите на ссылку "Optimize", которая располагается в левом нижнем углу статус бара.

В результате этого появится окошко "Optimization Control".

Вкладка управления оптимизацией

Вкладка управления оптимизацией (Optimization Control)

2. Используйте интерфейс окна оптимизации для:

  • добавления новых параметров;
  • регулирования величин параметров, которые будут использоваться по умолчанию;
  • начальных и конечных значений параметров оптимизации;
  • шага оптимизации

3. Нажмите на кнопку "Apply Changes to Code", что приведет к тому, что все Ваши пожелания будут внесены в код стратегии.

4. В готовом коде стратегии Вы можете получить доступ к значению параметров. Эти значения будут присвоены переменным strategyParameterN. Вы можете переименовать эти переменные по Вашему вкусу, придав им, к примеру, осмысленные названия.

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

Для получения дополнительной информации смотрите раздел "Optimize" в пользовательской инструкции.

Метод 3: ручное программирование параметров торговой стратегии

Давайте представим, что Вы работаете со стратегией, которая использует классическую схему с двумя простыми скользящими средними (SMA). Решение о сделках принимается при пересечении этих скользящих средних с разными периодами.

Переменными параметрами здесь будут периоды скользящих средних. Допустим, Вы хотите найти легкий способ регулирования этих периодов. В коде, который находится внизу начнем с рассмотрения этой простейшей стратегии, у которой еще нет страпов (нет параметров стратегии).

Пример (как выполнить пример приведенного кода)...

namespace WealthLab.Strategies
{
    public class MyStrategy : WealthScript
    {
        protected override void Execute()
        {
            int fastPer = 20; //период усреднения для быстрой скользящей средней
            int slowPer = 55; //период усреднения для медленной скользящей средней

            SMA smaFast = SMA.Series(Close, fastPer); //быстрая скользящая средняя (с коротким периодом усреднения)
            SMA smaSlow = SMA.Series(Close, slowPer); //медленная скользящая средняя

            PlotSeries(PricePane, smaFast, Color.Green, LineStyle.Solid, 2);
            PlotSeries(PricePane, smaSlow, Color.Red, LineStyle.Solid, 2);

            for (int bar = Math.Max(fastPer, slowPer); bar < Bars.Count; bar++)
            {
                if (IsLastPositionActive)
                {
                    if (CrossUnder(bar, smaFast, smaSlow)) //при пересечении короткой скользящей сверху вниз

                        SellAtMarket(bar + 1, LastPosition);
                }

                else
                {

                    if (CrossOver(bar, smaFast, smaSlow)) //при пересечении короткой скользящей снизу вверх

                        BuyAtMarket(bar + 1);
                }
            }
        }
    }
}

Шаг №1: объявляем переменные типа StrategyParameter

Сначала обратим внимание на класс с названием MyStrategy. Давайте изменим имя этого класса - дадим ему более осмысленное название, например SMACrossover.

Прямо здесь давайте объявим несколько приватных переменных типа StrategyParameter для того, чтобы в дальнейшем работать со страпами (параметрами стратегии). Поскольку мы хотим регулировать периоды двух скользящих средних, создадим отдельную переменную для каждой из них. В итоге у нас появится переменная slowPeriod - для медленной скользящей средней (с длинным периодом усреднения) и переменная fastPeriod - для быстрой скользящей средней (с коротким периодом усреднения).

Пример (как выполнить пример приведенного кода)...


namespace WealthLab.Strategies
{
   public class SMACrossver : WealthScript
   {

      /* Объявляем параметры торговой стратегии, создавая переменные типа StrategyParameter*/

      private StrategyParameter slowPeriod;
      private StrategyParameter fastPeriod;

      protected override void Execute()

      {
         int fastPer = 20; //параметр для периода быстрой скользящей средней
         int slowPer = 55; //параметр для периода медленной скользящей средней

Шаг №2: создаем конструктор класса

На следующем шаге добавляем новый публичный конструктор класса. Обратите внимание на то, что название метода конструктора должно в точности соответствовать названию класса, для которого создается данный конструктор. В нашем случае это SMACrossover().

Внутри конструктора определяем метод CreateParameter() для каждой из переменных, которые мы объявили на шаге 1. Для более подробного изучения метода CreateParameter() обратитесь к справочнику QuikRef (F11).

Пример (как выполнить пример приведенного кода)...


namespace WealthLab.Strategies
{
   public class SMACrossver : WealthScript
   {
      private StrategyParameter slow;
      private StrategyParameter fast;

      /* Добавляем публичный конструктор класса (обязательно должен иметь то же самое имя, что и класс) */

      public SMACrossver()
      {
         fast = CreateParameter("Fast Per", 20, 4, 100, 1); //начальное значение параметра 20, пробегаемся от 4 до 100 с шагом 1
         slow = CreateParameter("Slow Per", 55, 5, 300, 5); //начальное значение параметра 55, пробегаемся от 5 до 300 с шагом 5
      }

      protected override void Execute()
      {
         int fastPer = 20;
         int slowPer = 55;

Аргументы метода CreateParameter(string name, double value, double start, double stop, double step) имеют следующие значения:

  • name - эта переменная содержит текст, который располагается рядом с ползунком на панели данных и используются для идентификации параметров торговой стратегии;
  • value - присваивает параметру стратегии значение по умолчанию;
  • start - нижняя граница возможных значений параметра стратегии;
  • stop - верхняя граница возможных значений параметра стратегии;
  • step - контролирует величину шага, с которым изменяется значение параметра торговой стратегии от нижней границе к верхней

Шаг 3: присваиваем переменным значения параметров торговой стратегии

И наконец, в методе Execute() мы конвертируем переменную типа StrategyParameter в соответствующий ей переменную, содержащее значение параметра. Для этого используется свойства переменной типа StrategyParameter или ValueInt - для присвоения целочисленного значения, либо Value - для присвоения значения типа float.

Пример (как выполнить пример приведенного кода)...


namespace WealthLabCompile
{
   class MovingAverageCrossover : WealthScript
   {
      private StrategyParameter slow;
      private StrategyParameter fast;

      public MovingAverageCrossover()
      {
         fast = CreateParameter("Fast Per", 20, 4, 100, 1);
         slow = CreateParameter("Slow Per", 55, 5, 300, 5);
      }

      protected override void Execute()
      {
         /* Получаем значения периодов от параметров */

         int fastPer = fast.ValueInt;
         int slowPer = slow.ValueInt;

Для того, чтобы увидеть конечный результат этого процесса - внимательно изучите стратегию "Moving Average Crossover", которая предустановленна в каждой программе Wealth-Lab Developer.

Код этой стратегии выглядит вот так:

Пример (как выполнить пример приведенного кода)...


using System;
using System.Collections.Generic;
using System.Text;
using WealthLab;
using WealthLab.Indicators;
using System.Drawing;

namespace WealthLabCompile
{
    class MovingAverageCrossover : WealthScript
    {
        //Create parameters
        private StrategyParameter slowPeriod;
        private StrategyParameter fastPeriod;

        public MovingAverageCrossover()
        {
            fastPeriod = CreateParameter("Fast Period", 20, 1, 100, 1);
            slowPeriod = CreateParameter("Slow Period", 50, 20, 300, 5);
        }

        protected override void Execute()
        {
            //Obtain periods from parameters
            int fastPer = fastPeriod.ValueInt;
            int slowPer = slowPeriod.ValueInt;

            SMA smaFast = SMA.Series(Close, fastPer);
            SMA smaSlow = SMA.Series(Close, slowPer);

            PlotSeries(PricePane, smaFast, Color.Green, LineStyle.Solid, 2);
            PlotSeries(PricePane, smaSlow, Color.Red, LineStyle.Solid, 2);

            for (int bar = Math.Max(fastPer, slowPer); bar < Bars.Count; bar++)
            {
                if (IsLastPositionActive)
                {
                    if (CrossUnder(bar, smaFast, smaSlow))
                        SellAtMarket(bar + 1, LastPosition);
                }
                else
                {
                    if (CrossOver(bar, smaFast, smaSlow))
                        BuyAtMarket(bar + 1);
                }
            }
        }
    }
}

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

Комментариев: 2

  1. ring10 пишет:

    Здравствуйте Дмитрий!

    Прослушал ваш вебинар по оптимизации торговой системы в ВЛД. Хочу изложить некоторые мысли по поводу тех процедур оптимизации, которые были изложены вами.
    Мое глубокое убеждение и мои собственные расчеты (я эти занимаюсь уже несколько лет, поднимал свои записи и находил оптимизации которые я делал в 2004 году еще в метастоке) показывают, что оптимизация на одном участке рынка и инструмент должна занимать не более 5-10 минут. Например, на вебинаре мы проводили оптимизацию с мин 300 до макс 5000 при шаге в 5 и к этому еще был другой оптимизационный параметр. То есть получается (5000-300)/5= 940 и еще, по моему, был другой оптимизационный параметр с макс 1500 мин 300 получается (1500-300)/5 = 240 и получается 940*240 = 225600 тестов. А тестировали мы 2 года это примерно 13 торговых часов в день, 250 рабочих дней и 2 года, перемножаем = 6500 часов.
    225600/6500=34. Получатся 34 варианта оптимизируемых параметра на каждый торговый час. Это чистый подгон под кривую. Что и показал результат на неоптимизируемом периоде.
    Так что я считаю все эти методы поиска по Монте-Карло и генетический оптимизатор не нужны, а более того вредны, для тех кто занимается поиском торговых алгоритмов. Так как вводят в заблуждение. Существует книга «Роберт Пардо Разработка, тестирование, оптимизация торговых систем для биржевого трейдера», где изложена неплохая система поиску и оптимизации торговый систем. Однако и она не дает гарантии прибыли. Я, например, по этой методике провел оптимизацию системы Черепашек для фьючерса индекса РТС на часовиках и для доллар-рубль на 30 мин. Все в тестировании показывало не плохо. К сожалению таблицу оптимизации я не могу сейчас найти. По этой системе я стал торговать на конкурсе ЛЧИ в 9 или 10 году. (кому интересно посмотрите ник ring10) У меня была чисто механическая система с интегрированная с Омегой и связка от zoran3.narod и маленький комп. типа современных планшетников. Я его таскал с собой на работу с работы, дома контролировал иногда. Ложился спать, он работал, в общем не большой голоняк на 3 месяца. Результат минус 10000 рублей. из 30000 капитала. В середине конкурса я отказался от системы с долларом, так как она генерила уж большие убытки. Хотя по индексу может и был бы и ноль, но я на одну неделю попал в больницу на операцию и не мог торговать. По закону подлости в это время было большое движение, а как вы знаете система Черепашек трендовая на пробой уровней макс./мин. 20 и 50 + управление капиталом.
    Так что к оптимизации надо относится очень и очень аккуратно.
    Вот почему я так настойчиво у вас спрашивал на вебинаре про оптимизацию на разных таймфреймах. Это очень хороший метод оптимизации. Зачастую хорошо прибыльная стратегия на часовиках прибыльна, а на 30 мин совсем, очень сильно убыточна. А спрашивается, что кардинально изменилось, что так переменилась эквити? Ведь идеи и принципы сохранились. Оптимизация по таймфрейму отсечет совсем не работающие системы. У меня еще много мыслей по поиску робастых систем, однако одному реализацию это не осилить.
    Так вот у меня предложение создать на базе читателей вашего блога создать рабочую группу, которая совместными усилиями сможет во первых создать методику поиска робастых систем автоматизировать их поиск, а в дальнейшем делится опытом по применению, то есть реальной торговли.
    Вот, например, сейчас я провожу работу по поиску индикаторов, которые имеют статистически значимые предсказательные результаты. В книге “Р.Колби,Т.Мейерс. Энциклопедия технических индикаторов рынка” рассказан метод ячеек с помощью которого, можно проводить эту работу. Могу потом когда появятся результаты расчетов поделиться.
    Причем для сомневающихся, те кто думает, что чужие смогут воспользоваться его работой скажу следующее, что систем торговли так много и так много инструментов от акций до форекса и что у каждого трейдера свои предпочтения (по отношению к убыткам к таймфреййму, технические ограничения), что конкуренции на рынке не возникнет, а польза от совместных усилий возрастет многократно.
    Игорь 02.09.12

    • Дмитрий Власов пишет:

      Игорь, спасибо за столь подробный комментарий. Я с Вами совершенно согласен в том, что система, которая дает хорошие результаты при оптимизации – совершенно не обязана приносить доход на том периоде, на котором мы ее не оптимизировали. При этом, к сожалению, это будет относится к любым системам и к любым спомобом нахождения оптимальных параметров.

      Но в то же время во время оптимизации мы делаем очень важное дело – отсекаем те параметры, которые никогда не работают и точно работать не будут. Таким образом, мы хотя бы немного повышаем свои шансы на то, что торговая система будет прибыльно работать в течение какого-то времени в будущем.

      А сильно повышать свои шансы нам и не нужно. Например, владельцы казино живут и процветают получая преимущество всего в 2,7%….

      Зная, что любая система со временем “сломается” нужно заранее разработать четкие правила дисквалификации боевых систем. И тогда, как только мы увидим что результат, который показывает система совсем не тот, который она показывала на истории – мы принимаем жесткое решение и убираем эту систему из торговли. Т.е. тут тоже подход как и в тренде….

      Входим в тренд (запускаем торговую систему), ставим стоп-лосс – вернее сказать, трейлинг стоп(определяем правила дисквалификации системы) и отдаемся на волю рынка…

      Те системы, которые “сломались” – выбиваются по стопу. Те системы, которые соответствуют текущему рынку находятся в тренде и мы стараемся в этом тренде продержаться как можно дольше (не трогаем систему и продолжаем в соответствии с модулем управления позицией увеличивать ставки на эту систему)…

      Еще раз, как и всегда, я подчеркиваю, что это всего лишь мой взгляд на рынок и я его никому не навязываю. Я просто рассказываю то, во что верю в данный момент.

      По поводу рабочей группы – у меня именно такие задумки – те участники курса, которые захотят работать дальше коллективно смогут это делать. Как первую пробу я попросил каждого из участников до 5 сентября придумать и запрограммировать по одной технике входа и одной технике выхода… Как результат каждый из нас получит по 10 разных техник входа и 10 разных техник выхода… В результате можно будет потестировать 100 различных торговых систем и наверняка из этого получится что-нибудь интересное.

      Пока, к сожалению, не получил в ответ ни одного письма… Так что коллективная работа (несмотря на всю ее привлекательность) зачастую бывает очень затруднена. А так я очень надеюсь, что мы сможем работать совместно (тем более теперь после прохождения курса – мы говорим на одном языке).

Оставить комментарий