Скачать MetaTrader 5

Статистическая проверка системы управления капиталом Лябушера

20 мая 2015, 17:09
Alexander Dubovik
4
10 102

Есть три вида лжи: ложь, наглая ложь и статистика.

Введение

Бродя на выходных по просторам интернета, я нашел систему управления капиталом, о которой до этого не слышал — систему Лябушера (Labouchere) или метод вычеркивания (Forex Vacuum Cleaner System с использованием системы Labouchere). На самом деле система является разновидностью Мартингейла, т.е. предписывает после проигрышей повышать ставки, а после выигрышей делать минимальную ставку. Но это менее агрессивная разновидность, чем оригинальный Мартингейл, т.к. ставки повышаются не в 2 раза, а на определенную величину.

А теперь приведу фразы в описании свойств системы, которые меня крайне заинтриговали:

  • "Итак, обратите внимание! Для того чтобы система функционировала и выигрывала, необходимо иметь количество прибыльных сделок, выше 33%-40% процентов!!!"  — Очень сильное заявление. Правда, не понятно, почему разбежка такая большая — аж от 33% до 40%?

  • "Имейте ввиду, подобный метод игры может рассматриваться казино, как нечестный".  —  Неужели? Может, метод действительно работает!?

  • "Но принцип остается НЕИЗМЕННЫМ, 33% выигрышей компенсируют 66% процентов проигрышей. Таким образом, применяя подобный манименеджмент в практической торговле на форексе, нам нужна торговая система, имеющая 50% вероятность выигрыша, и соотношение возможной прибыли к возможному убытку больше или равным 1, т.е. Profit factor >=1".

Фактически в найденном мной источнике утверждается, что если взять систему с выигрышем равным проигрышу и вероятностью выигрыша 50% (или даже "выше 33%"), то система Лябушера с легкостью сделает из нее прибыльную! Зачем же тогда искать систему с положительным матожиданием, если за нас придуман способ его сдвига в положительную область? Ведь сделать систему, например, с 47% выигрышей так легко...

Давайте разберемся, как система Лябушера предлагает варьировать ставки.

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

А вот в случае проигрыша ставка вырастает на единицу — до 2, и на листик мы записываем проигрышную ставку:

-1

В случае выигрыша повышенной ставкой на листик записываем:

-1 2

Затем обе цифры зачеркиваем, т.к. мы вернули свой проигрыш (т.е. в результате серии из двух ставок все равно пополнили баланс на единицу).

Рассмотрим случай более длинной проигрышной серии.

-1

Делаем ставку 2. Снова проигрыш:

-1 -2

Делаем ставку 3. Снова проигрыш:

-1 -2 -3

Делаем ставку 4. Снова проигрыш:

-1 -2 -3 -4

Делаем ставку 5. Снова проигрыш:

-1 -2 -3 -4 -5

Делаем ставку 6. Снова проигрыш:

-1 -2 -3 -4 -5 -6

Делаем ставку 7, и наконец выигрываем:

-1 -2 -3 -4 -5 -6 +7

После этого вычеркиваем "-1", "-6" и "+7", т.к. этим выигрышем мы компенсировали две проигрышные ставки. Следующая ставка равна сумме первого и последнего из оставшихся в таблице значений, т.е. по-прежнему 7. В случае выигрыша:

-2 -3 -4 -5 +7
Вычеркиваем "-2", "-5" и "+7". Снова делаем ставку, равную сумме первого и последнего из оставшихся в таблице значений, т.е. по-прежнему 7 (в некоторых источниках предписывается еще прибавить к ней 1, чтобы в случае выигрыша не только выйти "в ноль", но и получить минимальную прибыль). В случае выигрыша:
-3 -4 +7

Вычеркиваем все цифры из таблицы, т.к. мы отыгрались.

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

Итак, давайте посмотрим, что же у нас получилось:

  1. Действительно, серию из 6 проигрышей удается компенсировать серией из всего 3 выигрышей (правда, именно серией, но об этом позже). На первый взгляд, система позволяет легко выйти сухим из воды.

  2. Наращивание ставки происходит значительно медленнее, чем в оригинальном Мартингейле, где при такой серии следовало бы ставить в 64 раза больше начальной ставки.

  3. Суммарный провал депозита (сумма проигранных ставок) в приведенном примере составил всего 21 единицу, в то время как в оригинальном Мартингейле провал был бы на 63 единицы.

  4. Из нехитрых вычислений следует, что потеря депозита при размере начальной ставки 1% от депозита произойдет при 13 проигрышах подряд, а при размере начальной ставки 0,1% от депозита — при 44 проигрышах подряд (тут хочется довольно потереть руки и сказать: "Да где же это видано — 44 убытка подряд при шансах 50/50!? Да это же 1 на сколько-то-там-триллионов! Более вероятно, что мне на голову метеорит упадет! С такой вероятностью проигрыша обязательно надо работать!" и т.п.).

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

  6. Система ставок выглядит как минимум очень запутанной, что сильно усложняет вычисление результирующего матожидания "на бумаге".

Однако давайте вернемся к процессу выхода из нашей провальной серии. Допустим, что после 6 проигрышей подряд мы получили всего 2 выигрыша, а не 3. Тогда на бумаге у нас будет записано следующее:

-3 -4

Ставка 7, и тут вместо долгожданного выигрыша получаем проигрыш:

-3 -4 -7
Ставка 10 (заметьте, что от проигрыша к проигрышу ставка прирастает уже не на 1, что выглядело бы вполне разумным и безопасным для депозита, а на 3). И снова проигрыш:
-3 -4 -7 -10

И уже следует ставить 13.

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

Вам интересно, на что способна эта система? Мне — очень интересно.


Постановка задачи — что будем проверять и какими способами

Самый главный вопрос, ответ на который мы будем искать — это способность (или неспособность) системы управления капиталом Лябушера сдвигать матожидание, особенно в положительную сторону. Конечно, заявления про достаточность 33% выигрышей при выигрыше = проигрышу звучат фантастично, но может хотя бы 49% или 50% выигрышей будет достаточно? А если нет — то может у системы Лябушера найдутся хоть какие-нибудь сильные стороны?

Проверять будем статистически, а значит, нужно писать программу на MQL (в данном случае MQL4, т.к. с MQL5 я еще не освоился). И пускай программа проводит миллионы сделок, "сливает" тысячи депозитов — мы будем смотреть и анализировать результаты без вреда для кошелька. А если вдруг окажется, что программа зарабатывает, можно будет все это внедрить в реальную торговлю.

Система Лябушера разработана в предположении выигрыша = проигрышу, но ее можно адаптировать и для других соотношений, однако такие усложнения не выглядят целесообразными. Ведь если система сможет влиять на матожидание игры с выигрышем = проигрышу, то и другие соотношения ей по зубам. А если нет — то это зря потраченное время на обдумывание корректности модификации.

Кроме того, система с выигрышем = проигрышу и равновесным значением в 50% выигрышных сделок проще всего воспринимается человеком, т.к. все мы знакомы с подбрасыванием монетки. Потому программу так и назовем — CoinTest.

Итак, опишем пожелания к программе:

  1. Необходима возможность изменения вероятности выигрыша. Игра 50/50 будет всего лишь равновесным частным случаем.

  2. Необходимо иметь возможность задания степени риска. В системе Лябушера заложен постоянный размер единичной ставки. Если мы будем масштабировать начальную ставку в зависимости от размера депозита, то потеряется вся соль системы, т.к. после завершения вычеркивания всех значений из таблицы депозит не вернется к первоначальному значению. Можно пересчитывать размер ставки после выхода из просадки, но при этом будут получаться дроби, которые сложно воспринимать (сравнивать, проверять) человеку. В итоге степень риска будем задавать двумя переменными — размером начального депозита и размером начальной ставки.

  3. Необходимо задавать максимальное количество сделок на один депозит — достаточно большое, чтобы узнать, потеряем ли мы депозит даже при очень низком начальном риске. Ведь если депозит будет расти, это может происходить бесконечно, и мы так и не узнаем результат.

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

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

Код системы выбора размера ставки потенциально может быть использован повторно в реальной торговле, поэтому его следует оформить в виде класса.

Реальное открытие сделок в MetaTrader в данном случае является бесполезным и чрезвычайно затратным с точки зрения вычислительных ресурсов. Нам достаточно просто фиксировать результат случайных сделок требуемым размером лота с заданной вероятностью выигрыша. Исходя из этого, писать будем не советник и не индикатор, а всего лишь скрипт, т.к. эта разновидность программ MQL хорошо подходит для разового запуска.


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

Для нашей затеи чрезвычайное значение имеет качество генератора псевдослучайных чисел (ГПСЧ), имеющегося в нашем распоряжении, т.к. именно он будет сообщать, выигрыш или проигрыш нам зачислять на баланс. Причем очень важна "честность" распределения длинных серий выигрышей или проигрышей. Оценить правильность распределения длинных серий попробуем "на глазок", без применения сложных для понимания теорем математической статистики.

Данная публикация не претендует на серьезное исследование качества ГПСЧ (требующего проведения порядка 15 различных тестов). Проверять будем только те свойства ГПСЧ, которые очевидно могут повлиять на результаты проверки системы Лябушера, и при этом имеющие не слишком сложные процедуры проверки.

В MetaTrader нам доступна стандартная функция ГПСЧ MathRand(). Последовательность ГПСЧ инициализируется функцией MathSrand().

Для проверки качества стандартного ГПСЧ напишем небольшой скрипт RandFile, который будет иметь 2 параметра:

  • Количество миллионов 32-битных случайных слов, которые он должен сгенерировать (на одно 32-битное слово — 3 вызова функции MathRand(), дающей 15 значащих бит). Единица измерения — обычный десятичный миллион, а не 2 в 20-й степени, т.к. результаты придется рассматривать в том числе и глазами.

  • Логический параметр CalcSeries (считать ли распределение длин серий одинаковых битов).

Процесс подсчета распределения длин битовых серий очень ресурсоемкий (увеличивает время выполнения скрипта в 10 раз), поэтому он вынесен в отдельную опцию.

Скрипт выдает следующие результаты:

  • печатает в журнал время, затраченное на вычисления;
  • печатает в журнал, сколько единиц встретилось среди всех сгенерированных битов;
  • файл RandFile.bin — бинарный файл с результатом работы ГПСЧ;
  • файл RandStat.csv — файл статистики встречаемости определенных байтов;
  • файл RandOnesSeries.csv — файл статистики длин серий битов "1";
  • файл RandZerosSeries.csv — файл статистики длин серий битов "0".
Сгенерируем 3 тестовых набора разной длины:
  • 10 млн. тестовых слов по 4 байта в каждом (всего 40 млн байт);
  • 100 млн. тестовых слов по 4 байта в каждом (всего 400 млн. байт);
  • 1 000 млн. тестовых слов по 4 байта в каждом (всего 4 000 млн. байт).

Затем проверим:

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

    Сжимаемость ГПСЧ 10 млн. слов

    Сжимаемость ГПСЧ 100 млн. слов

    Сжимаемость ГПСЧ 1 000 млн. слов

  2. Количество битов "1":
     РавновесноеФактическоеОтклонение абсолютное
     Отклонение, %
    10М
    160 000 000
    160 004 431
    4 431
    0,0027694
    100М
    1 600 000 000
    1 599 978 338
    21 662
    0,0013539
    1000М
    16 000 000 000
    15 999 996 180
    3 820
    0,0000239
  3. Встречаемость значений определенных байтов в случайных файлах:

    Встречаемость определенных байтов ГПСЧ, 10М слов

    Встречаемость определенных байтов ГПСЧ, 100М слов

    Встречаемость определенных байтов ГПСЧ, 1000М слов

  4. Длины серий одинаковых битов. Для каждого размера выборки построим 2 графика:

    • график фактически зафиксированного количества серий одинаковых битов определенной длины, а также равновесного значения количества серий такой длины (в логарифмическом масштабе);
    • график процентного отклонения фактически зафиксированного количества серий одинаковых битов от равновесного значения (также в логарифмическом масштабе).

    Линейный масштаб графиков нам не подходит по причине чрезвычайно высокого разброса имеющихся у нас значений (на одном и том же графике требуется отметить значения от 1 до 4 000 000 000 или от 0,00001 до 6 000). Кроме того, график равновесного значения количества длинных серий в логарифмическом масштабе представляет собой прямую, т.к. с увеличением длины серии на 1 вероятность ее выпадения снижается в 2 раза.

Длины серий одинаковых битов для 10М слов

Отклонения длин серий от равновесного для 10М слов

Длины серий одинаковых битов для 100М слов

Отклонения длин серий от равновесного для 100М слов

Длины серий одинаковых битов для 1000М слов

Отклонения длин серий от равновесного для 1000М слов

Какие выводы можно сделать из этих проверок?

  • Производительность стандартного ГПСЧ является приемлемой для нашей задачи.

  • Архивирование файлов с результатами работы ГПСЧ не приводит к их сжатию.

  • Количество нулевых и единичных битов соответствует равновероятному, отклонение от равновесного (в процентах) снижается с увеличением размера выборки.

  • Распределение встречаемости определенных байтов в результатах работы ГПСЧ колеблется в узких пределах вокруг равновесного. Разброс встречаемости снижается с увеличением выборки.

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

Таким образом, серьезных статистических дефектов, способных исказить результаты нашей проверки, в стандартном ГПСЧ не выявлено даже при последовательностях порядка 3 млрд. генераций (на одно 32-битное слово затрачивается 3 генерации).


Написание класса CLabouchere, осуществляющего управление размером позиции

Класс CLabouchere получился весьма компактным. Его интерфейс состоит всего из 2 функций-оберток для установки/получения размера начального лота, 2 реально работающих функций: установки результата сделки и получения текущего размера позиции, а также функции сброса к начальному состоянию:

// Реализация мани-менеджмента Лябушера.
// Предполагает тейк/стоп = 1/1.
class CLabouchere
{
        private:
        protected:
                // Стартовый лот. По умолчанию - 0.1.
                double p_dStartLot;

                // Строка, в которой хранятся числа согласно Лябушеру
                double p_dLotsString[];
        public:
                void CLabouchere();
                void ~CLabouchere();

                double GetStartLot() {return p_dStartLot;};
                void SetStartLot(double a_dStartLot) {p_dStartLot = a_dStartLot;};

                // Возвращает лот, которым сейчас следует заходить
                double GetCurrentLot();

                // Записывает результат текущего трейда - тейк (true) или стоп (false)
                void SetResult(bool a_bResult);

                // Сбрасывает на начальное состояние, кроме начального лота
                void Init() {ArrayResize(p_dLotsString, 0);};
};


Написание рабочего кода скрипта. Предварительная оценка результатов

Пишем несложный скрипт на сотню строк, имеющий следующие входные параметры:

//--- input parameters
input int RepeatsCount=100000;
input int StartBalance = 10000;
input int Take = 50;
input double SuccessPercent = 50.0;
// Если тут true - значит, SuccessPercent игнорируется
input bool FiftyFifty = true;

Скрипт производит серию ставок до потери депозита или до достижения RepeatsCount.

Случай, когда нам требуется вероятность выигрыша 50/50, вынесен в отдельную настройку. В этом случае в качестве результата бросания монеты берутся единичные биты псевдослучайного числа. В иных случаях вычисляется число, означающее границу между выигрышем и проигрышем, и случайное число сравнивается с этой границей. Отдельная настройка для случая 50/50 реализована по той причине, что нас устроила серийность отдельных битов ГПСЧ, а серийность выпадения значений более какой-либо границы мы не оценивали.

Настройки по умолчанию:

  • размер депозита — 10 000;
  • размер начальной ставки — 50 (т.е. 0,5% от начального депозита).

Примерно на 10-м запуске скрипта получаем впечатляющий результат — на 2 335 шагу депозит составляет 46 300. Однако к 2 372 шагу наступает провал:

Пример роста депозита с последующей его потерей

На графике этот депозит выглядит вот так:

График депозита

Видим, что до потери депозита баланс дважды проваливался до критических значений.

В некоторых случаях депозит тает за несколько десятков первых сделок и ни в одном случае депозит не продемонстрировал время жизни в максимальные 100 000 сделок.

В результате экспериментов с параметрами и наблюдения за многочисленными проигрышами мне пришли в голову следующие модификации:

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

  • Конечно же, следует запускать прогон депозита по циклу (не царское это дело — сотни раз руками запускать). При этом нужно варьировать пару параметров: PocketPercent и размер начальной ставки Take, а также подсчитывать средние результаты (сумму денег в кармане и остатка денег на депозите — ведь он расходуется не до нуля, а только до момента невозможности производства следующей сделки).

  • Необходимо иметь 2 версии скрипта: один для циклического прогона, но без вывода в файл подробностей о конкретных сделках, второй — наоборот. А где повторное использование — там объектный код. В итоге основной "действующий код" следует оформить в виде класса CCoinTest, а скрипты сделать совсем легкими.

Код скрипта для одного прогона получился настолько коротким, что его полностью можно привести в статье (вся работа, в том числе запись файла с подробностями жизни депозита, возложена на класс CCoinTest):

#include <CCoinTest.mqh>

//--- input parameters
input int RepeatsCount=100000;
input int StartBalance = 10000;
input int Take = 50;
input int PocketPercent = 10;
input double SuccessPercent = 50.0;
input string S2 = "Если тут true - значит, SuccessPercent игнорируется";
input bool FiftyFifty = true;
input string S3 = "Если true - тогда вместо Лябушера заходим постоянным лотом";
input bool FixedLot = false;

void OnStart()
{
        MathSrand(GetTickCount());

        CCoinTest Coin;

        Coin.SetRepeatsCount(RepeatsCount);
        Coin.SetStartBalance(StartBalance);
        Coin.SetTake(Take);
        Coin.SetPocketPercent(PocketPercent);
        Coin.SetSuccessPercent(SuccessPercent);
        Coin.SetFiftyFifty(FiftyFifty);
        Coin.SetFileName("Coin.csv");
        Coin.SetFixedLot(FixedLot);

        Coin.Go();
}

После добавления кармана графики работы системы начинают выглядеть немного по-другому (в данном примере в карман выводится 40% прибыли):

Пример-1 баланса после добавления "кармана"

Фиолетовая линия ("Баланс кармана") ужасно похожа на идеальный график торгового счета, о котором мечтает любой трейдер. Однако на самом деле нас должна интересовать желтая линия — "суммарный баланс торгового счета и кармана", а она уже не так хороша. Кроме того, намного чаще встречаются вот такие примеры:

Пример-2 баланса после добавления "кармана"

Из графиков видно:

  • Система в самом деле демонстрирует то поведение, которое в нее заложил автор: очень часто просадку удается компенсировать, после чего депозит устремляется покорять новые вершины.

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

  • Чем дольше депозит живет, тем больших высот он достигает.

  • Размер начальной ставки в этих примерах — 0,5% от начального депозита (50 при начальном депозите 10 000). В первом примере базовый размер риска снизился до примерно 0,1% (депозит вырос в 4,5 раза, а размер начальной ставки остался прежним), и даже при таком низком риске краха избежать не удалось.


Окончательная оценка результатов для разных значений вероятности. Сравнение результатов системы Лябушера и системы с постоянной ставкой

Итак, переходим к самому интересному — сбору результатов множества экспериментов, когда наконец-то станет понятно, способны ли выигрыши на удачных депозитах перекрыть потери на неудачных. Может, алгоритм проявит себя на очень низких размерах начальной ставки (ведь так будет сложнее потерять депозит) или наоборот — на очень высоких? Какой процент от выигрышей следует выводить с торгового счета? Сможет ли вообще система Лябушера показать результат, отличный от системы с постоянной ставкой? А что будет при положительном матожидании базовой системы (если "монетка" чаще дает выигрыши)? Вопросов масса, и нужно разбираться с ними по порядку.

Скрипт для прогона депозитов по циклу с варьированием параметров занимает около 100 строк, поэтому приведу только его части.

Входные параметры:

//--- input parameters
input int RepeatsCount=100000;
input int StartBalance = 10000;
input string S1 = "Столько депозитов будем сливать";
input int Deposits = 100;
input double SuccessPercent = 50.0;
input string S2 = "Если тут true - значит, SuccessPercent игнорируется";
input bool FiftyFifty = true;
input string S3 = "Если true - тогда вместо Лябушера заходим постоянным лотом";
input bool FixedLot = false;

Массивы со значениями размера начальной ставки и процента выигрыша, помещаемого в карман:

// Массив вариантов PocketPercent
int iPocketPercents[24] = {1, 2, 3, 5, 7, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 75, 80, 85, 90, 95, 97, 98, 99};

// Массив размеров начальной ставки
int iTakes[15] = {5, 10, 15, 20, 50, 75, 100, 150, 200, 300, 400, 500, 1000, 2000, 3000};

Как видим, размер начальной ставки варьируется от 5 (0,05% от начального депозита) до 3 000 (30% от начального депозита). Процент, выводимый с торгового счета в карман — от 1% до 99%. Параметры выбраны заведомо с запасом, чтобы перекрывали разумные рамки в обе стороны.

Таким образом, пространство поиска является двумерным, в нем берется 360 дискретных точек (24 * 15), для каждой из которых по результату серии (количество депозитов в серии задается параметром Deposits) отдельных депозитов вычисляется средний итоговый баланс (как сумма в кармане и на торговом счету) и среднее количество сделок до потери депозита (время жизни депозита).

Результаты расчетов по двумерному пространству являются трехмерными, а значит, их сложно отображать на плоских носителях. Поэтому будем рисовать просто двумерные графики, у которых по оси абсцисс будем откладывать порядковый номер точки из пространства поиска (от 0 до 359). В случае необходимости будем отдельно указывать конкретные значения Takes и PocketPercent.

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

Баланс после 100 повторов, Лябушер, 50/50

И вот такой график времени жизни депозитов (в логарифмическом масштабе):

Время жизни депозита, 100 повторов, Лябушер, 50/50

Время жизни депозита для начального риска в 0,05% составляет свыше 10 000 сделок и непрерывно снижается до менее чем 10 сделок при начальном риске в 30%. Высокое значение PocketPercent также снижает среднее количество сделок до потери депозита. Вполне ожидаемый результат.

На графике среднего содержимого кармана и торгового баланса выделяется несколько точек, причем 4 из них расположены близко — это вселяет надежду, что найдена область оптимума. Теперь посчитаем результаты для Deposits = 1 000 и наложим результаты на этот же график:

Баланс после 100 и 1000 повторов, Лябушер, 50/50

Как видим, область, которая предположительно являлась оптимальной, растаяла под натиском достаточно большого количества статистических данных. При любых параметрах график случайным образом очень близко колеблется около значения начального баланса — 10 000.

Таким образом, значение Deposits = 100 не является достаточным. Все дальнейшие опыты будем проводить с Deposits = 1 000.

Отобразим на одном графике результаты системы Лябушера и системы с постоянной ставкой:

Баланс после 1000 повторов, Лябушер и постоянный лот, 50/50

И график времени жизни депозита для систем Лябушера и постоянной ставки:

Время жизни депозита, 1000 повторов, Лябушер и постоянный лот, 50/50

Что видно из графиков:

  • Финансовый результат системы Лябушера нулевой и совпадет с финансовым результатом системы с постоянной ставкой.

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

  • Время жизни депозита у системы Лябушера значительно ниже, чем у системы с постоянной ставкой (при большинстве параметров в 10 и более раз, а при некоторых параметрах даже более, чем в 100 раз). Для низкой степени риска видим, что график сверху достиг ограничения, заданного параметром RepeatsCount (по умолчанию 100 000). Эти результаты частично подтверждают распространенное в трейдерской среде мнение, что системы с повышением уровня риска опасны для депозита — ведь у нас получается, что такие системы опасны для времени жизни депозита, а вот опасности для финансовых результатов мы пока не обнаружили (в среднем, конечно, и при условии вывода части заработанного).

Чтобы набирать достаточную статистику для оценки поведения участков с высоким уровнем риска, введем еще одну настройку скрипта:

input string S2 = "Минимальное количество сделок на каждую пару параметров";
input int MinDeals = 10000000;

Если за 1000 проигранных депозитов на набралось 10 миллионов сделок, значит, нужно продолжать.

В итоге разброс графиков становится меньше:

Баланс после 1000 повторов и не менее 10 млн сделок, Лябушер и постоянный лот, 50/50

Время жизни депозита, 1000 повторов и не менее 10 млн сделок, Лябушер и постоянный лот, 50/50

А теперь проверим работу систем на вероятностях исходной системы, отличающихся от "50/50".

Баланс после 1000 повторов, Лябушер и постоянный лот, 49% выигрыша

И время жизни депозита:

Время жизни депозита, 1000 повторов, Лябушер и постоянный лот, 49% выигрыша

Что мы видим на этих графиках?

  • При 49% процентах выигрышных сделок обе системы становятся определенно убыточными.

  • Бросаются в глаза очень низкие финансовые результаты системы с постоянной ставкой. На самом деле это является проявлением способа вывода заработанных денег в "кошелек", который хорошо подходит для системы Лябушера, но плохо подходит для системы с постоянной ставкой при проценте выигрыша меньше 50. Так, перевод части средств с торгового счета в "кошелек" производится только после выхода из просадки.

    Система Лябушера даже при 49% выигрыша способна раз за разом ставить новые рекорды (до тех пор, пока хватает средств на очередную ставку), а система с постоянной ставкой — нет. Да и человек-трейдер в случае быстрого убывания баланса вряд ли станет доводить депозит до краха, совершая 100 000 или даже 10 000 сделок — скорее всего, он прекратит торговлю намного раньше, в отличие от нашего алгоритма. А вот в случае следования системе Лябушера человек будет делать то же самое, что и наш алгоритм — торговать до полной потери депозита, постоянно воодушевляясь все новыми рекордами.

Помните хвалебную статью, ссылки на которую приведены во введении? Там сказано, что система будет работать даже при "33-40%" выигрышей. Ради спортивного интереса проверим верхнюю планку в 40%:

Баланс после 1000 повторов, Лябушер и постоянный лот, 40% выигрыша

Время жизни депозита, 1000 повторов, Лябушер и постоянный лот, 40% выигрыша

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

Даже при 51% выигрышных сделок графики баланса приходится рисовать в логарифмическом масштабе.

Баланс после 1000 повторов, Лябушер и постоянный лот, 51% выигрыша

Время жизни депозита, 1000 повторов, Лябушер и постоянный лот, 51% выигрыша

Что видно из графиков:

  • Обе системы перешли в область положительного матожидания.

  • При низком уровне риска система с постоянной ставкой показывает неограниченную "живучесть", т.е. потерять депозит практически невозможно.

  • Система Лябушера даже при очень низком уровне риска находит возможность потерять депозит (но не забывайте про "кошелек").

  • Система с постоянной ставкой при большинстве параметров приносит в 10 раз больше денег, чем система Лябушера, а при некоторых параметрах даже в 17 раз.

Большинство читателей тут же решат, что система с постоянной ставкой по всем параметрам превосходит систему Лябушера — мало того, что не потеряет депозит, так еще и денег принесет в 10 раз больше! И будут обмануты статистикой.

Система с постоянной ставкой уперлась в ограничение в 100 000 сделок на один депозит. Если бы параметр RepeatsCount был 200 000, система принесла бы в 2 раза больше прибыли. "Так это же просто замечательно!" — скажут обманутые статистикой читатели. И опять будут неправы.

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

Прибыль на одну сделку, Лябушер и постоянный лот, 51% выигрыша

А чтобы стало еще понятнее, привожу график прибыли на одну сделку, выраженный в процентах от начальной ставки:

Прибыль на одну сделку, % от начальной ставки, Лябушер и постоянный лот, 51% выигрыша

Вот что на этих графиках видно:

  • Система с постоянной ставкой приносит за одну сделку ровно 2% от начальной ставки. Это точно совпадает с теорией, ведь в нашем случае на 51 выигрыш приходится 49 проигрышей, т.е. выигрышей как раз на 2 больше.

  • Система Лябушера даже при самых неудачных настройках приносит больше прибыли, а при правильных настройках — аж в 6-7 раз больше.

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

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

Ну как, убедились в преимуществе системы Лябушера?

Если да, значит, статистика обманула вас еще раз.

Взгляните на таблицу:

 Размер
ставки
Процент
перевода
в карман
 Среднее содержимое
кармана и баланса,
система Лябушера
Среднее
кол-во сделок,
система Лябушера
 Среднее содержимое
кармана и баланса,
система
с постоянной
ставкой
 Среднее кол-во
сделок,
система
с постоянной
ставкой
Прибыль
на сделку,
система Лябушера
Прибыль
на сделку,
система
с постоянной
ставкой
Прибыль
на одну сделку,
% от начальной ставки,
система Лябушера
Прибыль
на одну сделку,
% от начальной
ставки, система
с постоянной ставкой
75
10
51 177.34
3 728.62
160 489.6
99 530.41
11.04
1.51
14.72
2.02
500
45
14 016.36
127.27
349 479
33 771.46
31.56
10.05
6.31
2.01

Ведь на самом деле существует простой способ получить от системы с постоянной ставкой такое же среднее количество прибыли на сделку, которую демонстрирует система Лябушера — нужно всего лишь увеличить размер ставки в 7 раз (в данном примере — с 0,75% до 5%). Конечно, 5% — это очень высокий уровень риска, но даже при таком риске система с постоянной ставкой имеет в 10 раз более высокую "живучесть".

Ну что, убедились в преимуществе системы с постоянной ставкой?

Мне кажется, что статистика обманула вас еще раз.

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

И пожалуй, наиболее корректный вывод, который можно сделать из этих расчетов, звучит примерно так: "При вероятности выигрыша в 51% от системы Лябушера с начальной ставкой в 0,75% от депозита и выводом 10% прибыли следует ожидать такой же доходности, как и от системы с постоянной ставкой в размере 5% от стартового депозита с выводом 45% прибыли. Система Лябушера достигает такого уровня доходности путем временного повышения размера позиции в процессе работы".

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

Какая из систем лучше? Сложно сказать. Пожалуй, выбор зависит от предпочтения трейдера, а решающее значение имеет матожидание исходной системы. Кроме того, приведенный в статье код позволяет любому желающему осуществить моделирование применения системы Лябушера к собственной ТС.

Для сравнения приведу графики обеих систем при 55% выигрышей:

Баланс после 1000 повторов, Лябушер и постоянный лот, 55% выигрыша

Время жизни депозита, 1000 повторов, Лябушер и постоянный лот, 55% выигрыша

Прибыль на одну сделку, Лябушер и постоянный лот, 55% выигрыша

Прибыль на одну сделку, % от начальной ставки, Лябушер и постоянный лот, 55% выигрыша

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

Различие в средней прибыли на одну сделку снизилось с 6-7 раз при 51% выигрышей до примерно 3,7 раза при 55% выигрышей. Это связано с тем, что при более высоком матожидании исходной системы система Лябушера меньше времени проводит в просадках, и, следовательно, меньше времени торгует повышенным лотом.


Заключение

Конечно, чуда не произошло — система управления капиталом Лябушера не может сделать из убыточной или даже нейтральной системы прибыльную.

К тому же, стали понятны причины возникновения приведенных во введении мифов о системе Лябушера:

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

Стоит ли применять систему Лябушера в торговле при наличии системы с положительным матожиданием? Выбор, скорее, зависит трейдера. Применение системы Лябушера является достаточно сложным, а влияние на прибыльность с трудом можно назвать выдающимся. Однако в любом случае я могу дать 2 совета: не превышать допустимый уровень риска, если вы дорожите депозитом, и работать над повышением матожидания вашей торговой системы.

Прикрепленные файлы |
CCoinTest.mqh (6.26 KB)
CLabouchere.mqh (2.65 KB)
CoinTest2.mq4 (1.26 KB)
CoinTest3.mq4 (2.99 KB)
CoinTest1.mq4 (2.54 KB)
RandFile.mq4 (5.28 KB)
Andrey Khatimlianskii
Andrey Khatimlianskii | 23 май 2015 в 00:32

Очень приятная статья - легко читается (сел пробежаться по диагонали, и не оторвался, пока не дочитал), не заумная, но и не примитивная, с достаточным количеством и теории и практики.
Тема зацепила, подача материала подогрела интерес, краткие но достаточные выводы в удобной форме дали ощущение завершенности.

Спасибо автору! Пишите еще.

Artem Titarenko
Artem Titarenko | 23 май 2015 в 00:51
Статья супер! Как то делал аналогичную систему управления лотами для советников, не вдаваясь в теорию тоже пришёл к выводу(эмпирическим путём), что если система не даёт статистическое преимущество то система лотности не спасёт...
Alexander Dubovik
Alexander Dubovik | 23 май 2015 в 20:53
Вполне возможно, что напишу еще что-нибудь. Только надо какую-нибудь зажигательную тему найти.
Alexander Fedosov
Alexander Fedosov | 26 май 2015 в 16:55
Мне нравятся такие статьи-исследования. Многие, видя статью о чем-либо, думаю, что там либо пытаются впарить пустышку под умными формулами, либо ждут что это очередной "халявный грааль". Но почему бы не смотреть на каждую такую статью как на пищу для ума, как генератор идей, как что-то о чем можно подумать и использовать, как расширение кругозора. Думаю и эта статья именно из этой категории.
Торговые идеи на основе направления и скорости движения цен Торговые идеи на основе направления и скорости движения цен

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

Как мы развивали сервис торговых сигналов MetaTrader и социальный трейдинг в целом Как мы развивали сервис торговых сигналов MetaTrader и социальный трейдинг в целом

Мы активно совершенствуем сервис Сигналы, последовательно избавляемся от прежних недоработок и вносим изменения в существующие механизмы. MetaTrader Signals двухлетней давности и MetaTrader Signals на текущий момент - это словно два различных сервиса. Прямо сейчас ведутся работы по реализации виртуального хостинга Virtual Hosting Cloud - сети серверов для поддержки специальных версий клиентского терминала MetaTrader. За пять шагов из MetaTrader станет возможно взять в аренду виртуальную копию терминала с минимальной сетевой задержкой до торгового сервера брокера.

Поиск условий входа в рынок с помощью поддержки, сопротивления и ценового действия Поиск условий входа в рынок с помощью поддержки, сопротивления и ценового действия

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

Price Action. Автоматизация торговли по внутреннему бару Price Action. Автоматизация торговли по внутреннему бару

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