На современных электронных финансовых рынках торгуется множество видов финансовых инструментов - акции (share), облигации (bond), фьючерсные (future contract) и форфардные (forward contract) контракты, различные типы опционов и т.д. Отдельным видом финансовых инструментов являются комбинации.
Комбинацией называется композитный финансовый инструмент, состоящий из множества инструментов и сопоставленных им весов:
где
Далее полезно будет знать что такое опцион. Опционом называется финансовый инструмент, дающий право его владельцу купить (колл опцион, call option) или продать (пут опцион, put option) базовый актив (например, акцию) по определенной цене (цена исполнения, strike price) в определенный момент в будущем (дата исполнения, expiration date).
Комбинации, как и другие финансовые инструменты, могут быть различных типов. Например комбинация состоящая из одного колл и одного пут опционов с одинаковыми ценами и датами исполнения называется стреддл (straddle). А если цена исполнения пут опциона меньше цены исполнения колл опциона (даты истечения одинаковы), то комбинация называется стренгл (strangle).
Задача состоит в определении типа комбинации по ее структуре и свойствам компонент.
Множество всех типов описано в виде XML-ресурса. Каждая комбинация описыватеся тегом <combination>:
<combination name="Straddle" shortname="Str" identifier="da5a2620-575b-11df-9029-c3f2a99ff460">
<!-- ... -->
</combination>
Обязательными атрибутами тега <combination> являются полное имя типа комбинации (name), короткое имя (shortname) и UUID индетификатор (identifier). Внутри тега <combination> описываются компоненты комбинации:
<combination name="Straddle" shortname="Str" identifier="da5a2620-575b-11df-9029-c3f2a99ff460">
<legs cardinality="fixed">
<!-- ... -->
</legs>
</combination>
У тега <legs> есть обязательный атрибут - количество компонент у комбинаций такого типа (cardinality). Существуют несколько возможных значений атрибута:
- fixed: количество компонент фиксировано и равно количество описанному в ресурсе.
- multiple: количество компонент кратно количеству описанному в ресурсе.
- more: количество компонент должно быть больше либо равно, чем указано в атрибуте mincount
Внутри тега <legs> описаны компоненты комбинаций сооветствующего типа:
<combination name="Straddle" shortname="Str" identifier="da5a2620-575b-11df-9029-c3f2a99ff460">
<legs cardinality="fixed">
<leg type="C" ratio="1" strike="X" expiration="X">
<leg type="P" ratio="1" strike="X" expiration="X">
</legs>
</combination>
Каждый тег <leg> имеет обязательные атрибуты:
-
type: тип инструмента соответствующей компоненты описывается буквой из множества (F - фьючерс, O - опцион, C - колл опцион, P - пут опцион, U - инструмент отличный от опциона). Пут (P) и колл (C) опционы являются частными случаями опционов (O).
-
ratio: вес соответсвующей компоненты описывается произвольным вещественным числом. Допускается указывать как точный вес, так и просто его знак - "+" или "-", означающие, что вес положителен или отрицателен.
Каждый лег может иметь дополнительные атрибуты описывающие свойства компоненты:
-
strike: цена исполнения обозначается заглавной буквой латинского алфавита. Те компоненты у которых задан этот атрибут и буквенные обозначения равны должны иметь одинаковую цену исполнения. Атрибут может быть задан только для опционов.
-
strike_offset: описывает насколько цена исполнения компоненты дожна быть больше/меньше, чем у предыдущего опциона, для которого этот атрибут не описан. Представляет собой строку из символов "+" или строку из символов "-". Для наглядного пояснения, приведем пример:
<!-- ... -->
<leg type="P" ratio="1" />
<leg type="P" ratio="1" strike_offset="+"/>
<leg type="P" ratio="1" strike_offset="+"/>
<leg type="P" ratio="1" strike_offset="++"/>
<leg type="С" ratio="1" />
<leg type="С" ratio="1" strike_offset="-"/>
<!-- ... -->
В данном примере цена исполнения первой компоненты может быть произвольной, цены исполнения второй и третьей компоненты должны быть одинаковы (одинаковые длины означают одинаковое смещение), но больше чем первой. Цена исполнения четвертой компоненты должна быть больше чем цены исполнения второй и третьей. Цена исполнения пятой компоненты может быть произвольной. Цена исполнения шестой компоненты должна быть меньше чем цена исполнения пятой. Атрибут может быть задан только для опционов.
-
expiration: аналогичен атрибуту strike, описывающий в том же формате дату истечения инструмента.
-
expiration_offset: практически аналогичен атрибуту strike_ffset. Помимо строчек из символов "+" и "-" может содержать контретное смещение в виде "[N]{d,m,q,y}", где N - натуральное число (может быть пропущено, по умолчанию равно единице), "d" - день, "m" - месяц, "q" - квартал, "y" - год. Отметим, что expiraion_offset="q" в отличии от expiraion_offset="3m" означает дату истечения не ровно через три месяца (день в день), а истечение в следущем квартале, т.е. день может точно не совпадать, главное, чтобы разница в месяцах была равна трем.
XML-ресурс с описанием типов комбинаций расположен в репозитории.
Первая строка содержит число N - количество компонент (2 ≤ N ≤ 100000). Далее в N строках идет описание компонент:
type weight expiration strike, где type - символ "C", "P", "O", "F", "U", weight - вес компоненты, expiration - дата исполнения в формате yyyy-mm-dd, strike - цена исполнения. Цена исполнения задается только для опционов.
Если комбинация была классифицирована в первой строке вывести полное имя типа комбинации. В следующих строках следует вывести перестановку чисел от 1 до N - порядок компонент, в котором их следует рассматривать (согласно порядку описанному в ресурсе).
Если комбинация не была классифицирована следует вывести одну строку - "Unclassified".
Eсли не удается однозначно определить тип комбинации, то приоритет имеет тот тип, что описан в ресурсе раньше.
Ввод | Вывод |
---|---|
2 C 1.0 100 2013-10-19 P 1.0 100 2013-10-19 |
Straddle 2 1 |
3 F 1.0 2013-10-19 F -2.0 2013-11-16 F 1.0 2013-12-21 |
Future butterfly 1 2 3 |
2 P 1.0 100 2013-10-18 C 1.0 100 2013-10-19 |
Unclassified |
Можно использовать стороннюю библиотеку для разбора XML, например, Pugixml или LibXML2.
Нужно подключить такую библиотеку при помощи conan.
- Работа с XML допустима только в рамках метода
Combinations::load
- Данные из XML должны храниться в соответсвующих типах. Например для строк:
std::string
, для дробных чисел:double
... (т.е. нельзя хранить всё в строчках). Приветствуется уместное использованиеstd::variant
- Сравнение дробных чисел должно быть осуществленно с заданной точностью
- Файлы IDE и прочие файлы на прямую не относящиеся к решению не должны присутсвовать в коммитах