3.1 фиче реквест: Multi Security Strategy

3.1 фиче реквест: Multi Security Strategy
Atom
3/22/2011
pyhta4og


Пишу сюда пожелания к будущим версиям S#.

Следующее пожелание вызвано попыткой написать что-то типа PairTrading

MultiSecurityStrategy
============================

Редизайн Strategy для поддержки нескольких Security в одной Strategy.
Сейчас у Strategy фиксирована одна Security, один Portfolio. Методы BuyAt()/SellAt() привязаны к этой Security.

PositionManager трекает ровно одну Security.

Это не означает что стратегию работающую по нескольким инструментам нельзя сделать. Достаточно генерировать Order и руками выставлять в нем Security, Portfolio. Но позиции тоже придется мониторить руками.

Что хочется. Класс PositionManager, трекающий отображение (Security,Portfolio)->Position

Как я понимаю в самом BaseTrader так и сделано. Хочу, чтобы в PositionManager тоже было свойство Positions, элементы которого Position = (Portfolio,Security,CurrentValue)


C учетом того что стратегия одну Security скорее всего будет на одном Portfolio торговать, методы Strategy.BuyAt(), SellAt() в идеале должны принимать аргумент Security, находить для него Portfolio где эта Security торгуется (первый попавшийся Portfolio, если надо - потом его можно переопределить).

Понятно, что для этого надо по Security подходящий Portfolio искать (типа для LKM1@RTS это -RF- счет в SmartCOM, для LKOH@EQBR это -MS- счет, для РТС-Стандарта возможно третий счет)

Tags:


Thanks:


1 2  >
Mikhail Sukhov

Avatar
Date: 3/22/2011
Reply


А чем SecurityBasket не устраивает?
Thanks:

pyhta4og

Avatar
Date: 3/22/2011
Reply


А как с помощью SecurityBasket сконструировать спред 1 LKH1 long, 10 LKOH short?
Thanks:

Mikhail Sukhov

Avatar
Date: 3/22/2011
Reply


pyhta4og
А как с помощью SecurityBasket сконструировать спред 1 LKH1 long, 10 LKOH short?


Никак. То что вы пишите - это уже конкретный алгоритм робота. А это предполагается делать самостоятельно.
Thanks:

pyhta4og

Avatar
Date: 3/22/2011
Reply


Mikhail Sukhov
pyhta4og
А как с помощью SecurityBasket сконструировать спред 1 LKH1 long, 10 LKOH short?


Никак. То что вы пишите - это уже конкретный алгоритм робота. А это предполагается делать самостоятельно.


Попытаюсь объяснить.

Пишу я допустим pairs-trading. Внутри моей Strategy мне надо трекать позиции по двум Security. Если бы была одна Security, то это был бы вызов PositionManager.Position. А поскольку у меня их две, то приходится извращаться.

Было бы прикольней, если бы Strategy был изначально для Multi-Security.

Это пригодилось бы для арбитражных спот-фьюч, для опционов, для много чего.

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

Если быть предельно конкретным, то я бы хотел чтобы у Strategy вместо Security было бы List<Security>, вместо Portfolio было бы List<Portfolio> и PositionManager содержал бы набор Position аналогично как в BaseTrader. Тут должна быть правка в StrategyManager.Register() чтобы много Security и Portfolio передавалось. Но доступа к нему нет.


Вот и пишу пожелание. Потому что из-за выхода за пределы изначального дизайна S# приходится делать кривые workaround.

Thanks:

Mikhail Sukhov

Avatar
Date: 3/22/2011
Reply


pyhta4og

Пишу я допустим pairs-trading. Внутри моей Strategy мне надо трекать позиции по двум Security. Если бы была одна Security, то это был бы вызов PositionManager.Position. А поскольку у меня их две, то приходится извращаться.


Все, понял о чем речь.

Предлагаю сделать так. Все менеджеры стратегии (в том числе и PositionManager) будут возвращать позицию для SecurityBasket совокупно для всех вложенных инструментов. Нормально?

Теперь вопрос. Достаточно ли поддержать SecurityBasket только в менеджерах?
Thanks:

pyhta4og

Avatar
Date: 3/23/2011
Reply


Mikhail Sukhov

Предлагаю сделать так. Все менеджеры стратегии (в том числе и PositionManager) будут возвращать позицию для SecurityBasket совокупно для всех вложенных инструментов. Нормально?

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

Quote:

Теперь вопрос. Достаточно ли поддержать SecurityBasket только в менеджерах?


Как бы я делал.


У вас в BaseTrader есть IEnumerable<Position> Positions;

Каждая Position содержит поле Security, Portfolio, CurrentValue

Я бы хотел чтобы у нового StrategyMultiPositionManager тоже было такое поле (Positions) в котором перечислены позиции стратегии по каждой бумаге.

И метод Position GetPosition(Security).
В общем случае Position зависит и от Security и от Portfolio, видимо поэтому в BaseTrader используется Map<Pair<Security,Portfolio>, Position>. В StrategyMultiPositionManager можно упростить и делать Map<Security,Position>, потому что можно считать что 100% стратегия не будет торговать один и тот же Security на нескольких Portfolio.


Помимо этого сама стратегия сейчас привязана к одной Security и одному Portfolio (я перечислил два свойства класса Strategy). Я бы добавил свойство IDictionary<Security,Portfolio>
- чтобы знать на каком Portfolio торгуется каждая Security, используемая Strategy.
Именно из этого свойства StrategyMultiPositionManager будет узнавать Portfolio для Security, когда будет обновлять Position по событиям NewMyTrade

Плюс есть StrategyManager.Register(Strategy, Portfolio, Security)
Я бы добавил StrategyManager.Register(Strategy, IDictionary<Security, Portfolio>) - который
а) заполнял бы Dictionary Strategy->Portfolio в Strategy.
б) инициализировал бы StrategyMultiPositionManager для стратегии добавляя в него Position для всех Security с CurrentValue=0



Thanks:

Mikhail Sukhov

Avatar
Date: 3/24/2011
Reply


pyhta4og
Mikhail Sukhov

Предлагаю сделать так. Все менеджеры стратегии (в том числе и PositionManager) будут возвращать позицию для SecurityBasket совокупно для всех вложенных инструментов. Нормально?

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


Расчет дельта нейтральный позиций (я так понял у вас парный трейдинг, судя по запросу) - это целая глава в трейдинге. Ее нет стандартно. И да, делать ее в PositionManager неправильно. Это должен быть отдельный менеджер, потому что дельта поза - это не поза, а торговая стратегия.

pyhta4og

У вас в BaseTrader есть IEnumerable<Position> Positions;

Каждая Position содержит поле Security, Portfolio, CurrentValue

Я бы хотел чтобы у нового StrategyMultiPositionManager тоже было такое поле (Positions) в котором перечислены позиции стратегии по каждой бумаге.


Это серьезные изменения. Раз. И два, не уверен, что это правильный подход. Пока видится, что не совсем правильный.

Предлагаю начать с обозначения проблем. Первая проблема понятна - нет расчета дельта-нейтральной позы. Плюс нет и правильно PnL. Это все связано с менеджерами. Вторая - нет правильного определения инструмента при регистрации заявок в мульти инструментной стратегии. Что еще? Кстати, и приведите сразу, как сейчас решаете проблему (чужой опыт в этом направлении интересен)?
Thanks:

pyhta4og

Avatar
Date: 3/24/2011
Reply


Quote:

Расчет дельта нейтральный позиций (я так понял у вас парный трейдинг, судя по запросу) - это целая глава в трейдинге. Ее нет стандартно. И да, делать ее в PositionManager неправильно. Это должен быть отдельный менеджер, потому что дельта поза - это не поза, а торговая стратегия.

Нет речи о РАСЧЕТЕ дельта-нейтральных позиций, или стратегий. Это дело стратегий а не PositionManager.

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

Quote:

Предлагаю начать с обозначения проблем. Первая проблема понятна - нет расчета дельта-нейтральной позы.
Плюс нет и правильно PnL. Это все связано с менеджерами.

Дельта-нейтрального расчета я не хотел, видимо это мое высказывание про 10 LKOH - LKM1 навело Вас на эту мысль. Коэффициенты хеджа пусть каждый считает как умеет. И ставит соответствующие заявки. Но вот результат в виде реальной позиции которая получилась в резултате сделок стратегия должна узнавать от S#

Quote:

Вторая - нет правильного определения инструмента при регистрации заявок в мульти инструментной стратегии.


Это вероятно моя ремарка про BuyAt/SellAt. Для удобства можно было бы еще методы добавить c параметром Security.


Quote:

Что еще? Кстати, и приведите сразу, как сейчас решаете проблему (чужой опыт в этом направлении интересен)?


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


У меня нет кнопки "Вложение" на форуме почему-то. Код сюда положил
Thanks:

Mikhail Sukhov

Avatar
Date: 3/25/2011
Reply


pyhta4og

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


Посмотрел как устроены менеджеры. Сейчас они должны уже работать для SecurityBasket. Потому что там нет фильтра по инструменту, а расчет идет на основе получения данных из событий стратегии. А так как стратегия может иметь дочерние стратегии, где инструменты могут быть совсем другие, то и PnL будет рассчитываться так, как требуется в вашей задаче с парой инструментов. Да и позиция тоже будет правильная.

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

pyhta4og

Avatar
Date: 3/25/2011
Reply


Quote:

Посмотрел как устроены менеджеры. Сейчас они должны уже работать для SecurityBasket. Потому что там нет фильтра по инструменту, а расчет идет на основе получения данных из событий стратегии. А так как стратегия может иметь дочерние стратегии, где инструменты могут быть совсем другие, то и PnL будет рассчитываться так, как требуется в вашей задаче с парой инструментов. Да и позиция тоже будет правильная.


Мы с рефлектором тоже смотрели. Глаза сломали. В новом StrategyPositionManager в режиме расчета позиции по сделкам похоже баг - позиция только увеличивается.

Еще, я могу ошибаться, но если ордер на 3 контракта поматчат в три попытки по 1 контракту то тоже неправильно посчитает.


Насчет дочерних буду думать. В принципе идейно правильно, на одну ногу Quoting-продажу напустить, на другую маркет-закупку. И из родительской запускать то одну то другую.

Я не пробовал пока запускать несколько стратегий параллельно.

У них события NewOrder/OrderChanged вызываются только для тех заявок, что инициализированы именно этой стратегией?
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy