Подсчет PnL трейда
Atom Ответить
20.02.2014


Что-то никак не могу разобраться как правильно считать PnL в S#.

Обычно, PnL = size * (buy price - sell price) * direction sign , где direction sign = 1 if long, = -1 if short.

Теперь как считает S#:
Код

NEW long: price: 141010, position: 0, totalvolume: 247, PnL: 0
Actual execution: 140940
TP: price: 140700, position: 1, PnL: 70.000000000
Actual execution: 140790

Где price - это цена заявки, actual execution - то как заявка исполнилась в реальности, TP - означает, что робот решил взять прибыль, ПОТОМУ ЧТО он посчитал, что PnL > 0.

PnL посчитан из стратегии методом MyTrades.Last().GetPnL()

Я всегда считал, что если купил по 140940, а рынок на 140750, то я в минусе, а именно -190.

Далее, в чем считается PnL? В рублях или пунктах индекса?

Если в рублях, то должно быть (-141010+140790) * 7 рублей MinStepPrice / 10 MinStepSize = -154 рубля (без учета комиссии)

Инструмент настроен так:
Код

security = new Security
            {
                Id = "RIH4@FORTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
                Code = "RIH4",
                Name = "RTS-3.14",
                MinStepSize = 10,
                MinStepPrice = 7,
                //MinPrice = 10,
                //MaxPrice = 1000000,
                MarginBuy = 10000, // задаем ГО
                MarginSell = 10000,
                ExchangeBoard = ExchangeBoard.Forts,
            };

Теги:


Спасибо:




17 Ответов
devruss

Фотография
Курсы
Дата: 20.02.2014
Ответить


И еще одно замечание: OrderGrid показывает цену заявки ту, которую я выставил в самом ордере (141010), а не ту цену, по которой в действительности произошла сделка (140940). Это можно как-нибудь исправить?
Автор топика
Спасибо:

Bond

Фотография
Курсы
Дата: 21.02.2014
Ответить


Добрый день!
Если вы про эмулятор, то там заявки высчитываются не корректно, а расчет PnL не классический. Он вроде как считает стоимость всех активов.
Приведенная вами формула верна. Я для себя по ней пересчитываю PnL.
Спасибо: devruss

devruss

Фотография
Курсы
Дата: 21.02.2014
Ответить


Bond, спасибо

Полез смотреть в исходники - судя по всему авторы считают PnL вот так:
Код

public decimal UnrealizedPnL
		{
			get
			{
				return _openedTrades.SyncGet(c => c.Sum(t => t.GetPnL()));
			}
		}


Саму функцию GetPnL() я не нашел, но уже видно, что там идет суммирование по всем трейдам.

P.S. Как же я люблю ООП: чтобы посчитать простую функцию MarkToMarketPnL = (Trade.OpenPrice - Current Price) * size * direction надо унаследоваться от 3 классов и 1 интерфейса и вызвать 4 метода рекурсивно:)
Автор топика
Спасибо:

Bond

Фотография
Курсы
Дата: 21.02.2014
Ответить


BigGrin Я тоже иногда не понимаю к чему такие "городушки". Я выкинул из эмулятора половину расчетов, заменил их своими и скорость тестирования увеличилась еще на 30%.
Спасибо:

ashot

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


devruss Перейти
Что-то никак не могу разобраться как правильно считать PnL в S#.

Обычно, PnL = size * (buy price - sell price) * direction sign , где direction sign = 1 if long, = -1 if short.

Теперь как считает S#:
Код

NEW long: price: 141010, position: 0, totalvolume: 247, PnL: 0
Actual execution: 140940
TP: price: 140700, position: 1, PnL: 70.000000000
Actual execution: 140790

Где price - это цена заявки, actual execution - то как заявка исполнилась в реальности, TP - означает, что робот решил взять прибыль, ПОТОМУ ЧТО он посчитал, что PnL > 0.

PnL посчитан из стратегии методом MyTrades.Last().GetPnL()

Я всегда считал, что если купил по 140940, а рынок на 140750, то я в минусе, а именно -190.

Далее, в чем считается PnL? В рублях или пунктах индекса?

Если в рублях, то должно быть (-141010+140790) * 7 рублей MinStepPrice / 10 MinStepSize = -154 рубля (без учета комиссии)

Инструмент настроен так:
Код

security = new Security
            {
                Id = "RIH4@FORTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
                Code = "RIH4",
                Name = "RTS-3.14",
                MinStepSize = 10,
                MinStepPrice = 7,
                //MinPrice = 10,
                //MaxPrice = 1000000,
                MarginBuy = 10000, // задаем ГО
                MarginSell = 10000,
                ExchangeBoard = ExchangeBoard.Forts,
            };


Сорри за глупый вопрос, а Вы учитываете бид\аск? В смысле что покупка фиксируется по оферу а продажа по биду? «buy price, sell price» несовсем понятно откуда.
Можно ли это понимать как немёк на некорректность вычисления PnL и Equity в S#? Или это в данном случае частность конкретной стратегии?
Потому как если PnL врёт то тесты невалидны, а это не гуд.
Я сравнительно недавно читаю этот форум и уже второе сообщение подобного толка. Настораживает...

Спасибо:

Mikhail Sukhov

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


devruss Перейти
И еще одно замечание: OrderGrid показывает цену заявки ту, которую я выставил в самом ордере (141010), а не ту цену, по которой в действительности произошла сделка (140940). Это можно как-нибудь исправить?


Только понимаем того, что такое заявка и что такое сделка.
Спасибо:

Mikhail Sukhov

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


PnL в S# считает только реализованную прибыль. Нереализованную не считает. Ее нужно считать каждому самостоятельно.
Спасибо:

devruss

Фотография
Курсы
Дата: 22.02.2014
Ответить


Михаил Сухов Перейти
devruss Перейти
И еще одно замечание: OrderGrid показывает цену заявки ту, которую я выставил в самом ордере (141010), а не ту цену, по которой в действительности произошла сделка (140940). Это можно как-нибудь исправить?


Только понимаем того, что такое заявка и что такое сделка.


Если судить по названию, то конечно OrderGrid показывает заявки, но если судить еще и по уроку, то там смешиваются понятия trade/order.

Какой элемент S# мне использовать, чтобы в таком же виде выводить только трейды? И раз уж теса про трейды зашла, то есть ли возможность создавать комментарии к трейдам (стратегия, стоплосс/тейкпрофит/условия срабатывания/ и т.д.)?
Автор топика
Спасибо:

devruss

Фотография
Курсы
Дата: 22.02.2014
Ответить


Михаил Сухов Перейти
PnL в S# считает только реализованную прибыль. Нереализованную не считает. Ее нужно считать каждому самостоятельно.


На мой взгляд, Mark-to-Market PnL намного важнее реализованной прибыли, так MtM PnL еще можно управлять, а Realized уже нет.
Предлагаю добавить в список разрабатываемых фич - MtM_PnL_Manager. Без него никакой HFT, mid-frequency trading невозможен. Если нужен feedback в качестве трейдера - готов помочь
Автор топика
Спасибо:

loop

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


devruss Перейти
Михаил Сухов Перейти
PnL в S# считает только реализованную прибыль. Нереализованную не считает. Ее нужно считать каждому самостоятельно.


На мой взгляд, Mark-to-Market PnL намного важнее реализованной прибыли, так MtM PnL еще можно управлять, а Realized уже нет.
Предлагаю добавить в список разрабатываемых фич - MtM_PnL_Manager. Без него никакой HFT, mid-frequency trading невозможен. Если нужен feedback в качестве трейдера - готов помочь



Поясните пожалуйста для неучей о чем речь?

Есть PnL который вычисляется по формуле выше, по бестбандам, минус комиссия и есть ещё с учётом проскальзывания, реджектов и прочих инфраструктурных перепонов? Верно я понимаю?

Список всех факторов влияющих на PnL пожалуйста объявите. Как понять что PnL вообще не подкручивается в положительную сторону как это делают метатрейдеровцы, что бы расторговывать клиента. Должна быть открытая формула чтоб можно было фальсифицировать пункт в пункт.
Спасибо:

devruss

Фотография
Курсы
Дата: 26.02.2014
Ответить


Есть 2 типа PnL - realized и mark-to-market (unrealized).
Realized PnL - это PnL уже полностью закрытой позиции, т.е. реализованный PnL. Realized PnL = (position close price - position open price) * direction sign , где direction sign = 1 if long, = -1 if short.
Пример - купили RIH4 по 140000, продали по 140100, заработали 100 = (140100 - 140000) * 1

Теперь с mark-to-market. Каждый шаг (раз в секунду, минуту, на каждом тике и т.д.) вы считаете PnL как если бы вы закрыли позицию сейчас. Т.е. MtM PnL = (Current price - position open price) * direction sign.
Пример - купили RIH4 по 140000 минуту назад, RIH4 сейчас стоит 1405000, значит наш MtM PnL = (140500 - 140000) * 1 = 500 - но это нереализованная прибыль, так как мы еще в позиции.

MtM PnL можно управлять, так как от него можно выставлять take profit, stop loss, всяческие risk-off стратегии и т.д. Пока из того, что я вижу - MtM PnL позиции не реализован. Это не сложно написать самому, но было бы проще пользоваться уже готовым функционалом, чтобы не встраивать свои модули каждый раз.

P.S. понятно, что объяснение упрощенное. Я не учитывал комиссии, bid/ask спред, что long должны маркироваться по биду, а shorts по офферу и т.д.
Автор топика
Спасибо: loop

loop

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


Понятно, благодарю.
Но в S# есть и стоплос и тейкпрофит ,а их никак по другому детектить нельзя кроме как анализируя MtM, значит где то «внутри» есть такие данные.
К тому же это информация важна для вычисления некоторых важных статистик например MFE\MAE и тп.
Палюбому эти данные есть.
Спасибо:

devruss

Фотография
Курсы
Дата: 26.02.2014
Ответить


loop Перейти
Понятно, благодарю.
Но в S# есть и стоплос и тейкпрофит ,а их никак по другому детектить нельзя кроме как анализируя MtM, значит где то «внутри» есть такие данные.
К тому же это информация важна для вычисления некоторых важных статистик например MFE\MAE и тп.
Палюбому эти данные есть.


Stoploss, takeprofit можно и по другому делать - например вход в трейд, и мгновенное выставление 2х заявок на takeprofit & stoploss, что-то типа котирования. При срабатывании одной из этих заявок, вторая снимается

Как S# реализует stoploss/takeprofit мне пока неизвестно
Автор топика
Спасибо:

loop

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


devruss Перейти

Stoploss, takeprofit можно и по другому делать - например вход в трейд, и мгновенное выставление 2х заявок на takeprofit & stoploss,

Это рекурсия))

А так SL и TP могут быть устроены? Вариантов не много.

По логике SL и TP, устроены следующим образом:
1) От текущего ценовой ряда отнимается величина по которой зафиксирован ордер. То есть тот самый MtM = p(t) – p(open)
2) Для ТР сигнал это MtM*dir > TPvalue
3) Для SL сигнал это MtM*dir < SLvalue

Как реализовать SL и TP без внутреннего вычисления MtM? Врядле это возможно.
MtM = (p(t) – p(open))*dir обязан быть в потрохах S#
Спасибо:

Bond

Фотография
Курсы
Дата: 27.02.2014
Ответить


Вы о чем? BigGrin
Тейк-профит и стоп-лосс стандартные заявки и они в S# не высчитываюися. Все срабатывания и выставления происходят в терминале и на бирже.
Спасибо:

devruss

Фотография
Курсы
Дата: 27.02.2014
Ответить


Bond Перейти
Вы о чем? BigGrin
Тейк-профит и стоп-лосс стандартные заявки и они в S# не высчитываюися. Все срабатывания и выставления происходят в терминале и на бирже.


Ну строго говоря, take profit ордеров нет - http://en.wikipedia.org/wiki/Order_(exchange)

Я не понимаю смысла использовать в алготрейдинге любые биржевые заявки кроме лимитных и по-рынку. Алго дает возможность все реализовать самому и не светить свои позиции и стратегии + следить за рынком с большой эффективностью. Так что под stop-loss/take-profit я понимаю скорее стратегию, нежели тип ордера

Автор топика
Спасибо:

Bond

Фотография
Курсы
Дата: 27.02.2014
Ответить


devruss Перейти
Bond Перейти
Вы о чем? BigGrin
Тейк-профит и стоп-лосс стандартные заявки и они в S# не высчитываюися. Все срабатывания и выставления происходят в терминале и на бирже.


Ну строго говоря, take profit ордеров нет - https://en.wikipedia.org/wiki/Order_(exchange)

Я не понимаю смысла использовать в алготрейдинге любые биржевые заявки кроме лимитных и по-рынку. Алго дает возможность все реализовать самому и не светить свои позиции и стратегии + следить за рынком с большой эффективностью. Так что под stop-loss/take-profit я понимаю скорее стратегию, нежели тип ордера



Полностью с Вами согласен!
Спасибо:


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

loading
clippy