Антон Кротов
Антон Кротов личный блог
06 сентября 2012, 19:39

WealthLab: код оценки линейности эквити

Программа тестирования торговых стратегий WealthLab снабжает пользователя довольно скудной информацией о результатах тестирования. Но если в режиме одиночного запуска по информации, разбросанной по нескольким окнам, еще можно составить себе общее представление о получившейся стратегии, то в режиме оптимизации нам предоставляется только минимальная информация (прибыль, маскимальная просадка, рекавери фактор, профит фактор и пр.). Понятное дело – лучше, чем ничего. Однако, частенько бывает, что результаты все отличные, а посмотришь на эквити – сразу понимаешь, что это в торговлю пускать нельзя.
 
Приходится множество вариантов запускать в режиме одиночного запуска, смотреть эквити, график общей просадки (который в велсе тоже строится не пойми как), распределение сделок и только тогда уже делать вывод о том, удачные результаты получились или не очень. В отличие от 4-ой версии, где пользователю было позволено дополнять таблицу результатов оптимизации своими графами, 5-ая (и, как я понял, но не проверял, 6-ая) версии этого не позволяют.

Чтобы все-таки иметь хоть какую-то возможность оценивать качество получаемой эквити, я дописал небольшой класс обработки результатов работы стратегии. Его особенности:
  1. В код стратегии добавляются всего четыре строчки (не считая кода самого класса): инициализации класса (в конструкторе) и записи в файл (после всех расчетов).
  2. В отличие от Wealth’а делает все вычисления не в пунктах, а в процентных приращениях. Это дает более точную оценку, т.к. убыток в 1000п в январе 2009 и 1000п в августе 2011 – различаются почти в 5 раз.
  3. Оценивает линейность полученной эквити – параметр, по которому сразу видно, есть смысл пускать систему с такими параметрами в торговлю или даже не стоит ее смотреть.
  4. Легко добавляются любые другие формулы для анализа (например, можно добавить торговлю с плечом, чего велс не умеет делать).
  5. Все данные пишутся в текстовый файл, который можно импортировать в эксель.
  6. Позволяет задавать параметры-лимиты, которые отфильтруют запись в файл заведомо неинтересных результатов оптимизации (например, отсечь все результаты с количеством сделок <100 и >500; или отсечь все результаты с AverageProfit < 0.5%)
Возможно, кому-то пригодится. Сам пользуюсь уже давно, очень помогает :)
 
КАЧАТЬ ЗДЕСЬ


КАК ПОЛЬЗОВАТЬСЯ
 
1. В секции using добавляем строку:
 
using System.IO;
 
2. Определяем переменную класса типа SData:
 
SData data;
 
3. В конструкторе класса стратегии (WealthScript) сразу за инициализацией всех StrategyParameters делаем вызов, указывая путь для размещения файла с результатами и список параметров стратегии (переменное количество):
 
data.create_file(@“C:\Wealth\MyStrategy\”, sp1, sp2)
 
4. После всех расчетов (после основного цикла по барам) делаем запись в файл:
 
data.write_file(positions);
 
5. Скопировать содержимое файла sdata.cs внутрь неймспейса WealthLab.Strategies.
 
Опционально можно установить лимиты (делать это нужно в конструкторе сразу после вызова data.init), например:
 
data.set_limit_Average(0.2, 10); // Не писать в файл результаты с 0.2% < Average < 10%
 
 
 
WealthLab: код оценки линейности эквити
 
WealthLab: код оценки линейности эквити
В архиве помимо самого текста класса есть пример применения (example.cs)
После выполнения оптимизации полученный текстовый файл импортируем в эксель (устанавливаем галочку «Разделитель столбцов – символ табуляции) и работаем: делаем выборки, сортировки и пр.
 
 
НАЗВАНИЯ СТОЛБЦОВ


-первые столбы именуются по именам переменных StrategyParameter’ов
NetProfit — Сумма процентных приращений
Trades — Количество сделок
Average —  Средняя прибыль на сделку (%)
Win% — Процент прибыльных
MaxDrawdown —  Максимальная просадка (по процентным приращениям)
ProfitFactor — Отношение прибыль/убыток (по процентным приращениям)
RecoveryFactor — Отношение прибыль/макс.просадка (по процентным приращениям)
Linearity —  Линейность эквити – вычисляется как ширина канала, в который укладывается вся эквити, деленная на конечную прибыль (пояснения см. ниже)
Integral — Площадь всей просадки (пояснения см. ниже)
Product – Прибыль при реинвестировании с 1-м плечом (в % от счета)
ProductDrawdown — Просадка при реинвестировании (в % от счета)
 
По коду видно, что нетрудно добавить какие-то свои параметры.
 
ДОПУСКИ


  1. Путь, указанный при вызове data.create_file, должен существовать, иначе из велса вылетаем по эксепшену. Хрен его знает, как сделать, чтобы просто сообщение выкидывал. Кто в курсе, подскажите?
  2. Т.к. есть операции деления (например, при вычислении PF), то в том случае, когда получается нулевой знаменатель, результат подменяется большим числом 10e10.
  3. При вычислении площади просадки не учитывается, что одновременно могут быть открыты две разнонаправленные сделки, поэтому просадка будет прибавлена, в то время в реальности она будет отсутствовать. Это можно переписать, но мне лениво, тем более, что в подавляющем большинстве случаев меня устраивает оценка и в таком виде.
 


ЛИНЕЙНОСТЬ


Ниже показаны два графика эквити, получившиеся при разных параметрах. Как видно, оба имеют почти одинаковый NetProfit, более того, второй имеет меньшую просадку и, как следствие, больший рекавери фактор. Однако, второй график в то же время долгое время (почти 2 года) находится в боковике, отсюда становится ясно, что система с такими параметрами не очень пригодна. Ширина канала (желтые линии) говорят о том, что дальше характеристики имеет смысл рассматривать только для первого варианта.
 WealthLab: код оценки линейности эквитиWealthLab: код оценки линейности эквити


Линейность я вляется относительным параметром. Нельзя сказать «линейность=0.5» — это хорошо или плохо. Эту цифру нужно смотреть вкупе с результатами тестирования на других параметрах.
 
ИНТЕГРАЛ


Интеграл вычисляется как общая площадь красной области. Т.е. не только сам факт просадки, но так же ее глубина и длительность.
WealthLab: код оценки линейности эквити
 
 
Данная оценка зависит от таймфрейма, т.к. по длине измерения производятся в барах (давно уже хотел сделать в минутах, но руки не доходят).
8 Комментариев
  • Vitastic
    06 сентября 2012, 19:58
    Антон, очень интересно!!! Спасибо!
  • MSH
    06 сентября 2012, 20:02
    Путь, указанный при вызове data.create_file, должен существовать, иначе из велса вылетаем по эксепшену.

    Может try, catch?
      • MSH
        06 сентября 2012, 20:11
        Антон Кротов, это тебе спасибо за отличный код ;)
  • legavv
    10 марта 2013, 15:10
    Антон, не хочу выглядеть навязчивым, но ссылка на код не работает. Не могли бы Вы обновить её.
  • Николай Флёров
    27 июня 2013, 08:56
    Антон, пожалуйста перезалейте код! Уверен людям еще нужен ваш компонент, и мне тоже! =)
  • Дима
    05 июня 2019, 08:12
    Файл с кодом не доступен, перезалейте пожалуйста))

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн