Тиковая история, импортированная из рейтерса, S# 4.2.3.4 - при бэктестинге вылазят вот такие вот баги: http://gyazo.com/1fb882dd0a0df11e31ac31d1eaf4c0dd S# проводит сделки по несуществующим ценам. На версии 4.2.2.16 было все нормально
Также появилось ощущение, что на новой версии сильно возросло проскальзывание - проходит сигнал на вход/выход из позиции, а реальный execution проходит совсем по другим ценам
Комментарии (44)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Также, начиная с версии 4.2.3.xxx на графике PnL постоянно появляются непонятные выбросы (spikes): http://gyazo.com/3bd1a5cf9f1025018d84d8c9f764fcd1
На версиях 4.2.2.xxx такого не было
SampleHistoryTesting на тиках:
На истории, записанной Гидрой все ок. Проблемы возникают на истории, импортированной из csv в Гидру через "импорт сделок". Попробуй запустить тот же самый пример, но на данных, скачанных с сайта finam или mfd и импортированных в гидру.
P.S. По поводу твоего скриншота. Насколько я помню sampleSMA стратегию - она покупает при пересечении цены SMA вверх, и продает при пересечении вниз, так? Посмотри на четвертую сделку после 11:50 на графике. Должна была быть продажа сразу после пересечения - посмотри на реальный execution - там slippage пунктов в 10. Теперь если использовать пробойные стратегии - на новый min или max, то возникают картинки как в моем скриншоте.
Михаил, хочу напомнить, что твой продукт называется S#, а не Sample Library. То, что примеры работают нормально, говорит только о том, что примеры работают нормально. Вот реальная живая ситуация, давай ее решать. Переход с ветки 4.2.2.xxx на 4.2.3.xxx привел к этим проблеммам - код идентичный. Напомню, что откатиться назад нельзя, так как база гидры обновилась и старая ветка не видит всю историю, записанную новой гидрой.
Ты отбиваешься от баг репортов как только можешь, а потом отрицаешь проблемы до последнего, даже когда есть скриншоты и точные описание проблем. Таким темпом вместо того, чтобы развивать свой продукт и делать его лучше, ты просто из очень классного, но все еще сыроватого продукта, деградируешь продукт до состояния, когда пользоваться будут только программеры и нубы трейдеры, гоняющие роботов на 1 фьюч РТС.
Странное заявление. А зачем тогда этот форум, если не для баг репортинга?
Вернемся к тебе. Как мне проверять? Логичнее было бы сделать step-by-step проверку тебе. Эмулятор работает в одном потоке, поэтому все детерминированно. Возможно всплекс идет и из-за данных. Может из-за эмулятора. Сейчас это не баг репорт. Это предложение погадать о том, где проблема.
Ок.
Инструмент - SiM4, данные записаны Гидрой вживую, никаких артефактов нет.
Данные тиковые, никаких всплесов не было. Проблема в PnL Manager. Я так понял, он теперь начал делать mark-to-market PnL открытых позиций, но только в определенные моменты он делает это неправильно. Такая картина повторяется при каждом прогоне стратегии.
Заметь: произошло изменение позиции, при этом цена не поменялась. Если я продал 4 контракта по цене 36039 и цена осталась той же, то мой PnL не изменился (ну совсем по честному, то изменился, так как short маркировать надо по offer, но если маркировать по тикам, то не изменился).
Глубже, чем данный report я посмотреть уже не могу. Проблема внутри PnL Manager
Значит на рынке в какой-то момент есть неправильная цена. Можно вывесли в лог текущие цены инструмента?
Так я и вывел потиковое изменение цены с момента открытия позиции. Там цена не менялась вообще! Более того, чтобы была неправильная цена на USD/RUB фьючерсе в 1500 пунктов? Еще раз повторю - я препроверил все 5 раз: на 4.2.2.xxx тот же самые код, на тех же самых данных все правильно показывает, а на 4.2.3.xxx уже нет.
И еще один момент - если посмотришь на последние значения перед тем как PnL выправился, там как раз цена изменилась, а вот PnL нет. Короче что-то не так с тем, как реализован метод mark-to-market PnL.
Не тики, а значения в стакане (лучшая пара). И еще неплохо бы вывести стоимость пункта.
По поводу спайков - они возникают в момент открытия позиций. В некоторых случаях S# при открытии позиций маркикует ее по каким-то случайным ценам и получается очень большой мгновенный позицивный или негативный pnl - естественно, при закрытии позиций, все выравнивается - отсюда и спайк.
Мне кажется, что трейды по несуществующим ценам, спайки в PnL при открытии позиций и т.д. - все это части одного большого бага, который закрался с версии 4.2.3.xxx
Пример: http://gyazo.com/c089e4108b5719798fbcadc8f8b88810 Чтобы не палить стратегии, сорри за очень маленьких скриншот:
Видно, как возникает большой спайк - при продаже, потом при закрытии (покупке) PnL выравнивается. Так как PnL данного трейда по отношени к PnL всей стратегии не такой большой, то и реальный realized pnl не дает такого уж большого прироста. Но при этом спайк реально огромный. Данных спайк повотяется на каждом прогоне в одном и том же месте
SampleHistoryTesting - работает нормально.
Я конечно могу еще раз запустить бэктестинг на этот пример, но ты реально думаешь, что на фьючерсе на USD/RUB у тебя может быть bid/ask spread в стакане на 1500 пунктов?! Стоимость пункта = 1. Если бы стоимость была неправильная, то такая ситуация повторялась бы каждый раз, а не иногда.
Вот лог с нового прогона стратегии - прогон новый, но временные сигнатуры совпадают вплоть до секунд
Обрати внимание, что неправильная оценка PnL возниает сразу же после трейда. При этом ни цена, ни bid/ask не поменялись. Надеюсь, теперь убедил, что проблема в реализации PnL manager?
Начну с конца - обеждать не нужно. По умолчанию я верю людям до тех пор, пока они не докажут обратное о себе. Но понять где ошибка нужно как-то. Нет ни кода, ни данных. Фактически ошибку невозможно воспроизвести.
По PnLManager. Скачки в PnL могут быть только из-за нереализованной прибыли. Она основывается на рыночных ценах. Пока не могу понять где же ошибка. Можно в лог еще добавить 2 параметра? PnLManager (PnL и RealizedPnL). Чтобы точно удостоверится, что ошибка в PnL расчете.
А что происходит между этими строчками?
абсолютно ничего. Может там внури PnLManager таймер какой-то срабатывает, что он пересчитывает позицию... но точно также себя ведут все спайки без исключения
Тогда надо в момент, когда произошел спайк, как-то вывести в лог состояние объекта Strategy.PnLManager. Он внутри себя имеет поля, и нужно добраться до всех внутренних полей. Проще было бы открыть его в Debug студии, и сделать скрин.
Это уже выше моих навыков программирования. Давай на неделе в skype спишемся, в реальном времени все сделаем
Ок, проблема была найдена и локализована. PnL Manager при открытии новой позиции, маркирует ее по последней закрытой сделке, а потом через 1 мин обновляет по текущим ценам.
Привет! А можно чуть более подробное описание проблемы? И какое решение применили?
Описание проблемы было лучше всего видно на скриншотах: PnL Manager неверно рассчитывал нереализованный PnL - были spikes. Суть проблемы:
Решение: PnL Manager при открытии новой позиции, маркирует ее по цене открытия сделки
Ошибки с трейдами по несуществующим ценам остались: Тиковая история из рейтерса, заново импортированная http://gyazo.com/3efbdaba16f50d093c75f553437b29d1
еще скриншоты - объемы проходят по свечкам, но сделки все равно сильно мимо рынка http://gyazo.com/275e265c6aae6a33487ff4421cae1a45
По просьбе Михаила добавлю: все ордера "по-рынку", т.е. лимитки с далекой от рынка ценой... триггер на срабатываение ордера - какое-то событие, после чего выставляется ордер "по-рынку". Если надо выложить какие-нибудь логи - говорите что, выложу
Михаил уже в чате сказал - на графике не сделки, а заявки.
Требуется переводчик с русского на русский.
Переводчик с русского на русский все-таки уверен, что ранее было написано, что на графике именно сделки. Есть пруф: сверху заявки (выделена исполненная на графике заявка) - внизу реальный execution http://gyazo.com/a2e139b186c91958d62cd76842bb59a6
Тоесть заявки вне рынка? Скорее всего тут рассинхронизация в отрисовке. Тоесть заявка исполняется по цене, когда рынок дойдет и рисуется с запозданием.
Выведи в лог в обработчике NewMyTrades: время сделки, текущее время, цену сделки и цены в стакане (или последнюю тиковую сделку).
Как ни странно, но уже на 10 мин свечках все ок, таких диких выбросов нет
Я не знаю что у тебя за рынок, но на известных мне биржах логика устроена не так. Если ты хотел сделать маркет-заявки, то сделал ты их неправильно.
Нужен лог, чтобы дальше анализировать проблему. Нет лога - нет предмета для дискуссий.
Ок, расскажи мне тогда пожалуйста как правильно реализовывать заявки "по-рынку".
Вот лог. Но вначале картинка: http://gyazo.com/15e7d87fe5f1e5fb11e9a459345dff6b В данном примере робот умудрился купить по цене, которой не было еще 17 минут (!!!) - робот успел уже закрыть позицию раньше, чем рынок дошел до той цены, где был execution 12/18/2013 13:50:13 TEST - 12/18/2013 13:50:13 Actual execution: 3466 last price: 3466.25 TEST - 12/18/2013 13:50:13 Actual execution: 3468 last price: 3466.25 TEST - 12/18/2013 13:50:14 Actual execution: 3466 last price: 3466.25
Заявка была одна - покупка 4 контрактов "по рынку" 18.12.2013 13:50:13 4 3516.25 Buy Limit Done 18.12.2013 13:50:14
Код:
Последняя цена и время запонимаются в обработчике индикаторов внутри стратегии.
12/18/2013 13:50:13 TEST - 12/18/2013 13:50:13 Buy Actual execution: 3466.25 last price: 3466.25 12/18/2013 13:50:13 TEST - 12/18/2013 13:50:13 Buy Actual execution: 3467.75 last price: 3466.25 12/18/2013 13:50:13 TEST - 12/18/2013 13:50:14 Buy Actual execution: 3466.00 last price: 3466.25 12/18/2013 13:50:13 Avg Entry price 3,467 on 4 volume
TEST - 12/18/2013 13:50:43 Sell Actual execution: 3464.25 last price: 3465.75 12/18/2013 13:50:43 TEST - 12/18/2013 13:50:43 Sell Actual execution: 3464.00 last price: 3465.75 12/18/2013 13:50:43 TEST - 12/18/2013 13:50:43 Sell Actual execution: 3463.50 last price: 3465.75 12/18/2013 13:50:43Avg Closing price 3,464 on -4 volume
http://gyazo.com/42d05b7097693c9dfb61eac2f8a88fdf
Все равно execution просто жуть, причеи стабильно хреново исполняет по ценам вне рынка...
5 бэктестов - цены не меняются. Но таких цен нет ни в прошлом, ни в будущем в пределах 30 минут...
Это при тестировании на свечках? Если включить тестирование на тиках?
все тоже самое. вот еще пример (уже на тиках):
Версия 4.2.25, все тот же адский расколбас с трейдами абсолютно вне рынка На этот раз ETF - XLF, из 1сек данных S# делает минутные свечки, объемы там огромные, так что с ликвидностью все ок.
http://gyazo.com/75cc08306defa2d72e50516c97f68b3d
Сделки идут сильно мимо рынка
Как воспроизвести?
данные тебе выслал. Воспроизводимость: импортни данные в Гидру и запусти SampleHistoryTesting, либо любую стратегию и посмотри где реально проходит execution. все как 2 месяца назад.
Какая-то засада с импортом csv... R ту же самую стратегию обрабатывает ок, так что данные точно не битые
Пока делаю пример, решил прогнать на данных IQfeed (с трудом скормил нужный тип биржи, через копирование Nyse и изменения имени - про это соседняя тема):
http://gyazo.com/1f1ebcf3dcaa352cf10844053faf34fc
Проблема локализовалась: Если запускать тест на большом объеме, то при исполнении заявки S# смотрит на текущий объем свечи, исполняет объем свечи по цене закрытия, а вот оставшийся (объем заявки - объем свечи) он исполняет по какой-то рандомной цене...
Понятно откуда взялась проблема, вроде как по какой цене исполнить очень большой объем - но метод решения путем исполнения вне рынка - неправильный. На мой взгляд нужно сделать какой-нибудь режим тестирования, при котором будет считаться мгновенное исполнение всего объема по цене закрытия текущей или открытия следующей свечи (если нет стаканов). MatchOnTouch = true проблему не решает, картинка остается той же.
Update: Уменьшил объем до мизерного - практически всё исполнение вне рынка пропало, кроме нескольких мест
Мне кажется, что при тестировании на свечках, сделать исполнение по цене закрытия или открытия следующей - это самый правильный вариант. На сегодняшний день так себя ведут большинсто квантовых пакетов (quantstrat в R) например. Данный подход решил бы все проблемы. А проскальзывания надо либо на тиках + стаканы смотреть, либо просто закладывать дельту.
На SampleHistory теория воспроизводится? Какие изменения нужно внести?