Перфоманс тестинга на истории
Atom
22.08.2011


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

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

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

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

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



Спасибо:


< 1 2 3 4 5  > >>
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

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


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

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

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

bender

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


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

Mikhail Sukhov

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


bender Перейти
Если действительно никто не делает(вроде брался человек) и первый пост ещё актуален, я могу сделать, вернее уже сделал - отдельное окно в гидре, которое формирует свечки разных типов по заданному интервалу времени и сохраняет их по указанному пути, свечки не скачиваются,а формируются из закачанных сделок.


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

Автоматику планируете сделать?
Спасибо:

Mikhail Sukhov

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


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


Я правильно понял идею, что свечки создаются не Гидрой, а самой программой (через CandleManager?), на которой идет прогонка? Вариант интересный. Можно попробовать это сделать парно, потому что я планирую вынести логику компрессии тиков из CandleManager в отдельный класс.

AN Перейти
Кроме того, мне не нравится, что для каждой стратегии создается свой CandleManager


Я сейчас сходу не вспомню, почему создается отдельно. А какие есть проблемы с тем, чтобы создавать один единый? Главное, чтобы тики в него лились упорядоченно (что невозможно при параллельном тестировании на разных временных диапазонах).
Спасибо:

bender

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


Mikhail Sukhov Перейти

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


Я уже сделал, правда пока редко использовал, в прикреплённом архиве классы , которые надо добавить-заменить в Гидре, делал в 3.2.5, в следующих не пробовал.
Посмотрел вторую ссылку, метод CandlesGenerate.Generate разве должен работать? Вот такой код у меня не работает:

Код
	
var candleManager = new CandleManager(trades) { IsSyncRegister = true }; 
CandleToken token = candleManager.RegisterCandles(candleType, security, args); 
IMarketDataStorage<Candle> candleStorage = null;
candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>()) as IMarketDataStorage<Candle>;
var candles = candleManager.GetCandles(token);
candleStorage.Save(candles);


Mikhail Sukhov Перейти

Автоматику планируете сделать?

Это как? Чтобы при закачке сделок автоматически создавались и сохранялись свечки? Пока нет.
CandlesCompress.rar 7 KB (245)
Спасибо:

Mikhail Sukhov

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


bender Перейти
в прикреплённом архиве классы , которые надо добавить-заменить в Гидре, делал в 3.2.5, в следующих не пробовал.


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

bender Перейти

Посмотрел вторую ссылку, метод CandlesGenerate.Generate разве должен работать? Вот такой код у меня не работает:

Код
	
var candleManager = new CandleManager(trades) { IsSyncRegister = true }; 
CandleToken token = candleManager.RegisterCandles(candleType, security, args); 
IMarketDataStorage<Candle> candleStorage = null;
candleStorage = storage.GetCandleStorage<TimeFrameCandle, TimeSpan>(security, args.To<TimeSpan>()) as IMarketDataStorage<Candle>;
var candles = candleManager.GetCandles(token);
candleStorage.Save(candles);



Выкидывает исключение? Какое?
Спасибо:
< 1 2 3 4 5  > >>

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

loading
clippy