Перфоманс тестинга на истории
Atom Ответить
21.08.2011


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

Я проверял производительность на примере SampleHistoryTesting. Тесты показали (мерил через dotTrace), что основной тормоз - это генерация свечек (48% уходит на CandleManager). Ускорить алго практически невозможно, так как он ускорялся и не раз. Но есть решение - использовать уже готовые свечки. В Гидре начиная с 3.2 версии появилась возможность сжатия свечек. Схема работы для бэктестера не очень удобная, так как за раз не получится загрузить и сжать все свечки (банально не хватит памяти). Поэтому я предлагаю всем заинтересованным пользователям откликнуться на это предложение и помочь в решении проблемы.

Исходники Гидры доступны каждому, они есть в дистрибутиве. Мое предложение такое. Необходимо сделать в Гидре (авто?) компрессор сделок по большому диапазону в отдельном окне. Тоесть, для такого компрессора не нужно будет выбирать и загружать сделки, а достаточно указать дни, с какого по какой нужно сжать сделки в свечки, и дальше он начнет их сжатие, загружая день за днем.

Если откликнутся желающие (а я надеюсь что такие найдутся), то со стороны S# мы сделаем авто загрузку свечек из истории через класс CandleManager. Как итог, ускорим бэктестинг стратегий, которые требуют свечки, причем существенное ускорение.

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



Спасибо:




65 Ответов
1 2 3  >
Garic

Фотография
Дата: 21.08.2011
Ответить


Что подразумевается под компрессией - схлопывание сделок прошедших по одной цене?

Мне кажется что можно было бы сделать такие варианты тестирования:

1.) Грубое тестирование - тест по заранее расчитанным и сохранённым свечам. Тут надо скармливать candleManager-у готовые свечи.

2.) Более детальное. По идее для свечных стратегий открытие позиции должно происходить по клоузу свечи. Тогда чтобы можно было прикинуть проскальзывание - будут интересны сделки только первых нескольких секунд новой свечи (сколько - это уже зависит от типа котирования используемого в стратегии).
Т.е. надо сделать в Гидре компрессию сделок, например для 5-минуток:
-реальные сделки первых нескольких секунд свечки (либо некоторое количество сделок, либо грузим сделки пока не проторгуется заданный объём - задаётся в параметрах - это зависит от типов свечей)
-компрессия - цена закрытия 5минутки, весь оставшийся объём - одной сделкой.

3.) Детальное тестирование - как щас.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 21.08.2011
Ответить


Garic Перейти
Что подразумевается под компрессией - схлопывание сделок прошедших по одной цене?

Мне кажется что можно было бы сделать такие варианты тестирования:

1.) Грубое тестирование - тест по заранее расчитанным и сохранённым свечам. Тут надо скармливать candleManager-у готовые свечи.


а. В том то и дело, что эти свечки нужно получить откуда-то. Для этого есть Гидра. Но она пока не умеет их делать массово. Нужно ее обучить.
б. На точность тестирование готовые свечки никак влиять не будут. Готовые свечки лишь оптимизируют работу CandleManager.
Автор топика
Спасибо:

President

Фотография
Благотворитель
Дата: 22.08.2011
Ответить


в качестве идеи - подгрузка свечек с финама - правда там периодичность жестка задана, зато уже все посчитано по всем инструментам.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.08.2011
Ответить


President Перейти
в качестве идеи - подгрузка свечек с финама - правда там периодичность жестка задана, зато уже все посчитано по всем инструментам.


Уже второе ответ не отвечает на вопрос. Тренд?

Подгрузку свечек делать не нужно. Все есть в тиках. Нужно лишь нарезать из. Брать финамоские свечки плохо по ряду причин:

1. Они не отличаются качеством.
2. Они только жесткий ТФ (и только ТФ).
3. Нужно делать качалку свечек.
4. Нужно делать их десериализатор.

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

Garic

Фотография
Дата: 22.08.2011
Ответить


Mikhail Sukhov Перейти

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


А, ну тогда всё проще.

Т.е. нужно сделать:
1.) Настройку в Гидре - где будет указываться какие свечи и для каких (или для всех) инструментов генерировать (сразу при загрузке данных).
2.) Кнопарь по которому можно указать тип свечей, период - и они сгенерятся
3.) Как лучше хранить свечи? Папка для каждого типа свечей - подпапка код тикера - отдельный файл на каждый день. Так?

Могу взяться, но скоро сваливаю в отпуск - может не хватить времени.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.08.2011
Ответить


Garic Перейти
Mikhail Sukhov Перейти

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


А, ну тогда всё проще.

Т.е. нужно сделать:
1.) Настройку в Гидре - где будет указываться какие свечи и для каких (или для всех) инструментов генерировать (сразу при загрузке данных).
2.) Кнопарь по которому можно указать тип свечей, период - и они сгенерятся
3.) Как лучше хранить свечи? Папка для каждого типа свечей - подпапка код тикера - отдельный файл на каждый день. Так?

Могу взяться, но скоро сваливаю в отпуск - может не хватить времени.


1. Да, наверное так. Есть такой класс VisualSecurity, куда можно будет засунуть такой признак и информацию об авто генерировании (я думаю это должна быть отдельная таблица в БД). Но это если делать автоматику. Я думаю ее можно прикрутить потом.
2. Да, фактически уже есть такое окно.
3. Со стороны Storage API уже есть готовое. TradingStorage.GetCandleStorage().
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.08.2011
Ответить


Предлагаю решиться быстрее, потому что вопрос стоит в том, войдет такое решение в 3.2 или не войдет. Следующая версия пока не планируется. Желающий должен точно высказаться в этом топике, что берет это на себя, и когда ждать от него решение.
Автор топика
Спасибо:

anothar2

Фотография
Дата: 22.08.2011
Ответить


Мне кажется или свечки можно взять за гораздо больший период чем тики, а следовательно далекие годы можно тестировать только на свечах?
Логичнее было бы строить( или качать) свечи только один раз и пихать их в бд, благо жесткий диск большой, а вот частота проца ограничена.
Кроме того многие стратегии работают только на свечах и тики им совсем не нужны.
По поводу грубого тестирования-у метатрейдера есть функция комбинированного тестирования: когда вы берете сначала все тики, когда тиков не осталось свечи меньшего диапазона, когда они закончились большего и так далее и таким методом можете тестировать за долгий период. Безусловно получается неравномерная точность тестирования, но хотя бы так.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.08.2011
Ответить


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


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

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


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

Ок, ждем тогда до среды. Если до среды никто не объявится, значит всех скорость устраивает. Меня то она и так устраивала всегда, так как я тех анализом не пользуюсь. Не понятны тогда жалобы некоторых пользователей. Обманывали меня, получается, что медленно тестирование идет.Cool
Автор топика
Спасибо:

pyhta4og

Фотография
Дата: 22.08.2011
Ответить


Mikhail Sukhov Перейти
Предлагаю решиться быстрее, потому что вопрос стоит в том, войдет такое решение в 3.2 или не войдет. Следующая версия пока не планируется. Желающий должен точно высказаться в этом топике, что берет это на себя, и когда ждать от него решение.


А чо, 3.3 не будет? Практически 33 -возраст Х.

хранение свечек я начинал делать, лежит где-то в ТФСе старом. Надо в директории с тиками и стаканами исчо candles.bin заделать. И все пропустить через общий алго сжатия. Короче, куча гемороя и в итоге ничего кроме подогнанного графека.


I will sell RTS VX on 50. Come with me!
Спасибо:

Garic

Фотография
Дата: 23.08.2011
Ответить


Mikhail Sukhov Перейти

1. Да, наверное так. Есть такой класс VisualSecurity, куда можно будет засунуть такой признак и информацию об авто генерировании (я думаю это должна быть отдельная таблица в БД). Но это если делать автоматику. Я думаю ее можно прикрутить потом.
2. Да, фактически уже есть такое окно.
3. Со стороны Storage API уже есть готовое. TradingStorage.GetCandleStorage().


1. Ок. Мне кажется правильней чтобы информация об автогенерировании можно было задавать не только для отдельного инструмента, но и по маске. Чтобы не пришлось к примеру для RI* загруженного с РТС для каждого нового фьюча настраивать.

3. А оно реализовано?
Код

var candleStorage = Storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(Security, ((DateTime)TimeFrame.DateTime).TimeOfDay);

Отсутствует реализация метода "#=qSgY$r90pFrF28LZPd8I1Iw==" в типе "#=qnoDh2NhJ_K7BrlaDnrVfD_$X6y8Kk1BuDAeot1QM$W9GwXexSSUV2IyqmZwEiQZl" из сборки "StockSharp.Algo, Version=3.2.9.0, Culture=neutral, PublicKeyToken=null".

   в StockSharp.Algo.Storages.TradingStorage.#=qjjCXVa_GkSf19tV164IPg7UEmibZUkgx4WuqhCpwOD0=.#=qy88HEUV8WIEWMypubtR3OoXNjHr1RNtBjcQh1UzlfU0=(Triple`3 #=qycS3I_WdKlNBnvNjehlFBQ==)



Я готов взяться, но мне нужно успеть до понедельника, думаю успею. Потом - сваливаю в отпуск, надо готовиться.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 23.08.2011
Ответить


Garic Перейти

3. А оно реализовано?


Что-то не то с паблишингом... Можете пока ГУИ часть и код схематично написать?
Автор топика
Спасибо:

Garic

Фотография
Дата: 23.08.2011
Ответить


Mikhail Sukhov Перейти

Что-то не то с паблишингом... Можете пока ГУИ часть и код схематично написать?


Ок, завтра-послезавтра постараюсь написать.
Спасибо:

Garic

Фотография
Дата: 24.08.2011
Ответить


Mikhail Sukhov;99431.
Да, наверное так. Есть такой класс VisualSecurity, куда можно будет засунуть такой признак и информацию об авто генерировании (я думаю это должна быть отдельная таблица в БД). Но это если делать автоматику. Я думаю ее можно прикрутить потом.


Просто окно с генерацией свечей я сделал.
А вот с автогенерацией моих познаний в C# не хватает - работа с БД вроде более-менее понятна.
А что делать с CandleToken.Args не знаю - как его хранить (строкой?), он должен в PK входить.

Добавь меня на codeplex, ник Garic.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 24.08.2011
Ответить


Garic Перейти
Mikhail Sukhov;99431.
Да, наверное так. Есть такой класс VisualSecurity, куда можно будет засунуть такой признак и информацию об авто генерировании (я думаю это должна быть отдельная таблица в БД). Но это если делать автоматику. Я думаю ее можно прикрутить потом.


Просто окно с генерацией свечей я сделал.
А вот с автогенерацией моих познаний в C# не хватает - работа с БД вроде более-менее понятна.
А что делать с CandleToken.Args не знаю - как его хранить (строкой?), он должен в PK входить.

Добавь меня на codeplex, ник Garic.


Добавил, но Гидры пока нет на codeplex. Лучше пока куда нибудь залить в другое место.

Ни с какой БД работа в Гидре в плане тиков и свечек не идет. Все выполняется на уровне Storage API. Примерный код написан в файле CandlesWindow.xaml.cs. Его нужно лишь переделать, чтобы сделки за каждый день подгружались и сжимались в свечки.
Автор топика
Спасибо:

Garic

Фотография
Дата: 24.08.2011
Ответить


Mikhail Sukhov Перейти

Добавил, но Гидры пока нет на codeplex. Лучше пока куда нибудь залить в другое место.

Ни с какой БД работа в Гидре в плане тиков и свечек не идет. Все выполняется на уровне Storage API. Примерный код написан в файле CandlesWindow.xaml.cs. Его нужно лишь переделать, чтобы сделки за каждый день подгружались и сжимались в свечки.


Я это понял и сделал - аттач.

Работа с БД - сохранение настроек - для каких инструментов делать автогенерацию свечей.
Пример есть в Hydra.Core.MarketDataSourceSettings - с этим вроде всё понятно.

Будет новая таблица: SecurityId, CandleType, Args. Вот непонятно - как хранить CandleToke.Args. Он должен входить в PrimaryKey.
Hydra.rar 479 KB (0)
Спасибо:

Yura

Фотография
Дата: 27.08.2011
Ответить


Добрый день.
Такой вопрос. Мне нужно в режиме реал тайм сохранять сделки. Допустим нужно сохранить 100 сделок по некому инструменту и как только эти 100 сделок сохраняться, применять к ним анализ и сразу же выставлять заявки. Но сохранение данных не прекращать. Все это в режиме реалтайм.Как бы вы посоветовали мне такое осуществить. Может есть примеры которые помогут мне в этом.
Спасибо:

Alexander

Фотография
Дата: 27.08.2011
Ответить


Yura Перейти
Добрый день.
Такой вопрос. Мне нужно в режиме реал тайм сохранять сделки. Допустим нужно сохранить 100 сделок по некому инструменту и как только эти 100 сделок сохраняться, применять к ним анализ и сразу же выставлять заявки. Но сохранение данных не прекращать. Все это в режиме реалтайм.Как бы вы посоветовали мне такое осуществить. Может есть примеры которые помогут мне в этом.


Создать событие, которое будет подниматься как 100 сделок сохранены и передавать именно эти 100 сделок.
Спасибо: Yura

Yura

Фотография
Дата: 02.09.2011
Ответить


Доброго времени суток. Такой вопрос, как мне сделать тестирование по нескольким инструментам сразу используя SampleSMA
Спасибо:

Alexander

Фотография
Дата: 03.09.2011
Ответить


Yura Перейти
Доброго времени суток. Такой вопрос, как мне сделать тестирование по нескольким инструментам сразу используя SampleSMA


Использовать BasketSecurity или создать несколько стратегий - по каждой на инструмент
Спасибо:

bender

Фотография
Дата: 04.09.2011
Ответить


Здравствуйте, напишу, как я решил проблему медленного тестирования по тикам. Изначально из тиковых данных гидры строятся минутные свечки(я использую только свечки по времени) и сохраняются в отдельный каталог. Это всё делается стандартными средствами S#. Затем начинается собственно тестирование, и вот как тестировать стратегии по коллекции свечек, а не тиков, в S# я не нашёл( может, чего пропустил?). Поэтому я сделал свою реализацию ITrader, в которую добавил событие NewCandle. Этот новый класс получает коллекцию минутных свечек за тестируемый период и нужный таймфрейм, по которым формирует новую коллекцию свечек нужного таймфрейма, затем идёт перебор этих свечек и с каждой новой свечёй вызывается событие NewCandle, на которое подписаны тестируемые стратегии. Кодом могу поделится, если кому надо.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 05.09.2011
Ответить


bender Перейти
Здравствуйте, напишу, как я решил проблему медленного тестирования по тикам. Изначально из тиковых данных гидры строятся минутные свечки(я использую только свечки по времени) и сохраняются в отдельный каталог. Это всё делается стандартными средствами S#. Затем начинается собственно тестирование, и вот как тестировать стратегии по коллекции свечек, а не тиков, в S# я не нашёл( может, чего пропустил?). Поэтому я сделал свою реализацию ITrader, в которую добавил событие NewCandle. Этот новый класс получает коллекцию минутных свечек за тестируемый период и нужный таймфрейм, по которым формирует новую коллекцию свечек нужного таймфрейма, затем идёт перебор этих свечек и с каждой новой свечёй вызывается событие NewCandle, на которое подписаны тестируемые стратегии. Кодом могу поделится, если кому надо.


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

Если убрать загрузки тиков, то тогда перестанут строится и стаканы. Как же у вас происходит матчинг заявок?
Автор топика
Спасибо:

bender

Фотография
Дата: 07.09.2011
Ответить


Mikhail Sukhov Перейти

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

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


А матчинг заявок это что? Если определение цены исполнения моей заявки по данным стакана, то никак не происходит, я оцениваю величину проскальзывания до тестирования и через него получаю ожидаемую цену. А так вы наверное правы, просто сделал что первое пришло в голову.
И ещё, допустим, у меня система на пробое ценового канала. По свечкам я определю момент входа, а как потом используя тики и стакан произвести матчинг? Если прогонять все тики внутри свечи, то это снова может затормозить тестирование.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 08.09.2011
Ответить


bender Перейти

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


Это исполнение заявок. Вы из своей стратегии выставляете заявку. Матчинг из или реализует или отменяет. Если реализует, получается сделка. А по сделке уже определяется общая профитность стратегии.

bender Перейти

И ещё, допустим, у меня система на пробое ценового канала. По свечкам я определю момент входа, а как потом используя тики и стакан произвести матчинг? Если прогонять все тики внутри свечи, то это снова может затормозить тестирование.


В том то и дело, что при тестировании на истории, что при проторговке в реале, код стратегии пишется одинаково. Просто пишите код так, будто торгуете на реале. Потом меняете на EmulationTrader и получаете тестирование.
Автор топика
Спасибо:

AN

Фотография
Дата: 10.10.2011
Ответить


Правильно я понял, что данную задачу сейчас никто не делает?

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

Кроме того, мне не нравится, что для каждой стратегии создается свой CandleManager, при одновременной работе многих стратегий на одном фрейме это избыточно. Подумаю над тем, чтобы сделать глобальный менеджер, который бы статическим классом отдавал нужные свечки, или что-то типа этого.
Спасибо:
1 2 3  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy