Секреты TSLab | Торговые роботы | События
16 Фев

Поставщик исторических данных. Использование и настройка.

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

1 Дек

Самостоятельное обучение TSLab API.

Так как довольно близко общаюсь с создателями этой прекрасной программы, то вижу постоянное указание на то, что нет полной и хорошей документации по TSLab API, и это правда. Документации по TSLab API очень мало. Группа разработчиков не слишком велика и основные силы задействованы над улучшением программы, поэтому на вылизывание документации времени  не хватает. Тем более что постоянно вносятся дополнения и поддерживать документацию в актуальном состоянии становится сложным. В оправдание могу  сказать, что материалов по TSLab API, наоборот, очень много. Если поискать по форуму TSLab, то можно найти огромное количество примеров скриптов и кубиков написанных на TSLab API. А что может сделать самостоятельное обучение TSLab API проще чем готовые примеры реальных кодов? Никакая документация (ну кроме документации Microsoft :) ) не дает такой полноты картины как реальный и рабочий код чего либо. Как пример крутого кода могу привести Адаптивные индикаторы. Его можно спокойно скачать и изучать. Помимо этого, есть достаточно простой способ изучения API в самостоятельном режиме, об этом способе мы и поговорим.

10 Ноя

Виртуальные позиции в TSLab.

Для трейдера не существует понятия “виртуальные позиции”, поэтому для него данный термин может быть достаточно туманен. Но если вы начали работать с TSLab, то столкнетесь с этими “виртуальными” позициями рано или поздно. О них я даже уже упоминал в прошлых статьях. Зачем они нужны? Какая с них польза? Может быть даже опасность? Обо всем этом и поговорим ниже.

29 Сен

Гладкость эквити в результатах оптимизаци.

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

Выдаем гладкость эквити в результаты оптимизации.

- Ладно, чертяка. Кого хочешь уговоришь. А как насчет выдачи этой цифры в окно результатов оптимизации? Задача исходная была такая. Или опять все забыл?

Не забыл конечно, но для того чтобы вывести число в таблицу результатов оптимизации придется снова выдумывать. Нет штатной возможности в визуальном редакторе это число туда  поместить. Опять будем плясать вокруг TSLab API. Применим малоизвестную возможность находящуюся в интерфейсе IContext

public interface IContext
{
    ...
    ...
    // в таблице результатов оптимизации видим то что записано в это свойство
    double ScriptResult { get; set; }

    ...
    ...
}

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

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

    [HandlerCategory("RusAlgo")]
    [HandlerName("ScriptResult")]
    [InputInfo(0, "Данные")]
    public class SaveToScriptResult : IOneSourceHandler, IValuesHandler, IDoubleInputs, IDoubleReturns, IContextUses
    {
        public IContext Context { set; private get; }

        public double Execute(double value, int barNum)
        {
            Context.ScriptResult = value;

            return value;
        }
    }

Как видно, используем совершенно штатные возможности TSLab API в совершенно штатном порядке. Никаких ноу-хау и секретов.

Собираю все воедино и получаю:

Гладкость эквити в результатах оптимизаци.

Рисунок 1. Полный скрипт выдающий гладкость эквити в результаты оптимизации.

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

Гладкость эквити в результатах оптимизаци.

Рисунок 2. Результаты оптимизации с показателем гладкости эквити.

Гладкость эквити в результатах оптимизаци.

Рисунок 3. Эквити с показателем 0.3 и фактором восстановления 2.27

Гладкость эквити в результатах оптимизаци.

Рисунок 4. Эквити с показателем 5,8 и фактором восстановления 0.98

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

Выводы

Исходная задача была решена и теперь благодаря нашему новому кубику мы можем получить следующие бонусы:

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

 

Послесловие

- А почему не использовать просто фактор восстановления? Зачем эти танцы с бубнами вокруг гладкости эквити если фактор восстановления тоже показывает более волатильную эквити?

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

Чтобы показать это различие, посмотрим два результата с равными показателями волатильности, но отличными значениями фактора восстановления.

Рисунок 5. Фактор восстановления отличается в 8 раз!

Как видим с Рисунка 5 фактор восстановления двух результатов отличается в 8 раз, а это серьезное различие. При этом, показатель гладкости у нас практически одинаков. Интересная комбинация. Давайте посмотрим на эквити этих двух вариантов, чтобы наглядно увидеть разницу.

Гладкость эквити в результатах оптимизаци.

Рисунок 6. Эквити с фактором восстановления 3.96

Гладкость эквити в результатах оптимизаци.

Рисунок 7. Эквити с фактором восстановления 0.58

- Поняяяятно. Теперь ясно, что фактор восстановления не отражает гладкости эквити, а показывает скорее более качественную эквити в плане доходности. А наш показатель, как раз, показывает только гладкость, не учитывая остальные параметры типо доходности и просадок. Кажется дошло.

PS: Вот и все. Кубики которые были использованы теперь можно найти по специальной ссылке.

А напоследок интересное видео по анализу данных

15 Сен

Эквити. Оценка гладкости эквити.

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

Начало.

Выходной. На улице полный хаос. Холод, дождь, ветер. На личный самолет пока не заработал, поэтому не летаю в Лондон пить чай по вечерам. Сижу дома. В голове крутятся различные картинки на тему статистики, так как последнее время плотно сел на робастные методы оценки характеристик временных рядов. Все это дело изучается не только путем чтения книжек, но и на практике, путем изучения реальных данных взятых из торговых стратегий. Препарируются данные на R , что здорово ускоряет процесс по сравнению с C# и TSLab в голом виде. Конечно без TSLab API тоже не обошлось, но только для выгрузки данных. Вдруг слышу где-то внутри головы:

- А давай-ка покрутим линейную регрессию на эквити и посмотрим что там получается? Заодно проверим расхождения между стандартной линейной регрессией и робастными методами типо “Tukey line”. (прим. толкового описания в инете не нашлось. По факту это регрессия не от среднего а от медианы, что позволяет избежать влияния выбросов на результат регрессии и давать лучший результат на реальных данных)

Мужик сказал, мужик сделал. И началось.

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

Загружаю мартингала, даю ему данные и без каких либо подкруток получаю жутковатую картинку, изображенную на Рисунке 1. Чтобы выгрузить эту эквити из TSLaba пришлось немного пошаманить на TSLab API и накидать метод экспорта данных. Для уменьшения количества данных, экспорт делаю на конец каждого часа (да и нет смысла выгружать минутки, это не изменит результаты, только увеличит время расчета).

Эквити. Оценка гладкости эквити.

Рисунок 1. Исходная эквити в TSLab

Эквити. Оценка гладкости эквити.

Рисунок 2. Эта же самая эквити в R

- Хм… что за ерунда. Какие-то странные разрывы между данными. Их нет на исходной эквити. Где то ошибка. Думай сиди.

Непродолжительное обдумывание принесло плоды. Разрывы – это не торгуемые часы, например ночь. На графике они рисуются разрывами, и в результате видим линию там где есть разрыв. График построен в виде “timeSeries” и учитывает часы, когда данных нет. Так что все нормально.

- Ну и зачем ты нарисовал тогда эту картинку? Регрессию по ней посчитать не получится, нарисовать ее на график тоже не получится. Надо переводить в другие единицы измерения ось Х.

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

Эквити. Оценка гладкости эквити.

Рисунок 3. Эта же самая эквити в R без учета не торгуемых дней.

- Ну ведь можешь когда хочешь. Можешь даже сходить пообедать. – сказал я себе на этом этапе.

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

Эквити. Оценка гладкости эквити.

Рисунок 4. Эта же самая эквити в R с регрессиями.

- Тэксь… вот эта красная штука есть Tukey line, а черная обычная регрессия. И что-то они почти совпадают. Подозрительно. Опять что-то упустил или сделал не так.

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

- Ок. Ладно, если наши регрессии показывают тенденцию эквити, что показывает линия медианы с рисунка 1? Какую то ерунду. Ты так не думаешь?

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

- Ну а метод расчета этой линии медианы ты не знаешь что-ли?

Увы, метод расчета я не знал. Спросил у разработчиков, но они были все в глубоком отдыхе и не отвечали. Ждать было нереально, нужно было двигать процесс вперед.

- Короче, берешь простой скрипт на API генерируешь поддельную эквити с идеальной гладкостью, рисуешь обе регрессии. Смотришь. Потом портишь исходную эквити добавив в нее много крупных просадок малой длительности, эмулируя, таким образом, выбросы в данных. Опять строишь обе регрессии и смотришь. Полюбому будет большая разница между линиями регрессии. Усек?

Так точно! Через 5 минут скрипт генерирующий супер эквити был готов. Результатом его работы стала мечта любого трейдера.

Эквити. Оценка гладкости эквити.

Рисунок 5. Ах, какая эквити! Мне б такую!

Эквити. Оценка гладкости эквити.

Рисунок 6. Эквити и обе регрессии.

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

Эквити. Оценка гладкости эквити.

Рисунок 7. Эквити с просадками и обе регрессии.

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

Ну уж нет! Теперь я эту эквити живой не отпущу. Буду мучить до наступления летального исхода. Беру и порчу аж 30% исходных данных. Получаю кучу кратковременных просадок и график становится жутко страшным, НО наконец получаю серьезное расхождение между двумя типами регрессии.

Эквити. Оценка гладкости эквити.

Рисунок 7.1. 30% данных испорчены просадками.

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

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

Оценка гладкости эквити. Реализация в TSLab.

Как вы, наверное, догадались на этом ничего не закончилось, а только началось.

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

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

Эквити. Оценка гладкости эквити.

Рисунок 8. Показатели качества регрессии для  идеальной эквити.

Эквити. Оценка гладкости эквити.

Рисунок 9. Показатели качества регрессии для  эквити порченной на 30%.

Явно прослеживается заметное отличие искомого показателя (если он равен 1, то исходные данные являют собой прямую линию). Отлично.

Мысль задала направление и сразу был выбран способ реализации линейной регрессии в TSLab. Это библиотека alglib. Она позволяет использовать ее в коде C#, что естественно дает нам возможность написать кубик вычисляющий отклонения эквити от регрессии.

- Стой! А как ты будешь данный кубик в TSLab подключать? Нужно ведь чтобы в него приходили все данные обо всех сделках происходящих на заданном инструменте. Только тогда мы сможем выдернуть эквити и построить регрессию. Похоже тупик.

Вообще, в TSLab нет никакой штатной возможности получать данные по эквити и делать над ними свои собственные операции. Приходится выдумывать разные ходы вокруг возможностей TSLab API. Остановить мысль было уже сложно и через дцать минут решение было найдено. Сделаем обычный последовательный кубик на вход которого будем подавать инструмент и все позиции которые есть в скрипте. Тогда наш кубик будет обсчитываться всегда после того как обсчитаются позиции и мы сможем видеть все сделки по инструменту. Супер! Рисую заготовку такого кубика, собираю dll и подключаю к TSLab. Собираю скрипт и подключаю туда кубик. FAIL! Не работает. Невозможно в текущей версии сделать последовательный кубик с неопределенным числом входов в который подаются позиции.

Еще дцать минут прошло и новый вариант был собран. Есть такой крутой кубик “Доход за все время”, и он по факту представляет собой эквити. Вот волатильность этой кривой мы и будем пытаться найти. Бинго.

- Ах, ты ж морда. Соображаешь. Хвалю.

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

Эквити. Оценка гладкости эквити.

 

Рисунок 10. Скрипт с кубиком оценки волатильности эквити.

Конечно, “волатильность эквити” не совсем точное определение того, что кубик рассчитывает, но ничего умнее в голову не пришло. Поэтому кубик называется именно так.

Пишу начинку кубика, походя решив пару проблем касающихся оптимизации по скорости. Все уже почти завершено как …

- Слушай, а что мы будем из кубика выдавать? Мы же еще не знаем как оценивать качество регрессии и какие возможности для этого дает alglib.

Точно. В пылу работы я забыл про главное, про показатель качества модели. В R они есть и их несколько, а вот в alglib их возможно нет совсем. Изучив документацию вздохнул с облегчением. Есть один показатель, позволяющий оценить качество регрессии в относительных величинах. Значит будем его и применять.

Собираю все воедино, запускаю скрипт. Бах, трах, все завелось и я лицезрел следующую картинку:

Эквити. Оценка гладкости эквити.

Рисунок 11. Рабочий скрипт с оценкой гладкости эквити.

Эквити. Оценка гладкости эквити.

Рисунок 11а. Эквити скрипта.

По левой шкале можно видеть число 2231, которое являет собой ту самую оценку гладкости.

 – Надо проверить на другой менее волатильной эквити. Не доверяю я что-то этой поделке. Выглядит странно, работает странно. Не верю!

Сказано, сделано. Загружаю другие данные, рисую другую эквити. Вижу другой показатель.

Эквити. Оценка гладкости эквити.

 

Рисунок 12. Результат с меньшей волатильностью эквити.

Эквити. Оценка гладкости эквити.

Рисунок 13. Сама эквити с меньшей волатильностью.

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

- А что это оно у тебя только на самом последнем баре что-то показывает? А на остальных что? Эквити гладкая как стекло?

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

- Ладно, чертяка. Кого хочешь уговоришь. А как насчет выдачи этой цифры в окно результатов оптимизации? Задача исходная была такая. Или опять все забыл?

Не забыл конечно но …  это уже другая история о которой можно будет прочитать в следующей статье.

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

5 Сен

Запрос котировок для TSLab и типичные ошибки.

Если вы пользуетесь программой TSLab дольше чем одну неделю, то для вас не является секретом то, что можно скачивать исторические котировки и подсовывать их в TSLab для тестирования ваших торговых роботов на истории. Совсем необязательно иметь (и платить за него) реальный счет у одного из многочисленных брокеров для разработки и тестирования торговых роботов в TSLab. Все это вы можете делать совершенно бесплатно, делая запрос котировок из открытых источников. 50% моих учеников (как оказалось к моему большому удивлению) делают это неправильно и получают неверные результаты тестирования. Разбором типовых ошибок запроса котировок мы и займемся сегодня.

25 Авг

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 3!

В предыдущей статье, чтобы подогреть интерес к вопросу, я снова показывал не самый правильный способ того, как запрашивать у TSLab открытые позиции. Результаты получились довольно интересными даже для меня самого, а для вас, дорогие мои читатели, они были, возможно, целым открытием в TSLab. Наконец, долгожданная статья с самым правильным способом работы с позициями. Данный способ отлично работает на версии 1.2.xx. Насчет версии 1.3.xx загадывать не будем. На 1.1 данный способ вообще не существует, так как появился только в 1.2.

18 Авг

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО 2!

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

6 Авг

Запрашиваем в TSLab открытые позиции ПРАВИЛЬНО!

При написании любого алгоритма приходится работать с позициями. Нужно знать о наличии открытых позиции, чтобы не открывать их снова и снова. TSLab уже существует довольно давно и за это время он очень сильно видоизменился. Была версия 1.0, потом 1.1 и сейчас 1.2. В каждой из них был свой ПРАВИЛЬНЫЙ способ как запросить у tslab открытые позиции. Практика показывает, что не все понимают отличий между разными версиями и продолжают в новых версиях использовать устаревшие методики. В результате работа скриптов оказывается неожиданной для вашего депозита. Это, особенно в последнее время, наблюдается у перешедших на 1.2 с версии 1.1. Попробую перечислить различные доступные способы запроса открытых позиций, доступные через TSLab API , и расскажу об их плюсах и минусах.

21 Июл

Cкрипты TSLab. Покупать или нет?

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

6
Ноя
2017

Доверительное управление. Результаты в октябре 2017 года.

Доверительное управление. Результаты в октябре 2017 года. В октябре продолжался боковик на всех торгуемых активах. Российский… »

7
Окт
2017

Доверительное управление. Результаты в сентябре 2017 года.

Доверительное управление. Результаты в сентябре 2017 года. В сентябре на основных торгуемых активах (Ri и… »

8
Сен
2017

Доверительное управление. Результаты в августе 2017 года.

Доверительное управление. Результаты в августе 2017 года. Стратегия “Опционы” принесла в августе прибыль в размере… »

6
Авг
2017

Доверительное управление. Результаты в июле 2017 года.

Доверительное управление. Результаты в июле 2017 года. В июле индекс РТС вновь колебался в достаточно узком… »

14
Июл
2017

Доверительное управление. Результаты в июне 2017 года.

Доверительное управление. Результаты в июне 2017 года. Июнь индекс РТС вновь провел преимущественно в боковых движениях, а… »