Skip to content
This repository has been archived by the owner on Jan 2, 2024. It is now read-only.

Homework for the C++ course at ITMO University (2023): "Combination classification"

Notifications You must be signed in to change notification settings

npanuhin/ITMO-CPP-combinations

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C++: Классификация комбинаций

Лабораторная работа по курсу C++, ИТМО

Теоретическое введение

На современных электронных финансовых рынках торгуется множество видов финансовых инструментов - акции (share), облигации (bond), фьючерсные (future contract) и форфардные (forward contract) контракты, различные типы опционов и т.д. Отдельным видом финансовых инструментов являются комбинации.

Комбинацией называется композитный финансовый инструмент, состоящий из множества инструментов и сопоставленных им весов:

$$C=(I_1, w_1), (I_2, w_2), ..., (I_N, w_N)$$

где $I_1, I_2, ... , I_N$ - произвольные финансовые инструменты (компоненты), а $w_1, w_2, ... , w_N$ - соотвествующие им веса ($w_1, w_2, ... , w_N \in R$). Покупка (продажа) комбинации влечет за собой приобретение (продажу) компонент с положительным весом и продажу (покупку) компонент с отрицательным весом. Простым примером комбинации может быть фондовый индекс.

Далее полезно будет знать что такое опцион. Опционом называется финансовый инструмент, дающий право его владельцу купить (колл опцион, 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). Существуют несколько возможных значений атрибута:

  1. fixed: количество компонент фиксировано и равно количество описанному в ресурсе.
  2. multiple: количество компонент кратно количеству описанному в ресурсе.
  3. 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> имеет обязательные атрибуты:

  1. type: тип инструмента соответствующей компоненты описывается буквой из множества (F - фьючерс, O - опцион, C - колл опцион, P - пут опцион, U - инструмент отличный от опциона). Пут (P) и колл (C) опционы являются частными случаями опционов (O).

  2. ratio: вес соответсвующей компоненты описывается произвольным вещественным числом. Допускается указывать как точный вес, так и просто его знак - "+" или "-", означающие, что вес положителен или отрицателен.

Каждый лег может иметь дополнительные атрибуты описывающие свойства компоненты:

  1. strike: цена исполнения обозначается заглавной буквой латинского алфавита. Те компоненты у которых задан этот атрибут и буквенные обозначения равны должны иметь одинаковую цену исполнения. Атрибут может быть задан только для опционов.

  2. 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="-"/>
	<!-- ... -->

В данном примере цена исполнения первой компоненты может быть произвольной, цены исполнения второй и третьей компоненты должны быть одинаковы (одинаковые длины означают одинаковое смещение), но больше чем первой. Цена исполнения четвертой компоненты должна быть больше чем цены исполнения второй и третьей. Цена исполнения пятой компоненты может быть произвольной. Цена исполнения шестой компоненты должна быть меньше чем цена исполнения пятой. Атрибут может быть задан только для опционов.

  1. expiration: аналогичен атрибуту strike, описывающий в том же формате дату истечения инструмента.

  2. 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

Можно использовать стороннюю библиотеку для разбора XML, например, Pugixml или LibXML2.

Нужно подключить такую библиотеку при помощи conan.

Требования к реализации

  1. Работа с XML допустима только в рамках метода Combinations::load
  2. Данные из XML должны храниться в соответсвующих типах. Например для строк: std::string, для дробных чисел: double... (т.е. нельзя хранить всё в строчках). Приветствуется уместное использование std::variant
  3. Сравнение дробных чисел должно быть осуществленно с заданной точностью
  4. Файлы IDE и прочие файлы на прямую не относящиеся к решению не должны присутсвовать в коммитах

About

Homework for the C++ course at ITMO University (2023): "Combination classification"

Topics

Resources

Stars

Watchers

Forks