<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nkrivenko</id>
	<title>Алговики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nkrivenko"/>
	<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/ru/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Nkrivenko"/>
	<updated>2026-10-23T07:01:06Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12485</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12485"/>
		<updated>2016-10-16T12:20:48Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Assignment}}&lt;br /&gt;
&lt;br /&gt;
== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - высота кластера.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
[[Файл:CLOPEGraph.png]]&lt;br /&gt;
Здесь вершина Read - чтение транзакции из таблицы, PutIntoCluster - положить t в существующий либо в новый кластер, который дает максимум Profit(C,r), WriteIfINotEqualsJ соответствует шагам 2.3.3 и 2.3.3.1 пункта 1.5.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей является квадратичным при том, что вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Алгоритм CLOPE имеет множество приложений в базах данных, в частности для MySQL: https://github.com/infozor/php_mysql_clustering_clope&lt;br /&gt;
&lt;br /&gt;
Также есть реализация на языке Go: https://github.com/realb0t/go-clope&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12215</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12215"/>
		<updated>2016-10-15T21:56:18Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Информационный граф алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - высота кластера.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
[[Файл:CLOPEGraph.png]]&lt;br /&gt;
Здесь вершина Read - чтение транзакции из таблицы, PutIntoCluster - положить t в существующий либо в новый кластер, который дает максимум Profit(C,r), WriteIfINotEqualsJ соответствует шагам 2.3.3 и 2.3.3.1 пункта 1.5.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей является квадратичным при том, что вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Алгоритм CLOPE имеет множество приложений в базах данных, в частности для MySQL: https://github.com/infozor/php_mysql_clustering_clope&lt;br /&gt;
&lt;br /&gt;
Также есть реализация на языке Go: https://github.com/realb0t/go-clope&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12210</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12210"/>
		<updated>2016-10-15T21:50:54Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Информационный граф алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - высота кластера.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
[[Файл:CLOPEGraph.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей является квадратичным при том, что вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Алгоритм CLOPE имеет множество приложений в базах данных, в частности для MySQL: https://github.com/infozor/php_mysql_clustering_clope&lt;br /&gt;
&lt;br /&gt;
Также есть реализация на языке Go: https://github.com/realb0t/go-clope&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12145</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12145"/>
		<updated>2016-10-15T21:22:35Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Вычислительное ядро алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - высота кластера.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей является квадратичным при том, что вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Алгоритм CLOPE имеет множество приложений в базах данных, в частности для MySQL: https://github.com/infozor/php_mysql_clustering_clope&lt;br /&gt;
&lt;br /&gt;
Также есть реализация на языке Go: https://github.com/realb0t/go-clope&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12139</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12139"/>
		<updated>2016-10-15T21:21:13Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Существующие реализации алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - высота кластера.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оптимизация функции может проводиться любым известным методом, например, градиентными методами.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей является квадратичным при том, что вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;br /&gt;
Алгоритм CLOPE имеет множество приложений в базах данных, в частности для MySQL: https://github.com/infozor/php_mysql_clustering_clope&lt;br /&gt;
&lt;br /&gt;
Также есть реализация на языке Go: https://github.com/realb0t/go-clope&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12103</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12103"/>
		<updated>2016-10-15T21:07:33Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Свойства алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - высота кластера.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оптимизация функции может проводиться любым известным методом, например, градиентными методами.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей является квадратичным при том, что вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных является линейной.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12055</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=12055"/>
		<updated>2016-10-15T20:58:16Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Математическое описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - высота кластера.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оптимизация функции может проводиться любым известным методом, например, градиентными методами.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=11998</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=11998"/>
		<updated>2016-10-15T20:52:43Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Входные и выходные данные алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - уровень сходства.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оптимизация функции может проводиться любым известным методом, например, градиентными методами.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные - таблица транзакций &amp;lt;math&amp;gt;D = \{t_1, ..., t_n\}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные - множество кластеров &amp;lt;math&amp;gt;\{C_1, ... , C_k\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=11947</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=11947"/>
		<updated>2016-10-15T20:47:16Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Ресурс параллелизма алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - уровень сходства.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оптимизация функции может проводиться любым известным методом, например, градиентными методами.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Алгоритм CLOPE является масштабируемым, поскольку можно читать данные из таблицы и распределять их по кластерам с подсчетом функции стоимости параллельно.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=11851</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=11851"/>
		<updated>2016-10-15T20:37:44Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных. Количество кластеров подбирается автоматически, что регулируется единственным параметром - коэффициентом отталкивания. &lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;. Каждая из транзакций суть набор объектов &amp;lt;math&amp;gt;\{i_1, ..., i_n\}&amp;lt;/math&amp;gt;. Множество кластеров &amp;lt;math&amp;gt;\{C_1, ..., C_m\}&amp;lt;/math&amp;gt; есть разбиение множества транзакций таким образом, что &amp;lt;math&amp;gt;C_1 \oplus ... \oplus C_m = D&amp;lt;/math&amp;gt;. У каждого кластера есть следующие характеристики:&lt;br /&gt;
&lt;br /&gt;
1. Множество уникальных объектов &amp;lt;math&amp;gt;D(C)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. &amp;lt;math&amp;gt;Occ(i, C)&amp;lt;/math&amp;gt; - количество вхождений объекта &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; в кластер &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;lt;math&amp;gt;S(C) = \sum_{i \in D(C)}{Occ(i,c)} = \sum_{i=1}^{m}{|t_i|}&amp;lt;/math&amp;gt; - площадь кластера&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. &amp;lt;math&amp;gt;W(C) = |D(C)|&amp;lt;/math&amp;gt; - ширина кластера,&lt;br /&gt;
&lt;br /&gt;
5. &amp;lt;math&amp;gt;H(C) = S(C) / W(C)&amp;lt;/math&amp;gt; - уровень сходства.&lt;br /&gt;
&lt;br /&gt;
Функция стоимости:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Profit(C, r) = \frac{\sum_{i=1}^{k}{\frac{S(C_i)}{W^r (C_i)}|C_i|}}{\sum_{i=1}^{k}{|C_i|}}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;r, 0 &amp;lt; r \leq 1&amp;lt;/math&amp;gt; - коэффициент отталкивания.&lt;br /&gt;
&lt;br /&gt;
С помощью параметра &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; регулируется уровень сходства&lt;br /&gt;
транзакций внутри кластера, и, как следствие, финальное количество кластеров. &lt;br /&gt;
Этот коэффициент подбирается пользователем. &lt;br /&gt;
Чем больше &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, тем ниже уровень сходства и тем больше кластеров будет сгенерировано.&lt;br /&gt;
&lt;br /&gt;
Формальная постановка задачи кластеризации выглядит следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является оптимизация функции стоимости.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt; Profit(C, r) \to max &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оптимизация функции может проводиться любым известным методом, например, градиентными методами.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Как указано выше, основную часть метода составляет вычисление максимума функции стоимости.&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма требует первого прохода по таблице транзакций для построения начального разбиения, определяемого функцией &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;. После этого требуется некоторое количество дополнительных сканирований таблицы для повышения качества кластеризации и оптимизации функции стоимости. Если в текущем проходе по таблице изменений не произошло, то алгоритм прекращает свою работу&lt;br /&gt;
&lt;br /&gt;
1.    Пока не конец&lt;br /&gt;
&lt;br /&gt;
1.1    прочитать из таблицы следующую транзакцию [t, -];&lt;br /&gt;
&lt;br /&gt;
1.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_i&amp;lt;/math&amp;gt;, который дает максимум &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
1.3    записать [t,i] в таблицу (номер кластера);&lt;br /&gt;
&lt;br /&gt;
2.    Повторять&lt;br /&gt;
&lt;br /&gt;
2.1    перейти в начало таблицы;&lt;br /&gt;
&lt;br /&gt;
2.2    moved = false;&lt;br /&gt;
&lt;br /&gt;
2.3    пока не конец таблицы&lt;br /&gt;
&lt;br /&gt;
2.3.1    читать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.2    положить t в существующий либо в новый кластер &amp;lt;math&amp;gt;C_j&amp;lt;/math&amp;gt;, который максимизирует &amp;lt;math&amp;gt;Profit(C,r)&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
2.3.3    если &amp;lt;math&amp;gt;C_i \neq C_j&amp;lt;/math&amp;gt; тогда&lt;br /&gt;
&lt;br /&gt;
2.3.3.1    записать [t,i];&lt;br /&gt;
&lt;br /&gt;
2.3.4    moved = true;&lt;br /&gt;
&lt;br /&gt;
2.4    пока (not moved).&lt;br /&gt;
&lt;br /&gt;
3.    удалить все пустые кластеры;&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Пусть средняя длина транзакции равна &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt;, общее число транзакций &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, максимально возможное число кластеров &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Временная сложность одной итерации равна &amp;lt;math&amp;gt;O(N*K*A)&amp;lt;/math&amp;gt;, показывающая, что скорость работы алгоритма растет линейно с ростом кластеров и размера таблицы. Это делает алгоритм быстрым и эффективным на больших объемах.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности реализации последовательного алгоритма ===&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности параллельной реализации алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
=== Существующие реализации алгоритма ===&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=10054</id>
		<title>Участник:Nkrivenko/Алгоритм кластеризации категориальных данных</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=10054"/>
		<updated>2016-10-15T14:53:22Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: Новая страница: «== Свойства и структура алгоритма == === Общее описание алгоритма === Данный алгоритм предна…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Данный алгоритм предназначен для кластеризации очень больших объемов данных. К особенностям алгоритма относятся использование глобального критерия оптимизации на основе максимизации коэффициента высоты гистограммы кластера и минимальное число сканирований наборов данных&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Пусть имеется база транзакций &amp;lt;math&amp;gt;D&amp;lt;/math&amp;gt;, которая состоит из множества транзакций &amp;lt;math&amp;gt;\{t_1, ..., t_n\}&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3485</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3485"/>
		<updated>2016-05-16T11:20:09Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Локальность данных и вычислений */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива sigma, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления значений справедливой стоимости опциона в листьях необходимо выполнить последовательно следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление экспоненты&lt;br /&gt;
&lt;br /&gt;
2. Умножение экспоненты на стоимость базового актива в момент времени &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы алгоритм имеет сложность &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. При классификации по высоте ЯПФ - &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные алгоритма, как было указано ранее, количество этапов &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, волатильность базового актива &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, шаг по времени &amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. На выходе получается справедливая стоимость опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Отношение последовательной и параллельной сложностей алгоритма в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;float.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
double price(int N, double K, double S, double vol, double dT, double r) {&lt;br /&gt;
   double *steps = malloc(sizeof(double) * (N + 1));&lt;br /&gt;
   for(int i = 0; i &amp;lt;= N; i++) { &lt;br /&gt;
       double price = S * expf(vol * dT * (2. * i - N)); &lt;br /&gt;
       steps[i] = fmaxf(price - K, .0); &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   double pu = (expf(r * dT) - expf(-vol * sqrt(dT))) / (expf(vol * sqrt(dT)) - expf(-vol * sqrt(dT))), pd = 1 - pu;&lt;br /&gt;
&lt;br /&gt;
   for(int i = N; i &amp;gt; 0; i--)&lt;br /&gt;
       for(int j = 0; j &amp;lt;= i - 1; j++) &lt;br /&gt;
           steps[j] = pu * steps[j + 1] + pd * steps[j]; &lt;br /&gt;
&lt;br /&gt;
   double C = steps[0];&lt;br /&gt;
&lt;br /&gt;
   free(steps);&lt;br /&gt;
   steps = 0x0;&lt;br /&gt;
&lt;br /&gt;
   return C;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
Алгоритм обладает хорошей локальностью данных, так как при вычислении справедливой цены опциона используются соседние элементы массива.&lt;br /&gt;
&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При большом количестве периодов, возможна реализация на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Существует множество реализаций этой модели. [http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/Computational_Finance.html#binomialOptions Одно из них] представлено в качестве примера для NVIDIA CUDA SDK. Оно используется здесь для исследований.&lt;br /&gt;
&lt;br /&gt;
Реализацию алгоритма можно найти здесь: [https://github.com/warm35/binomial/tree/master/NVIDIA_CUDA_SDK]&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3484</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3484"/>
		<updated>2016-05-16T11:17:19Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Схема реализации последовательного алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива sigma, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления значений справедливой стоимости опциона в листьях необходимо выполнить последовательно следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление экспоненты&lt;br /&gt;
&lt;br /&gt;
2. Умножение экспоненты на стоимость базового актива в момент времени &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы алгоритм имеет сложность &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. При классификации по высоте ЯПФ - &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные алгоритма, как было указано ранее, количество этапов &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, волатильность базового актива &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, шаг по времени &amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. На выходе получается справедливая стоимость опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Отношение последовательной и параллельной сложностей алгоритма в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;float.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
double price(int N, double K, double S, double vol, double dT, double r) {&lt;br /&gt;
   double *steps = malloc(sizeof(double) * (N + 1));&lt;br /&gt;
   for(int i = 0; i &amp;lt;= N; i++) { &lt;br /&gt;
       double price = S * expf(vol * dT * (2. * i - N)); &lt;br /&gt;
       steps[i] = fmaxf(price - K, .0); &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   double pu = (expf(r * dT) - expf(-vol * sqrt(dT))) / (expf(vol * sqrt(dT)) - expf(-vol * sqrt(dT))), pd = 1 - pu;&lt;br /&gt;
&lt;br /&gt;
   for(int i = N; i &amp;gt; 0; i--)&lt;br /&gt;
       for(int j = 0; j &amp;lt;= i - 1; j++) &lt;br /&gt;
           steps[j] = pu * steps[j + 1] + pd * steps[j]; &lt;br /&gt;
&lt;br /&gt;
   double C = steps[0];&lt;br /&gt;
&lt;br /&gt;
   free(steps);&lt;br /&gt;
   steps = 0x0;&lt;br /&gt;
&lt;br /&gt;
   return C;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При большом количестве периодов, возможна реализация на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Существует множество реализаций этой модели. [http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/Computational_Finance.html#binomialOptions Одно из них] представлено в качестве примера для NVIDIA CUDA SDK. Оно используется здесь для исследований.&lt;br /&gt;
&lt;br /&gt;
Реализацию алгоритма можно найти здесь: [https://github.com/warm35/binomial/tree/master/NVIDIA_CUDA_SDK]&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3483</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3483"/>
		<updated>2016-05-16T11:15:19Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Существующие реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива v, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления значений справедливой стоимости опциона в листьях необходимо выполнить последовательно следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление экспоненты&lt;br /&gt;
&lt;br /&gt;
2. Умножение экспоненты на стоимость базового актива в момент времени &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы алгоритм имеет сложность &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. При классификации по высоте ЯПФ - &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные алгоритма, как было указано ранее, количество этапов &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, волатильность базового актива &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, шаг по времени &amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. На выходе получается справедливая стоимость опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Отношение последовательной и параллельной сложностей алгоритма в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;float.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
double price(int N, double K, double S, double vol, double dT, double r) {&lt;br /&gt;
   double *steps = malloc(sizeof(double) * (N + 1));&lt;br /&gt;
   for(int i = 0; i &amp;lt;= N; i++) { &lt;br /&gt;
       double price = S * expf(vol * dT * (2. * i - N)); &lt;br /&gt;
       steps[i] = fmaxf(price - K, .0); &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   double pu = (expf(r * dT) - expf(-vol * sqrt(dT))) / (expf(vol * sqrt(dT)) - expf(-vol * sqrt(dT))), pd = 1 - pu;&lt;br /&gt;
&lt;br /&gt;
   for(int i = N; i &amp;gt; 0; i--)&lt;br /&gt;
       for(int j = 0; j &amp;lt;= i - 1; j++) &lt;br /&gt;
           steps[j] = pu * steps[j + 1] + pd * steps[j]; &lt;br /&gt;
&lt;br /&gt;
   double C = steps[0];&lt;br /&gt;
&lt;br /&gt;
   free(steps);&lt;br /&gt;
   steps = 0x0;&lt;br /&gt;
&lt;br /&gt;
   return C;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При большом количестве периодов, возможна реализация на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Существует множество реализаций этой модели. [http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/Computational_Finance.html#binomialOptions Одно из них] представлено в качестве примера для NVIDIA CUDA SDK. Оно используется здесь для исследований.&lt;br /&gt;
&lt;br /&gt;
Реализацию алгоритма можно найти здесь: [https://github.com/warm35/binomial/tree/master/NVIDIA_CUDA_SDK]&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3482</id>
		<title>Применение методов Монте-Карло для оценки опционов европейского типа</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3482"/>
		<updated>2016-05-16T11:01:38Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Существующие реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Методы Монте-Карло можно определить как численные методы решения задач при помощи моделирования случайных величин. Эти методы находят широкое применение в различных областях, в частности, в финансовой математике, например, их можно применить для определения цены опциона европейского типа.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эволюционирующий в непрерывном времени финансовый рынок, состоящий из двух типов активов: акции (рисковые активы, S) и облигации (безрисковые активы, B). Для моделирования рынка будем использовать модель Блэка–Шоулса. Данная модель после ряда преобразований представляет собой систему стохастических дифференциальных уравнений следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dB_t = rB_tdt, B_0 &amp;gt; 0, (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dS_t = S_t((r-\delta)dt - \sigma dW_t), S_0 &amp;gt; 0. (2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь первое уравнение представляет собой обыкновенное дифференциальное уравнение, описывающее поведение цены облигации &amp;lt;math&amp;gt;B_t&amp;lt;/math&amp;gt;, на изменение которой влияет процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. Уравнение (2) является стохастическим дифференциальным уравнением, описывающим эволюцию цены акции &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt;. В этом уравнении: &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; - волатильность акции, &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; - ставка дивиденда, &amp;lt;math&amp;gt;W_t&amp;lt;/math&amp;gt; - винеровский случайный процесс.&lt;br /&gt;
&lt;br /&gt;
Сделаем несколько предположений касательно рынка:&lt;br /&gt;
&lt;br /&gt;
	1. пусть модель будет без дивидендов: &amp;lt;math&amp;gt;\delta = 0&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	2. процентные ставки постоянны;&lt;br /&gt;
&lt;br /&gt;
	3. если время измеряется в годах, то все рассмотренные процентные ставки участвуют в уравнениях как числа от 0 до 1 и выражают проценты годовых, измеренные в долях.&lt;br /&gt;
&lt;br /&gt;
При этих предположениях рассмотренная система имеет аналитическое решение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_t = S_0 e^{(r - \sigma^2/2)t + \sigma W_t}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Опцион, как производный финансовый инструмент, представляет собой контракт между сторонами &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;, который дает право стороне &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; в некоторый момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; в будущем купить у стороны &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; или продать стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; акции по зафиксированной в контракте цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. За это право сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; выплачивает фиксированную сумму (премию) &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt;. При этом K называется ценой исполнения опциона (страйк, strike price), а &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; – ценой опциона.&lt;br /&gt;
&lt;br /&gt;
Основная идея заключения контракта состоит в игре двух лиц – &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;. Вторая сторона выплачивает некоторую сумму &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; и в некоторый момент времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (срок выплаты, зафиксированный в контракте) принимает решение: покупать акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; у первой стороны или нет. Решение принимается в зависимости от соотношения цены &amp;lt;math&amp;gt;S_T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;S_T &amp;lt; K&amp;lt;/math&amp;gt;, покупать акции не выгодно, сторона &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; получила прибыль &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; – убыток &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;. В случае, если &amp;lt;math&amp;gt;S_T &amp;gt; K&amp;lt;/math&amp;gt;, сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; покупает у первой акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, в ряде случаев получая прибыль.&lt;br /&gt;
&lt;br /&gt;
Справедливая цена опциона – цена, при которой наблюдается баланс выигрыша/проигрыша каждой из сторон. Определяется она как средний выигрыш стороны &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mathop{\mathbb{E}}(e^{-rT} max\{S_T - K, 0\})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Точное решение этой системы уравнений известно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = S_0N(d_1) - Ke^{-rT}N(d_2),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_1 = ln{\frac{S_0}{K}} + \frac{(r + \sigma^2 / 2)T}{\sigma\sqrt{T}},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_2 = d_1 - \sigma\sqrt{T}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность точного решения заключается в том, что оно может оказаться недействительным в ряде случаев, например, при переменных процентных ставках. В этом случае система уравнений &amp;lt;math&amp;gt;(1),(2)&amp;lt;/math&amp;gt; обычно интегрируется численно.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Решаемая задача имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = e^{-rT}\int^{+\infty}_{-\infty}{f(z)\varphi(z)dz}, (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, (4)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вычисления этого интеграла будем использовать метод Монте-Карло. Если мы рассмотрим случайную величину &amp;lt;math&amp;gt;X = f(z)&amp;lt;/math&amp;gt;, то математическое ожидание этой случайной величины будет совпадать с формулой (3) с точностью до коэффициента дисконтирования. Формула для вычисления искомого интеграла имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{C} = \frac{e^{-rT}}{N} \sum^{N}_{i=1}{f(z_i)},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z_i) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, z_i \sim N_{0,1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет вычисление следующей суммы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{N}_{i=1}{f(z_i)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку время, требуемое на операцию сложения в реальных примерах мало по сравнению с временем, затрачиваемом на вычисление функции &amp;lt;math&amp;gt;f(z_i)&amp;lt;/math&amp;gt;, для производительности вычислений становится маловажным, каким конкретным образом осуществлять сложение и умножение.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм представляет собой сумму значений функции от случайной величины.&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
Формулы для реализации алгоритма приведены выше &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;. С помощью генератора случайных чисел в цикле получаются точки, и в них вычисляется соответствующая функция. Результаты складываются, полученная сумма умножается на коэффициент. При последовательной реализации для экономии памяти можно сразу не генерировать массив всех точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Время, затраченное на вычисление интеграла растет как &amp;lt;math&amp;gt;Nt&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; – количество случайных точек, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – время, необходимое для вычисления функции.&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма представлен на рисунке 1,&lt;br /&gt;
&lt;br /&gt;
[[Файл: MCG.png]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 1 – Информационный граф алгоритма&lt;br /&gt;
&lt;br /&gt;
где вершина &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; – вычисление функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;rnd&amp;lt;/math&amp;gt; – генерация случайного числа. Анализ этого графа производится в последующих разделах описания алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления интеграла &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; методом Монте-Карло требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
	1) вычисление случайного числа &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
	2) вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; на основании полученного случайного числа,&lt;br /&gt;
&lt;br /&gt;
	3) сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае, все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на разных узлах, следовательно, алгоритм идеально поддается распараллеливанию.&lt;br /&gt;
При классификации по высоте ярусно-параллельной формы этот алгоритм имеет сложность 3. При классификации по ширине – &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные для вычисления алгоритма: число точек &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, волатильность акции &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, время жизни опциона &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, стоимость акции в начальный момент времени &amp;lt;math&amp;gt;S_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные: справедливая цена опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов. Таким образом, ускорение должно быть близко к линейному.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    double price(int N, double sigma, double T, double K, double S0, double r) {&lt;br /&gt;
	coeff = exp(-r*T) / N, result = .0, sigma_coeff = (r - sigma * sigma / 2) * T, sigma_T_coeff = sigma * sqrt(T);&lt;br /&gt;
	for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
	    result += max(0, S0 * exp(sigma_coeff + sigma_T_coeff * normalrand(i)) - K);&lt;br /&gt;
	}&lt;br /&gt;
	return coeff * result;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представленный алгоритм не является полностью детерминированным, так как он основан на использовании последовательностей случайных чисел.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
Данные в представленном алгоритме обладают хорошей локальностью, так как на каждом шаге алгоритма приходится использовать значения переменных &amp;lt;i&amp;gt;sigma_coeff&amp;lt;/i&amp;gt; и &amp;lt;i&amp;gt;sigma_T_coeff&amp;lt;/i&amp;gt;, что повышает вероятность попадания этих значений в кэш.&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
Один из возможных вариантов реализации алгоритма – независимое вычисление значений функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt; на различных вычислительных узлах, например, с помощью технологии MPI. «Подводным камнем» такой реализации может стать генерация случайных чисел, которая должна быть независимой на каждом вычислительном узле. Желательно использовать генератор случайных чисел с достаточно большим периодом.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть хорошо масштабируем.&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При достаточно большом числе точек N возможна реализация алгоритма на GPU для достижения большей скорости выполнения, чем на обычных процессорах.&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Есть открытая реализация методов Монте-Карло, являющаяся частью GSL (GNU Scientific Library). Данная библиотека включает в себя как классический алгоритм, так и два адаптивных: «Vegas» и «Miser».&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна тут: [https://github.com/warm35/montecarlosingle/tree/master/NVIDIA_CUDA_SDK], в многокарточном варианте - тут: [https://github.com/warm35/montecarlomultigpu/tree/master/NVIDIA_CUDA_SDK]&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3481</id>
		<title>Применение методов Монте-Карло для оценки опционов европейского типа</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3481"/>
		<updated>2016-05-16T10:05:11Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Существующие реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Методы Монте-Карло можно определить как численные методы решения задач при помощи моделирования случайных величин. Эти методы находят широкое применение в различных областях, в частности, в финансовой математике, например, их можно применить для определения цены опциона европейского типа.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эволюционирующий в непрерывном времени финансовый рынок, состоящий из двух типов активов: акции (рисковые активы, S) и облигации (безрисковые активы, B). Для моделирования рынка будем использовать модель Блэка–Шоулса. Данная модель после ряда преобразований представляет собой систему стохастических дифференциальных уравнений следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dB_t = rB_tdt, B_0 &amp;gt; 0, (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dS_t = S_t((r-\delta)dt - \sigma dW_t), S_0 &amp;gt; 0. (2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь первое уравнение представляет собой обыкновенное дифференциальное уравнение, описывающее поведение цены облигации &amp;lt;math&amp;gt;B_t&amp;lt;/math&amp;gt;, на изменение которой влияет процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. Уравнение (2) является стохастическим дифференциальным уравнением, описывающим эволюцию цены акции &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt;. В этом уравнении: &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; - волатильность акции, &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; - ставка дивиденда, &amp;lt;math&amp;gt;W_t&amp;lt;/math&amp;gt; - винеровский случайный процесс.&lt;br /&gt;
&lt;br /&gt;
Сделаем несколько предположений касательно рынка:&lt;br /&gt;
&lt;br /&gt;
	1. пусть модель будет без дивидендов: &amp;lt;math&amp;gt;\delta = 0&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	2. процентные ставки постоянны;&lt;br /&gt;
&lt;br /&gt;
	3. если время измеряется в годах, то все рассмотренные процентные ставки участвуют в уравнениях как числа от 0 до 1 и выражают проценты годовых, измеренные в долях.&lt;br /&gt;
&lt;br /&gt;
При этих предположениях рассмотренная система имеет аналитическое решение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_t = S_0 e^{(r - \sigma^2/2)t + \sigma W_t}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Опцион, как производный финансовый инструмент, представляет собой контракт между сторонами &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;, который дает право стороне &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; в некоторый момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; в будущем купить у стороны &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; или продать стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; акции по зафиксированной в контракте цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. За это право сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; выплачивает фиксированную сумму (премию) &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt;. При этом K называется ценой исполнения опциона (страйк, strike price), а &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; – ценой опциона.&lt;br /&gt;
&lt;br /&gt;
Основная идея заключения контракта состоит в игре двух лиц – &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;. Вторая сторона выплачивает некоторую сумму &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; и в некоторый момент времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (срок выплаты, зафиксированный в контракте) принимает решение: покупать акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; у первой стороны или нет. Решение принимается в зависимости от соотношения цены &amp;lt;math&amp;gt;S_T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;S_T &amp;lt; K&amp;lt;/math&amp;gt;, покупать акции не выгодно, сторона &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; получила прибыль &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; – убыток &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;. В случае, если &amp;lt;math&amp;gt;S_T &amp;gt; K&amp;lt;/math&amp;gt;, сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; покупает у первой акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, в ряде случаев получая прибыль.&lt;br /&gt;
&lt;br /&gt;
Справедливая цена опциона – цена, при которой наблюдается баланс выигрыша/проигрыша каждой из сторон. Определяется она как средний выигрыш стороны &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mathop{\mathbb{E}}(e^{-rT} max\{S_T - K, 0\})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Точное решение этой системы уравнений известно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = S_0N(d_1) - Ke^{-rT}N(d_2),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_1 = ln{\frac{S_0}{K}} + \frac{(r + \sigma^2 / 2)T}{\sigma\sqrt{T}},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_2 = d_1 - \sigma\sqrt{T}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность точного решения заключается в том, что оно может оказаться недействительным в ряде случаев, например, при переменных процентных ставках. В этом случае система уравнений &amp;lt;math&amp;gt;(1),(2)&amp;lt;/math&amp;gt; обычно интегрируется численно.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Решаемая задача имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = e^{-rT}\int^{+\infty}_{-\infty}{f(z)\varphi(z)dz}, (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, (4)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вычисления этого интеграла будем использовать метод Монте-Карло. Если мы рассмотрим случайную величину &amp;lt;math&amp;gt;X = f(z)&amp;lt;/math&amp;gt;, то математическое ожидание этой случайной величины будет совпадать с формулой (3) с точностью до коэффициента дисконтирования. Формула для вычисления искомого интеграла имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{C} = \frac{e^{-rT}}{N} \sum^{N}_{i=1}{f(z_i)},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z_i) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, z_i \sim N_{0,1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет вычисление следующей суммы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{N}_{i=1}{f(z_i)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку время, требуемое на операцию сложения в реальных примерах мало по сравнению с временем, затрачиваемом на вычисление функции &amp;lt;math&amp;gt;f(z_i)&amp;lt;/math&amp;gt;, для производительности вычислений становится маловажным, каким конкретным образом осуществлять сложение и умножение.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм представляет собой сумму значений функции от случайной величины.&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
Формулы для реализации алгоритма приведены выше &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;. С помощью генератора случайных чисел в цикле получаются точки, и в них вычисляется соответствующая функция. Результаты складываются, полученная сумма умножается на коэффициент. При последовательной реализации для экономии памяти можно сразу не генерировать массив всех точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Время, затраченное на вычисление интеграла растет как &amp;lt;math&amp;gt;Nt&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; – количество случайных точек, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – время, необходимое для вычисления функции.&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма представлен на рисунке 1,&lt;br /&gt;
&lt;br /&gt;
[[Файл: MCG.png]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 1 – Информационный граф алгоритма&lt;br /&gt;
&lt;br /&gt;
где вершина &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; – вычисление функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;rnd&amp;lt;/math&amp;gt; – генерация случайного числа. Анализ этого графа производится в последующих разделах описания алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления интеграла &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; методом Монте-Карло требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
	1) вычисление случайного числа &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
	2) вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; на основании полученного случайного числа,&lt;br /&gt;
&lt;br /&gt;
	3) сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае, все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на разных узлах, следовательно, алгоритм идеально поддается распараллеливанию.&lt;br /&gt;
При классификации по высоте ярусно-параллельной формы этот алгоритм имеет сложность 3. При классификации по ширине – &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные для вычисления алгоритма: число точек &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, волатильность акции &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, время жизни опциона &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, стоимость акции в начальный момент времени &amp;lt;math&amp;gt;S_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные: справедливая цена опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов. Таким образом, ускорение должно быть близко к линейному.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    double price(int N, double sigma, double T, double K, double S0, double r) {&lt;br /&gt;
	coeff = exp(-r*T) / N, result = .0, sigma_coeff = (r - sigma * sigma / 2) * T, sigma_T_coeff = sigma * sqrt(T);&lt;br /&gt;
	for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
	    result += max(0, S0 * exp(sigma_coeff + sigma_T_coeff * normalrand(i)) - K);&lt;br /&gt;
	}&lt;br /&gt;
	return coeff * result;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представленный алгоритм не является полностью детерминированным, так как он основан на использовании последовательностей случайных чисел.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
Данные в представленном алгоритме обладают хорошей локальностью, так как на каждом шаге алгоритма приходится использовать значения переменных &amp;lt;i&amp;gt;sigma_coeff&amp;lt;/i&amp;gt; и &amp;lt;i&amp;gt;sigma_T_coeff&amp;lt;/i&amp;gt;, что повышает вероятность попадания этих значений в кэш.&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
Один из возможных вариантов реализации алгоритма – независимое вычисление значений функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt; на различных вычислительных узлах, например, с помощью технологии MPI. «Подводным камнем» такой реализации может стать генерация случайных чисел, которая должна быть независимой на каждом вычислительном узле. Желательно использовать генератор случайных чисел с достаточно большим периодом.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть хорошо масштабируем.&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При достаточно большом числе точек N возможна реализация алгоритма на GPU для достижения большей скорости выполнения, чем на обычных процессорах.&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Есть открытая реализация методов Монте-Карло, являющаяся частью GSL (GNU Scientific Library). Данная библиотека включает в себя как классический алгоритм, так и два адаптивных: «Vegas» и «Miser».&lt;br /&gt;
&lt;br /&gt;
Реализация алгоритма доступна по адресу: [https://github.com/warm35/montecarlosingle/tree/master/NVIDIA_CUDA_SDK]&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3479</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3479"/>
		<updated>2016-05-13T05:13:25Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Существующие реализации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива v, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления значений справедливой стоимости опциона в листьях необходимо выполнить последовательно следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление экспоненты&lt;br /&gt;
&lt;br /&gt;
2. Умножение экспоненты на стоимость базового актива в момент времени &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы алгоритм имеет сложность &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. При классификации по высоте ЯПФ - &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные алгоритма, как было указано ранее, количество этапов &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, волатильность базового актива &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, шаг по времени &amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. На выходе получается справедливая стоимость опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Отношение последовательной и параллельной сложностей алгоритма в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;float.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
double price(int N, double K, double S, double vol, double dT, double r) {&lt;br /&gt;
   double *steps = malloc(sizeof(double) * (N + 1));&lt;br /&gt;
   for(int i = 0; i &amp;lt;= N; i++) { &lt;br /&gt;
       double price = S * expf(vol * dT * (2. * i - N)); &lt;br /&gt;
       steps[i] = fmaxf(price - K, .0); &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   double pu = (expf(r * dT) - expf(-vol * sqrt(dT))) / (expf(vol * sqrt(dT)) - expf(-vol * sqrt(dT))), pd = 1 - pu;&lt;br /&gt;
&lt;br /&gt;
   for(int i = N; i &amp;gt; 0; i--)&lt;br /&gt;
       for(int j = 0; j &amp;lt;= i - 1; j++) &lt;br /&gt;
           steps[j] = pu * steps[j + 1] + pd * steps[j]; &lt;br /&gt;
&lt;br /&gt;
   double C = steps[0];&lt;br /&gt;
&lt;br /&gt;
   free(steps);&lt;br /&gt;
   steps = 0x0;&lt;br /&gt;
&lt;br /&gt;
   return C;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При большом количестве периодов, возможна реализация на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Существует множество реализаций этой модели. [http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/Computational_Finance.html#binomialOptions Одно из них] представлено в качестве примера для NVIDIA CUDA SDK. Оно используется здесь для исследований.&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3478</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3478"/>
		<updated>2016-05-13T04:44:49Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Выводы для классов архитектур */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива v, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления значений справедливой стоимости опциона в листьях необходимо выполнить последовательно следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление экспоненты&lt;br /&gt;
&lt;br /&gt;
2. Умножение экспоненты на стоимость базового актива в момент времени &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы алгоритм имеет сложность &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. При классификации по высоте ЯПФ - &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные алгоритма, как было указано ранее, количество этапов &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, волатильность базового актива &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, шаг по времени &amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. На выходе получается справедливая стоимость опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Отношение последовательной и параллельной сложностей алгоритма в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;float.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
double price(int N, double K, double S, double vol, double dT, double r) {&lt;br /&gt;
   double *steps = malloc(sizeof(double) * (N + 1));&lt;br /&gt;
   for(int i = 0; i &amp;lt;= N; i++) { &lt;br /&gt;
       double price = S * expf(vol * dT * (2. * i - N)); &lt;br /&gt;
       steps[i] = fmaxf(price - K, .0); &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   double pu = (expf(r * dT) - expf(-vol * sqrt(dT))) / (expf(vol * sqrt(dT)) - expf(-vol * sqrt(dT))), pd = 1 - pu;&lt;br /&gt;
&lt;br /&gt;
   for(int i = N; i &amp;gt; 0; i--)&lt;br /&gt;
       for(int j = 0; j &amp;lt;= i - 1; j++) &lt;br /&gt;
           steps[j] = pu * steps[j + 1] + pd * steps[j]; &lt;br /&gt;
&lt;br /&gt;
   double C = steps[0];&lt;br /&gt;
&lt;br /&gt;
   free(steps);&lt;br /&gt;
   steps = 0x0;&lt;br /&gt;
&lt;br /&gt;
   return C;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При большом количестве периодов, возможна реализация на GPU.&lt;br /&gt;
&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Существует&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3477</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3477"/>
		<updated>2016-05-12T13:57:50Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива v, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления значений справедливой стоимости опциона в листьях необходимо выполнить последовательно следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление экспоненты&lt;br /&gt;
&lt;br /&gt;
2. Умножение экспоненты на стоимость базового актива в момент времени &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы алгоритм имеет сложность &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. При классификации по высоте ЯПФ - &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные алгоритма, как было указано ранее, количество этапов &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, волатильность базового актива &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, шаг по времени &amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. На выходе получается справедливая стоимость опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Отношение последовательной и параллельной сложностей алгоритма в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;float.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
double price(int N, double K, double S, double vol, double dT, double r) {&lt;br /&gt;
   double *steps = malloc(sizeof(double) * (N + 1));&lt;br /&gt;
   for(int i = 0; i &amp;lt;= N; i++) { &lt;br /&gt;
       double price = S * expf(vol * dT * (2. * i - N)); &lt;br /&gt;
       steps[i] = fmaxf(price - K, .0); &lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   double pu = (expf(r * dT) - expf(-vol * sqrt(dT))) / (expf(vol * sqrt(dT)) - expf(-vol * sqrt(dT))), pd = 1 - pu;&lt;br /&gt;
&lt;br /&gt;
   for(int i = N; i &amp;gt; 0; i--)&lt;br /&gt;
       for(int j = 0; j &amp;lt;= i - 1; j++) &lt;br /&gt;
           steps[j] = pu * steps[j + 1] + pd * steps[j]; &lt;br /&gt;
&lt;br /&gt;
   double C = steps[0];&lt;br /&gt;
&lt;br /&gt;
   free(steps);&lt;br /&gt;
   steps = 0x0;&lt;br /&gt;
&lt;br /&gt;
   return C;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При большом количестве периодов, &lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Существует&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3476</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3476"/>
		<updated>2016-05-12T13:34:34Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива v, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления значений справедливой стоимости опциона в листьях необходимо выполнить последовательно следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
1. Вычисление экспоненты&lt;br /&gt;
&lt;br /&gt;
2. Умножение экспоненты на стоимость базового актива в момент времени &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При классификации по ширине ярусно-параллельной формы алгоритм имеет сложность &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;. При классификации по высоте ЯПФ - &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные алгоритма, как было указано ранее, количество этапов &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, волатильность базового актива &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, шаг по времени &amp;lt;math&amp;gt;\Delta T&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. На выходе получается справедливая стоимость опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Отношение последовательной и параллельной сложностей алгоритма в случае неограниченных ресурсов является линейным.&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3475</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3475"/>
		<updated>2016-05-12T13:08:41Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Схема реализации последовательного алгоритма ===&lt;br /&gt;
На вход: количество этапов N, страйк K, цена базового актива на &amp;lt;math&amp;gt;t_0&amp;lt;/math&amp;gt; S, волатильность базового актива v, шаг по времени dT, процентная ставка r.&lt;br /&gt;
&lt;br /&gt;
1. Для i = 0, N - 1:&lt;br /&gt;
&lt;br /&gt;
1.1 price = S * exp(v * dT  * (2 - i * N))&lt;br /&gt;
&lt;br /&gt;
1.2 steps[i] = max(price - K, 0)&lt;br /&gt;
&lt;br /&gt;
2. pu = (exp(r * dT) - exp(-sigma * sqrt(dT))) / (exp(sigma * sqrt(dT)) - exp(-sigma * sqrt(dT)))&lt;br /&gt;
&lt;br /&gt;
3. pd = 1 - pu&lt;br /&gt;
&lt;br /&gt;
4. Для i = N, 1&lt;br /&gt;
&lt;br /&gt;
4.1 Для j = 0, i - 1&lt;br /&gt;
&lt;br /&gt;
4.1.1 steps[j] = pu * steps[j + 1] + pd * steps[j]&lt;br /&gt;
&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Алгоритм требует &amp;lt;math&amp;gt;4N + 4 + N^2 - N = N^2 + 3N + 4&amp;lt;/math&amp;gt; операций умножения, &amp;lt;math&amp;gt;N^2 + 2N + 3&amp;lt;/math&amp;gt; операций вычитания, &amp;lt;math&amp;gt;N + 4&amp;lt;/math&amp;gt; вычислений экспоненты, &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; вычислений максимума и 3 операции вычисления квадратного корня. В итоге, последовательная сложность алгоритма равна &amp;lt;math&amp;gt;2N^2 + 7N + 14&amp;lt;/math&amp;gt; элементарных операций.&lt;br /&gt;
&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма изображен на рисунке 1&lt;br /&gt;
&lt;br /&gt;
[[Файл:BOPM.png]]&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3474</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3474"/>
		<updated>2016-05-09T15:43:22Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Свойства и структура алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. После расчета всех возможных цен опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT} (1)&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Для реализации алгоритма потребуются две формулы:&lt;br /&gt;
&lt;br /&gt;
1) &amp;lt;math&amp;gt;V_{T_i} = max\{Se^{V_sdT * 2i - N} - K, 0\}&amp;lt;/math&amp;gt; - для расчета стоимости опциона в i-м листе дерева&lt;br /&gt;
&lt;br /&gt;
2) &amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt; - для расчета справедливой стоимости опциона&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительным ядром алгоритма является вычисление справедливой стоимости опциона. Для этого действия потребуется &amp;lt;math&amp;gt;\frac{N(N-1)}{2}&amp;lt;/math&amp;gt; операций, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; - число шагов по времени.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм состоит из двух шагов:&lt;br /&gt;
&lt;br /&gt;
1. Генерация цен опциона в листьях.&lt;br /&gt;
&lt;br /&gt;
2. Вычисление справедливой стоимости опциона по формуле &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3473</id>
		<title>Применение методов Монте-Карло для оценки опционов европейского типа</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3473"/>
		<updated>2016-05-09T15:23:51Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: /* Общее описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Методы Монте-Карло можно определить как численные методы решения задач при помощи моделирования случайных величин. Эти методы находят широкое применение в различных областях, в частности, в финансовой математике, например, их можно применить для определения цены опциона европейского типа.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эволюционирующий в непрерывном времени финансовый рынок, состоящий из двух типов активов: акции (рисковые активы, S) и облигации (безрисковые активы, B). Для моделирования рынка будем использовать модель Блэка–Шоулса. Данная модель после ряда преобразований представляет собой систему стохастических дифференциальных уравнений следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dB_t = rB_tdt, B_0 &amp;gt; 0, (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dS_t = S_t((r-\delta)dt - \sigma dW_t), S_0 &amp;gt; 0. (2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь первое уравнение представляет собой обыкновенное дифференциальное уравнение, описывающее поведение цены облигации &amp;lt;math&amp;gt;B_t&amp;lt;/math&amp;gt;, на изменение которой влияет процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. Уравнение (2) является стохастическим дифференциальным уравнением, описывающим эволюцию цены акции &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt;. В этом уравнении: &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; - волатильность акции, &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; - ставка дивиденда, &amp;lt;math&amp;gt;W_t&amp;lt;/math&amp;gt; - винеровский случайный процесс.&lt;br /&gt;
&lt;br /&gt;
Сделаем несколько предположений касательно рынка:&lt;br /&gt;
&lt;br /&gt;
	1. пусть модель будет без дивидендов: &amp;lt;math&amp;gt;\delta = 0&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	2. процентные ставки постоянны;&lt;br /&gt;
&lt;br /&gt;
	3. если время измеряется в годах, то все рассмотренные процентные ставки участвуют в уравнениях как числа от 0 до 1 и выражают проценты годовых, измеренные в долях.&lt;br /&gt;
&lt;br /&gt;
При этих предположениях рассмотренная система имеет аналитическое решение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_t = S_0 e^{(r - \sigma^2/2)t + \sigma W_t}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Опцион, как производный финансовый инструмент, представляет собой контракт между сторонами &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;, который дает право стороне &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; в некоторый момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; в будущем купить у стороны &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; или продать стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; акции по зафиксированной в контракте цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. За это право сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; выплачивает фиксированную сумму (премию) &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt;. При этом K называется ценой исполнения опциона (страйк, strike price), а &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; – ценой опциона.&lt;br /&gt;
&lt;br /&gt;
Основная идея заключения контракта состоит в игре двух лиц – &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;. Вторая сторона выплачивает некоторую сумму &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; и в некоторый момент времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (срок выплаты, зафиксированный в контракте) принимает решение: покупать акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; у первой стороны или нет. Решение принимается в зависимости от соотношения цены &amp;lt;math&amp;gt;S_T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;S_T &amp;lt; K&amp;lt;/math&amp;gt;, покупать акции не выгодно, сторона &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; получила прибыль &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; – убыток &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;. В случае, если &amp;lt;math&amp;gt;S_T &amp;gt; K&amp;lt;/math&amp;gt;, сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; покупает у первой акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, в ряде случаев получая прибыль.&lt;br /&gt;
&lt;br /&gt;
Справедливая цена опциона – цена, при которой наблюдается баланс выигрыша/проигрыша каждой из сторон. Определяется она как средний выигрыш стороны &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mathop{\mathbb{E}}(e^{-rT} max\{S_T - K, 0\})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Точное решение этой системы уравнений известно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = S_0N(d_1) - Ke^{-rT}N(d_2),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_1 = ln{\frac{S_0}{K}} + \frac{(r + \sigma^2 / 2)T}{\sigma\sqrt{T}},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_2 = d_1 - \sigma\sqrt{T}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность точного решения заключается в том, что оно может оказаться недействительным в ряде случаев, например, при переменных процентных ставках. В этом случае система уравнений &amp;lt;math&amp;gt;(1),(2)&amp;lt;/math&amp;gt; обычно интегрируется численно.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Решаемая задача имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = e^{-rT}\int^{+\infty}_{-\infty}{f(z)\varphi(z)dz}, (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, (4)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вычисления этого интеграла будем использовать метод Монте-Карло. Если мы рассмотрим случайную величину &amp;lt;math&amp;gt;X = f(z)&amp;lt;/math&amp;gt;, то математическое ожидание этой случайной величины будет совпадать с формулой (3) с точностью до коэффициента дисконтирования. Формула для вычисления искомого интеграла имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{C} = \frac{e^{-rT}}{N} \sum^{N}_{i=1}{f(z_i)},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z_i) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, z_i \sim N_{0,1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет вычисление следующей суммы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{N}_{i=1}{f(z_i)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку время, требуемое на операцию сложения в реальных примерах мало по сравнению с временем, затрачиваемом на вычисление функции &amp;lt;math&amp;gt;f(z_i)&amp;lt;/math&amp;gt;, для производительности вычислений становится маловажным, каким конкретным образом осуществлять сложение и умножение.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм представляет собой сумму значений функции от случайной величины.&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
Формулы для реализации алгоритма приведены выше &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;. С помощью генератора случайных чисел в цикле получаются точки, и в них вычисляется соответствующая функция. Результаты складываются, полученная сумма умножается на коэффициент. При последовательной реализации для экономии памяти можно сразу не генерировать массив всех точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Время, затраченное на вычисление интеграла растет как &amp;lt;math&amp;gt;Nt&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; – количество случайных точек, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – время, необходимое для вычисления функции.&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма представлен на рисунке 1,&lt;br /&gt;
&lt;br /&gt;
[[Файл: MCG.png]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 1 – Информационный граф алгоритма&lt;br /&gt;
&lt;br /&gt;
где вершина &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; – вычисление функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;rnd&amp;lt;/math&amp;gt; – генерация случайного числа. Анализ этого графа производится в последующих разделах описания алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления интеграла &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; методом Монте-Карло требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
	1) вычисление случайного числа &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
	2) вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; на основании полученного случайного числа,&lt;br /&gt;
&lt;br /&gt;
	3) сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае, все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на разных узлах, следовательно, алгоритм идеально поддается распараллеливанию.&lt;br /&gt;
При классификации по высоте ярусно-параллельной формы этот алгоритм имеет сложность 3. При классификации по ширине – &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные для вычисления алгоритма: число точек &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, волатильность акции &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, время жизни опциона &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, стоимость акции в начальный момент времени &amp;lt;math&amp;gt;S_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные: справедливая цена опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов. Таким образом, ускорение должно быть близко к линейному.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    double price(int N, double sigma, double T, double K, double S0, double r) {&lt;br /&gt;
	coeff = exp(-r*T) / N, result = .0, sigma_coeff = (r - sigma * sigma / 2) * T, sigma_T_coeff = sigma * sqrt(T);&lt;br /&gt;
	for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
	    result += max(0, S0 * exp(sigma_coeff + sigma_T_coeff * normalrand(i)) - K);&lt;br /&gt;
	}&lt;br /&gt;
	return coeff * result;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представленный алгоритм не является полностью детерминированным, так как он основан на использовании последовательностей случайных чисел.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
Данные в представленном алгоритме обладают хорошей локальностью, так как на каждом шаге алгоритма приходится использовать значения переменных &amp;lt;i&amp;gt;sigma_coeff&amp;lt;/i&amp;gt; и &amp;lt;i&amp;gt;sigma_T_coeff&amp;lt;/i&amp;gt;, что повышает вероятность попадания этих значений в кэш.&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
Один из возможных вариантов реализации алгоритма – независимое вычисление значений функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt; на различных вычислительных узлах, например, с помощью технологии MPI. «Подводным камнем» такой реализации может стать генерация случайных чисел, которая должна быть независимой на каждом вычислительном узле. Желательно использовать генератор случайных чисел с достаточно большим периодом.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть хорошо масштабируем.&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При достаточно большом числе точек N возможна реализация алгоритма на GPU для достижения большей скорости выполнения, чем на обычных процессорах.&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Есть открытая реализация методов Монте-Карло, являющаяся частью GSL (GNU Scientific Library). Данная библиотека включает в себя как классический алгоритм, так и два адаптивных: «Vegas» и «Miser».&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3472</id>
		<title>Биномиальная модель оценки опционов</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%91%D0%B8%D0%BD%D0%BE%D0%BC%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=3472"/>
		<updated>2016-05-09T15:01:07Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: Новая страница: «== Свойства и структура алгоритма == === Общее описание алгоритма === Биномиальная модель оц…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Биномиальная модель оценки опциона – итерационный метод, моделирующий цену опциона на временном отрезке, когда опцион действителен. Для некоторых типов опционов, например, американского, это единственный способ оценки, так как точное решение, позволяющее предсказать цену на всем временном отрезке, неизвестно.&lt;br /&gt;
&lt;br /&gt;
Если быть точнее, биномиальная модель представляет эволюцию цены базового актива опциона как двоичное дерево всех возможных цен при равномерном разбиении временного отрезка с сегодняшнего дня, с предположением, что на каждом шаге цена может только расти либо падать на фиксированное число с соответствующими вероятностями &amp;lt;math&amp;gt;p_u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;p_d&amp;lt;/math&amp;gt;. Другими словами, корнем дерева является сегодняшняя цена базового актива, каждый уровень представляет собой все возможные цены в данный момент времени. У каждого узла со значением &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt; есть два дочерних со значениями &amp;lt;math&amp;gt;Su&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;Sd, u,d&amp;lt;/math&amp;gt; – множители движения цены вверх и вниз соответственно за один шаг по времени &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt;. &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; зависят от волатильности &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;u = e^{\sigma\sqrt{dT}}, d = e^{-\sigma\sqrt{dT}}, ud = 1.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;p_d = 1 - p_u, p_u&amp;lt;/math&amp;gt; ищется в предположении, что за &amp;lt;math&amp;gt;dT&amp;lt;/math&amp;gt; доходность базового актива в среднем такая же, как и при отсутствии риска, то есть если в момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; стоимость базового актива &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;, то в момент времени &amp;lt;math&amp;gt;t + dT&amp;lt;/math&amp;gt; она будет равна &amp;lt;math&amp;gt;Se^{rdT}&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; - процентная ставка. Получается следующее уравнение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;Se^{rdT} = (Su p_u + Sd p_d)&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
откуда &amp;lt;math&amp;gt;p_u = \frac{e^{rdT} - d}{u - d}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью такого представления, можно получить цену в любом узле дерева. Для опциона &amp;quot;колл&amp;quot; она равна &amp;lt;math&amp;gt;V_{call} = max\{S - K, 0\}&amp;lt;/math&amp;gt;, для &amp;quot;пут&amp;quot; &amp;lt;math&amp;gt;V_{put} = max\{K - S, 0\}&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; - страйк опциона. Сосчитав все возможные цены опциона, начинается движение от листьев к корню по формуле&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;V_t = (p_uV_{u, t+1} + p_dV_{d, t+1})e^{-rdT}&amp;lt;/math&amp;gt;, &lt;br /&gt;
&lt;br /&gt;
где &amp;lt;math&amp;gt;V_t&amp;lt;/math&amp;gt; - цена опциона в некотором узле, &amp;lt;math&amp;gt;V_{u, t+1}, V_{d, t+1}&amp;lt;/math&amp;gt; - цены опциона в дочерних узлах.&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3419</id>
		<title>Применение методов Монте-Карло для оценки опционов европейского типа</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3419"/>
		<updated>2016-04-03T17:16:56Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Общее описание алгоритма ===&lt;br /&gt;
Методы Монте-Карло можно определить как численные методы решения задач при помощи моделирования случайных величин. Эти методы находят широкое применение в различных областях, в частности, в финансовой математике, например, их можно применить для определения цены опциона европейского типа.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эволюционирующий в непрерывном времени финансовый рынок, состоящий из двух типов активов: акции (рисковые активы, S) и облигации (безрисковые активы, B). Для моделирования рынка будем использовать модель Блэка–Шоулса. Данная модель после ряда преобразований представляет собой систему стохастических дифференциальных уравнений следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dB_t = rB_tdt, B_0 &amp;gt; 0, (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dS_t = S_t((r-\delta)dt - \sigma dW_t), S_0 &amp;gt; 0. (2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь первое уравнение представляет собой обыкновенное дифференциальное уравнение, описывающее поведение цены облигации &amp;lt;math&amp;gt;B_t&amp;lt;/math&amp;gt;, на изменение которой влияет процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. Уравнение (2) является стохастическим дифференциальным уравнением, описывающим эволюцию цены акции &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt;. В этом уравнении: &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; - волатильность акции, &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; - ставка дивиденда, &amp;lt;math&amp;gt;W_t&amp;lt;/math&amp;gt; - винеровский случайный процесс.&lt;br /&gt;
&lt;br /&gt;
Сделаем несколько предположений касательно рынка:&lt;br /&gt;
&lt;br /&gt;
	1. пусть модель будет без дивидендов: &amp;lt;math&amp;gt;\delta = 0&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	2. процентные ставки постоянны;&lt;br /&gt;
&lt;br /&gt;
	3. если время измеряется в годах, то все рассмотренные процентные ставки участвуют в уравнениях как числа от 0 до 1 и выражают проценты годовых, измеренные в долях.&lt;br /&gt;
&lt;br /&gt;
При этих предположениях рассмотренная система имеет аналитическое решение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_t = S_0 e^{(r - \frac{\sigma^2}{2})t + \sigma W_t}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Опцион, как производный финансовый инструмент, представляет собой контракт между сторонами &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;, который дает право стороне &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; в некоторый момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; в будущем купить у стороны &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; или продать стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; акции по зафиксированной в контракте цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. За это право сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; выплачивает фиксированную сумму (премию) &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt;. При этом K называется ценой исполнения опциона (страйк, strike price), а &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; – ценой опциона.&lt;br /&gt;
&lt;br /&gt;
Основная идея заключения контракта состоит в игре двух лиц – &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;. Вторая сторона выплачивает некоторую сумму &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; и в некоторый момент времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (срок выплаты, зафиксированный в контракте) принимает решение: покупать акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; у первой стороны или нет. Решение принимается в зависимости от соотношения цены &amp;lt;math&amp;gt;S_T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;S_T &amp;lt; K&amp;lt;/math&amp;gt;, покупать акции не выгодно, сторона &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; получила прибыль &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; – убыток &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;. В случае, если &amp;lt;math&amp;gt;S_T &amp;gt; K&amp;lt;/math&amp;gt;, сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; покупает у первой акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, в ряде случаев получая прибыль.&lt;br /&gt;
&lt;br /&gt;
Справедливая цена опциона – цена, при которой наблюдается баланс выигрыша/проигрыша каждой из сторон. Определяется она как средний выигрыш стороны &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mathop{\mathbb{E}}(e^{-rT} max\{S_T - K, 0\})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Точное решение этой системы уравнений известно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = S_0N(d_1) - Ke^{-rT}N(d_2),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_1 = ln{\frac{S_0}{K}} + \frac{(r + \sigma^2 / 2)T}{\sigma\sqrt{T}},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_2 = d_1 - \sigma\sqrt{T}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность точного решения заключается в том, что оно может оказаться недействительным в ряде случаев, например, при переменных процентных ставках. В этом случае система уравнений &amp;lt;math&amp;gt;(1),(2)&amp;lt;/math&amp;gt; обычно интегрируется численно.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Решаемая задача имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = e^{-rT}\int^{+\infty}_{-\infty}{f(z)\varphi(z)dz}, (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, (4)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вычисления этого интеграла будем использовать метод Монте-Карло. Если мы рассмотрим случайную величину &amp;lt;math&amp;gt;X = f(z)&amp;lt;/math&amp;gt;, то математическое ожидание этой случайной величины будет совпадать с формулой (3) с точностью до коэффициента дисконтирования. Формула для вычисления искомого интеграла имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{C} = \frac{e^{-rT}}{N} \sum^{N}_{i=1}{f(z_i)},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z_i) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, z_i \sim N_{0,1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет вычисление следующей суммы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{N}_{i=1}{f(z_i)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку время, требуемое на операцию сложения в реальных примерах мало по сравнению с временем, затрачиваемом на вычисление функции &amp;lt;math&amp;gt;f(z_i)&amp;lt;/math&amp;gt;, для производительности вычислений становится маловажным, каким конкретным образом осуществлять сложение и умножение.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм представляет собой сумму значений функции от случайной величины.&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
Формулы для реализации алгоритма приведены выше &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;. С помощью генератора случайных чисел в цикле получаются точки, и в них вычисляется соответствующая функция. Результаты складываются, полученная сумма умножается на коэффициент. При последовательной реализации для экономии памяти можно сразу не генерировать массив всех точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Время, затраченное на вычисление интеграла растет как &amp;lt;math&amp;gt;Nt&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; – количество случайных точек, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – время, необходимое для вычисления функции.&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма представлен на рисунке 1,&lt;br /&gt;
&lt;br /&gt;
[[Файл: MCG.png]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 1 – Информационный граф алгоритма&lt;br /&gt;
&lt;br /&gt;
где вершина &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; – вычисление функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;rnd&amp;lt;/math&amp;gt; – генерация случайного числа. Анализ этого графа производится в последующих разделах описания алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления интеграла &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; методом Монте-Карло требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
	1) вычисление случайного числа &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
	2) вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; на основании полученного случайного числа,&lt;br /&gt;
&lt;br /&gt;
	3) сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае, все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на разных узлах, следовательно, алгоритм идеально поддается распараллеливанию.&lt;br /&gt;
При классификации по высоте ярусно-параллельной формы этот алгоритм имеет сложность 3. При классификации по ширине – &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные для вычисления алгоритма: число точек &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, волатильность акции &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, время жизни опциона &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, стоимость акции в начальный момент времени &amp;lt;math&amp;gt;S_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные: справедливая цена опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов. Таким образом, ускорение должно быть близко к линейному.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    double price(int N, double sigma, double T, double K, double S0, double r) {&lt;br /&gt;
	coeff = exp(-r*T) / N, result = .0, sigma_coeff = (r - sigma * sigma / 2) * T, sigma_T_coeff = sigma * sqrt(T);&lt;br /&gt;
	for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
	    result += max(0, S0 * exp(sigma_coeff + sigma_T_coeff * normalrand(i)) - K);&lt;br /&gt;
	}&lt;br /&gt;
	return coeff * result;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представленный алгоритм не является полностью детерминированным, так как он основан на использовании последовательностей случайных чисел.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
Данные в представленном алгоритме обладают хорошей локальностью, так как на каждом шаге алгоритма приходится использовать значения переменных &amp;lt;i&amp;gt;sigma_coeff&amp;lt;/i&amp;gt; и &amp;lt;i&amp;gt;sigma_T_coeff&amp;lt;/i&amp;gt;, что повышает вероятность попадания этих значений в кэш.&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
Один из возможных вариантов реализации алгоритма – независимое вычисление значений функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt; на различных вычислительных узлах, например, с помощью технологии MPI. «Подводным камнем» такой реализации может стать генерация случайных чисел, которая должна быть независимой на каждом вычислительном узле. Желательно использовать генератор случайных чисел с достаточно большим периодом.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть хорошо масштабируем.&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При достаточно большом числе точек N возможна реализация алгоритма на GPU для достижения большей скорости выполнения, чем на обычных процессорах.&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Есть открытая реализация методов Монте-Карло, являющаяся частью GSL (GNU Scientific Library). Данная библиотека включает в себя как классический алгоритм, так и два адаптивных: «Vegas» и «Miser».&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko&amp;diff=3417</id>
		<title>Участник:Nkrivenko</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Nkrivenko&amp;diff=3417"/>
		<updated>2016-03-26T21:47:55Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: Новая страница: «Николай Кривенко, студент магистратуры факультета ВМК, кафедра суперкомпьютеров и кван…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Николай Кривенко, студент магистратуры факультета ВМК, кафедра суперкомпьютеров и квантовой информатики.&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3416</id>
		<title>Применение методов Монте-Карло для оценки опционов европейского типа</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3416"/>
		<updated>2016-03-26T21:32:59Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Свойства и структура алгоритма ===&lt;br /&gt;
Методы Монте-Карло можно определить как численные методы решения задач при помощи моделирования случайных величин. Эти методы находят широкое применение в различных областях, в частности, в финансовой математике, например, их можно применить для определения цены опциона европейского типа.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эволюционирующий в непрерывном времени финансовый рынок, состоящий из двух типов активов: акции (рисковые активы, S) и облигации (безрисковые активы, B). Для моделирования рынка будем использовать модель Блэка–Шоулса. Данная модель после ряда преобразований представляет собой систему стохастических дифференциальных уравнений следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dB_t = rB_tdt, B_0 &amp;gt; 0, (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dS_t = S_t((r-\delta)dt - \sigma dW_t), S_0 &amp;gt; 0. (2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь первое уравнение представляет собой обыкновенное дифференциальное уравнение, описывающее поведение цены облигации &amp;lt;math&amp;gt;B_t&amp;lt;/math&amp;gt;, на изменение которой влияет процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. Уравнение (2) является стохастическим дифференциальным уравнением, описывающим эволюцию цены акции &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt;. В этом уравнении: &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; - волатильность акции, &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; - ставка дивиденда, &amp;lt;math&amp;gt;W_t&amp;lt;/math&amp;gt; - винеровский случайный процесс.&lt;br /&gt;
&lt;br /&gt;
Сделаем несколько предположений касательно рынка:&lt;br /&gt;
&lt;br /&gt;
	1. пусть модель будет без дивидендов: &amp;lt;math&amp;gt;\delta = 0&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	2. процентные ставки постоянны;&lt;br /&gt;
&lt;br /&gt;
	3. если время измеряется в годах, то все рассмотренные процентные ставки участвуют в уравнениях как числа от 0 до 1 и выражают проценты годовых, измеренные в долях.&lt;br /&gt;
&lt;br /&gt;
При этих предположениях рассмотренная система имеет аналитическое решение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_t = S_0 e^{(r - \frac{\sigma^2}{2})t + \sigma W_t}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Опцион, как производный финансовый инструмент, представляет собой контракт между сторонами &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;, который дает право стороне &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; в некоторый момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; в будущем купить у стороны &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; или продать стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; акции по зафиксированной в контракте цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. За это право сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; выплачивает фиксированную сумму (премию) &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt;. При этом K называется ценой исполнения опциона (страйк, strike price), а &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; – ценой опциона.&lt;br /&gt;
&lt;br /&gt;
Основная идея заключения контракта состоит в игре двух лиц – &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;. Вторая сторона выплачивает некоторую сумму &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; и в некоторый момент времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (срок выплаты, зафиксированный в контракте) принимает решение: покупать акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; у первой стороны или нет. Решение принимается в зависимости от соотношения цены &amp;lt;math&amp;gt;S_T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;S_T &amp;lt; K&amp;lt;/math&amp;gt;, покупать акции не выгодно, сторона &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; получила прибыль &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; – убыток &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;. В случае, если &amp;lt;math&amp;gt;S_T &amp;gt; K&amp;lt;/math&amp;gt;, сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; покупает у первой акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, в ряде случаев получая прибыль.&lt;br /&gt;
&lt;br /&gt;
Справедливая цена опциона – цена, при которой наблюдается баланс выигрыша/проигрыша каждой из сторон. Определяется она как средний выигрыш стороны &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mathop{\mathbb{E}}(e^{-rT} max\{S_T - K, 0\})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Точное решение этой системы уравнений известно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = S_0N(d_1) - Ke^{-rT}N(d_2),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_1 = ln{\frac{S_0}{K}} + \frac{(r + \sigma^2 / 2)T}{\sigma\sqrt{T}},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_2 = d_1 - \sigma\sqrt{T}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность точного решения заключается в том, что оно может оказаться недействительным в ряде случаев, например, при переменных процентных ставках. В этом случае система уравнений &amp;lt;math&amp;gt;(1),(2)&amp;lt;/math&amp;gt; обычно интегрируется численно.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Решаемая задача имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = e^{-rT}\int^{+\infty}_{-\infty}{f(z)\varphi(z)dz}, (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, (4)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вычисления этого интеграла будем использовать метод Монте-Карло. Если мы рассмотрим случайную величину &amp;lt;math&amp;gt;X = f(z)&amp;lt;/math&amp;gt;, то математическое ожидание этой случайной величины будет совпадать с формулой (3) с точностью до коэффициента дисконтирования. Формула для вычисления искомого интеграла имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{C} = \frac{e^{-rT}}{N} \sum^{N}_{i=1}{f(z_i)},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z_i) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, z_i \sim N_{0,1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет вычисление следующей суммы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{N}_{i=1}{f(z_i)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку время, требуемое на операцию сложения в реальных примерах мало по сравнению с временем, затрачиваемом на вычисление функции &amp;lt;math&amp;gt;f(z_i)&amp;lt;/math&amp;gt;, для производительности вычислений становится маловажным, каким конкретным образом осуществлять сложение и умножение.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм представляет собой сумму значений функции от случайной величины.&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
Формулы для реализации алгоритма приведены выше &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;. С помощью генератора случайных чисел в цикле получаются точки, и в них вычисляется соответствующая функция. Результаты складываются, полученная сумма умножается на коэффициент. При последовательной реализации для экономии памяти можно сразу не генерировать массив всех точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Время, затраченное на вычисление интеграла растет как &amp;lt;math&amp;gt;Nt&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; – количество случайных точек, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – время, необходимое для вычисления функции.&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма представлен на рисунке 1,&lt;br /&gt;
&lt;br /&gt;
[[Файл: MCG.png]]&lt;br /&gt;
&lt;br /&gt;
Рисунок 1 – Информационный граф алгоритма&lt;br /&gt;
&lt;br /&gt;
где вершина &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; – вычисление функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;rnd&amp;lt;/math&amp;gt; – генерация случайного числа. Анализ этого графа производится в последующих разделах описания алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления интеграла &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; методом Монте-Карло требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
	1) вычисление случайного числа &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
	2) вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; на основании полученного случайного числа,&lt;br /&gt;
&lt;br /&gt;
	3) сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае, все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на разных узлах, следовательно, алгоритм идеально поддается распараллеливанию.&lt;br /&gt;
При классификации по высоте ярусно-параллельной формы этот алгоритм имеет сложность 3. При классификации по ширине – &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные для вычисления алгоритма: число точек &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, волатильность акции &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, время жизни опциона &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, стоимость акции в начальный момент времени &amp;lt;math&amp;gt;S_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные: справедливая цена опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов. Таким образом, ускорение должно быть близко к линейному.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    double price(int N, double sigma, double T, double K, double S0, double r) {&lt;br /&gt;
	coeff = exp(-r*T) / N, result = .0, sigma_coeff = (r - sigma * sigma / 2) * T, sigma_T_coeff = sigma * sqrt(T);&lt;br /&gt;
	for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
	    result += max(0, S0 * exp(sigma_coeff + sigma_T_coeff * normalrand(i)) - K);&lt;br /&gt;
	}&lt;br /&gt;
	return coeff * result;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представленный алгоритм не является полностью детерминированным, так как он основан на использовании последовательностей случайных чисел.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
Данные в представленном алгоритме обладают хорошей локальностью, так как на каждом шаге алгоритма приходится использовать значения переменных &amp;lt;i&amp;gt;sigma_coeff&amp;lt;/i&amp;gt; и &amp;lt;i&amp;gt;sigma_T_coeff&amp;lt;/i&amp;gt;, что повышает вероятность попадания этих значений в кэш.&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
Один из возможных вариантов реализации алгоритма – независимое вычисление значений функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt; на различных вычислительных узлах, например, с помощью технологии MPI. «Подводным камнем» такой реализации может стать генерация случайных чисел, которая должна быть независимой на каждом вычислительном узле. Желательно использовать генератор случайных чисел с достаточно большим периодом.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть хорошо масштабируем.&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При достаточно большом числе точек N возможна реализация алгоритма на GPU для достижения большей скорости выполнения, чем на обычных процессорах.&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Есть открытая реализация методов Монте-Карло, являющаяся частью GSL (GNU Scientific Library). Данная библиотека включает в себя как классический алгоритм, так и два адаптивных: «Vegas» и «Miser».&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
	<entry>
		<id>https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3415</id>
		<title>Применение методов Монте-Карло для оценки опционов европейского типа</title>
		<link rel="alternate" type="text/html" href="https://xn--80aecvaldz.xn--80ahdrnmvk.xn--p1ai/w/ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2_%D0%9C%D0%BE%D0%BD%D1%82%D0%B5-%D0%9A%D0%B0%D1%80%D0%BB%D0%BE_%D0%B4%D0%BB%D1%8F_%D0%BE%D1%86%D0%B5%D0%BD%D0%BA%D0%B8_%D0%BE%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%BE%D0%B2_%D0%B5%D0%B2%D1%80%D0%BE%D0%BF%D0%B5%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%82%D0%B8%D0%BF%D0%B0&amp;diff=3415"/>
		<updated>2016-03-26T21:30:35Z</updated>

		<summary type="html">&lt;p&gt;Nkrivenko: Новая страница: «== Свойства и структура алгоритма == === Свойства и структура алгоритма === Методы Монте-Карл…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Свойства и структура алгоритма ==&lt;br /&gt;
=== Свойства и структура алгоритма ===&lt;br /&gt;
Методы Монте-Карло можно определить как численные методы решения задач при помощи моделирования случайных величин. Эти методы находят широкое применение в различных областях, в частности, в финансовой математике, например, их можно применить для определения цены опциона европейского типа.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим эволюционирующий в непрерывном времени финансовый рынок, состоящий из двух типов активов: акции (рисковые активы, S) и облигации (безрисковые активы, B). Для моделирования рынка будем использовать модель Блэка–Шоулса. Данная модель после ряда преобразований представляет собой систему стохастических дифференциальных уравнений следующего вида:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dB_t = rB_tdt, B_0 &amp;gt; 0, (1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;dS_t = S_t((r-\delta)dt - \sigma dW_t), S_0 &amp;gt; 0. (2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь первое уравнение представляет собой обыкновенное дифференциальное уравнение, описывающее поведение цены облигации &amp;lt;math&amp;gt;B_t&amp;lt;/math&amp;gt;, на изменение которой влияет процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;. Уравнение (2) является стохастическим дифференциальным уравнением, описывающим эволюцию цены акции &amp;lt;math&amp;gt;S_t&amp;lt;/math&amp;gt;. В этом уравнении: &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt; - волатильность акции, &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt; - ставка дивиденда, &amp;lt;math&amp;gt;W_t&amp;lt;/math&amp;gt; - винеровский случайный процесс.&lt;br /&gt;
&lt;br /&gt;
Сделаем несколько предположений касательно рынка:&lt;br /&gt;
&lt;br /&gt;
	1. пусть модель будет без дивидендов: &amp;lt;math&amp;gt;\delta = 0&amp;lt;/math&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
	2. процентные ставки постоянны;&lt;br /&gt;
&lt;br /&gt;
	3. если время измеряется в годах, то все рассмотренные процентные ставки участвуют в уравнениях как числа от 0 до 1 и выражают проценты годовых, измеренные в долях.&lt;br /&gt;
&lt;br /&gt;
При этих предположениях рассмотренная система имеет аналитическое решение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;S_t = S_0 e^{(r - \frac{\sigma^2}{2})t + \sigma W_t}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Опцион, как производный финансовый инструмент, представляет собой контракт между сторонами &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;, который дает право стороне &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; в некоторый момент времени &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; в будущем купить у стороны &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; или продать стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; акции по зафиксированной в контракте цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. За это право сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; выплачивает фиксированную сумму (премию) &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; стороне &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt;. При этом K называется ценой исполнения опциона (страйк, strike price), а &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; – ценой опциона.&lt;br /&gt;
&lt;br /&gt;
Основная идея заключения контракта состоит в игре двух лиц – &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;. Вторая сторона выплачивает некоторую сумму &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; и в некоторый момент времени &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt; (срок выплаты, зафиксированный в контракте) принимает решение: покупать акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt; у первой стороны или нет. Решение принимается в зависимости от соотношения цены &amp;lt;math&amp;gt;S_T&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;. Если &amp;lt;math&amp;gt;S_T &amp;lt; K&amp;lt;/math&amp;gt;, покупать акции не выгодно, сторона &amp;lt;math&amp;gt;P_1&amp;lt;/math&amp;gt; получила прибыль &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;, а &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; – убыток &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;. В случае, если &amp;lt;math&amp;gt;S_T &amp;gt; K&amp;lt;/math&amp;gt;, сторона &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt; покупает у первой акции по цене &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, в ряде случаев получая прибыль.&lt;br /&gt;
&lt;br /&gt;
Справедливая цена опциона – цена, при которой наблюдается баланс выигрыша/проигрыша каждой из сторон. Определяется она как средний выигрыш стороны &amp;lt;math&amp;gt;P_2&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = \mathop{\mathbb{E}}(e^{-rT} max\{S_T - K, 0\})&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Точное решение этой системы уравнений известно:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = S_0N(d_1) - Ke^{-rT}N(d_2),&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_1 = ln{\frac{S_0}{K}} + \frac{(r + \sigma^2 / 2)T}{\sigma\sqrt{T}},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;d_2 = d_1 - \sigma\sqrt{T}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Особенность точного решения заключается в том, что оно может оказаться недействительным в ряде случаев, например, при переменных процентных ставках. В этом случае система уравнений &amp;lt;math&amp;gt;(1),(2)&amp;lt;/math&amp;gt; обычно интегрируется численно.&lt;br /&gt;
&lt;br /&gt;
=== Математическое описание алгоритма ===&lt;br /&gt;
Решаемая задача имеет следующий вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;C = e^{-rT}\int^{+\infty}_{-\infty}{f(z)\varphi(z)dz}, (3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, (4)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\varphi(z) = \frac{1}{\sqrt{2\pi}} e^{-z^2/2}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для вычисления этого интеграла будем использовать метод Монте-Карло. Если мы рассмотрим случайную величину &amp;lt;math&amp;gt;X = f(z)&amp;lt;/math&amp;gt;, то математическое ожидание этой случайной величины будет совпадать с формулой (3) с точностью до коэффициента дисконтирования. Формула для вычисления искомого интеграла имеет вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\hat{C} = \frac{e^{-rT}}{N} \sum^{N}_{i=1}{f(z_i)},&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(z_i) = max\{S_0 e^{(r - \sigma^2/2)T + \sigma\sqrt{T}z} - K, 0\}, z_i \sim N_{0,1}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вычислительное ядро алгоритма ===&lt;br /&gt;
Вычислительное ядро алгоритма составляет вычисление следующей суммы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum^{N}_{i=1}{f(z_i)}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Поскольку время, требуемое на операцию сложения в реальных примерах мало по сравнению с временем, затрачиваемом на вычисление функции &amp;lt;math&amp;gt;f(z_i)&amp;lt;/math&amp;gt;, для производительности вычислений становится маловажным, каким конкретным образом осуществлять сложение и умножение.&lt;br /&gt;
&lt;br /&gt;
=== Макроструктура алгоритма ===&lt;br /&gt;
Алгоритм представляет собой сумму значений функции от случайной величины.&lt;br /&gt;
=== Схема последовательной реализации алгоритма ===&lt;br /&gt;
Формулы для реализации алгоритма приведены выше &amp;lt;math&amp;gt;(1)&amp;lt;/math&amp;gt;. С помощью генератора случайных чисел в цикле получаются точки, и в них вычисляется соответствующая функция. Результаты складываются, полученная сумма умножается на коэффициент. При последовательной реализации для экономии памяти можно сразу не генерировать массив всех точек, в которых должна быть вычислена функция, а получать их последовательно.&lt;br /&gt;
=== Последовательная сложность алгоритма ===&lt;br /&gt;
Время, затраченное на вычисление интеграла растет как &amp;lt;math&amp;gt;Nt&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt; – количество случайных точек, &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt; – время, необходимое для вычисления функции.&lt;br /&gt;
=== Информационный граф алгоритма ===&lt;br /&gt;
Информационный граф алгоритма представлен на рисунке 1,&lt;br /&gt;
&lt;br /&gt;
(МЕСТО ДЛЯ РИСУНКА)&lt;br /&gt;
&lt;br /&gt;
Рисунок 1 – Информационный граф алгоритма&lt;br /&gt;
&lt;br /&gt;
где вершина &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; – вычисление функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;rnd&amp;lt;/math&amp;gt; – генерация случайного числа. Анализ этого графа производится в последующих разделах описания алгоритма.&lt;br /&gt;
&lt;br /&gt;
=== Ресурс параллелизма алгоритма ===&lt;br /&gt;
Для вычисления интеграла &amp;lt;math&amp;gt;(3)&amp;lt;/math&amp;gt; методом Монте-Карло требуется последовательно выполнить следующие ярусы:&lt;br /&gt;
&lt;br /&gt;
	1) вычисление случайного числа &amp;lt;math&amp;gt;z&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
	2) вычисление функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; на основании полученного случайного числа,&lt;br /&gt;
&lt;br /&gt;
	3) сложение полученных результатов.&lt;br /&gt;
&lt;br /&gt;
В общем случае, все вычисления функции &amp;lt;math&amp;gt;f&amp;lt;/math&amp;gt; могут производиться на разных узлах, следовательно, алгоритм идеально поддается распараллеливанию.&lt;br /&gt;
При классификации по высоте ярусно-параллельной формы этот алгоритм имеет сложность 3. При классификации по ширине – &amp;lt;math&amp;gt;O(N)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Входные и выходные данные алгоритма ===&lt;br /&gt;
Входные данные для вычисления алгоритма: число точек &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;, волатильность акции &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;, время жизни опциона &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;, страйк &amp;lt;math&amp;gt;K&amp;lt;/math&amp;gt;, процентная ставка &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;, стоимость акции в начальный момент времени &amp;lt;math&amp;gt;S_0&amp;lt;/math&amp;gt;.&lt;br /&gt;
Выходные данные: справедливая цена опциона &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Свойства алгоритма ===&lt;br /&gt;
Соотношение последовательной и параллельной сложностей в случае неограниченных ресурсов является линейным.&lt;br /&gt;
&lt;br /&gt;
При этом сложность ядра алгоритма относительно объема входных данных также является линейной. При лимитированных ресурсах как параллельная реализация, так и последовательная реализация имеют линейную сложность относительно количества точек интегрирования. Однако, константа, представляющая собой отношение затрачиваемого в параллельной и последовательной реализациях времени, может быть весьма значительной и приближаться к количеству доступных узлов. Таким образом, ускорение должно быть близко к линейному.&lt;br /&gt;
&lt;br /&gt;
== Программная реализация алгоритма ==&lt;br /&gt;
=== Особенности последовательной реализации алгоритма ===&lt;br /&gt;
Код последовательной реализации на языке C может выглядеть так:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    double price(int N, double sigma, double T, double K, double S0, double r) {&lt;br /&gt;
	coeff = exp(-r*T) / N, result = .0, sigma_coeff = (r - sigma * sigma / 2) * T, sigma_T_coeff = sigma * sqrt(T);&lt;br /&gt;
	for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
	    result += max(0, S0 * exp(sigma_coeff + sigma_T_coeff * normalrand(i)) - K);&lt;br /&gt;
	}&lt;br /&gt;
	return coeff * result;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Представленный алгоритм не является полностью детерминированным, так как он основан на использовании последовательностей случайных чисел.&lt;br /&gt;
=== Локальность данных и вычислений ===&lt;br /&gt;
Данные в представленном алгоритме обладают хорошей локальностью, так как на каждом шаге алгоритма приходится использовать значения переменных &amp;lt;i&amp;gt;sigma_coeff&amp;lt;/i&amp;gt; и &amp;lt;i&amp;gt;sigma_T_coeff&amp;lt;/i&amp;gt;, что повышает вероятность попадания этих значений в кэш.&lt;br /&gt;
=== Возможные способы и особенности реализации параллельного алгоритма ===&lt;br /&gt;
Один из возможных вариантов реализации алгоритма – независимое вычисление значений функции &amp;lt;math&amp;gt;f(z)&amp;lt;/math&amp;gt; на различных вычислительных узлах, например, с помощью технологии MPI. «Подводным камнем» такой реализации может стать генерация случайных чисел, которая должна быть независимой на каждом вычислительном узле. Желательно использовать генератор случайных чисел с достаточно большим периодом.&lt;br /&gt;
=== Масштабируемость алгоритма и его реализации ===&lt;br /&gt;
Теоретические оценки показывают, что алгоритм должен быть хорошо масштабируем.&lt;br /&gt;
=== Динамические характеристики и эффективность реализации алгоритма ===&lt;br /&gt;
=== Выводы для классов архитектур ===&lt;br /&gt;
При достаточно большом числе точек N возможна реализация алгоритма на GPU для достижения большей скорости выполнения, чем на обычных процессорах.&lt;br /&gt;
=== Существующие реализации ===&lt;br /&gt;
Есть открытая реализация методов Монте-Карло, являющаяся частью GSL (GNU Scientific Library). Данная библиотека включает в себя как классический алгоритм, так и два адаптивных: «Vegas» и «Miser».&lt;/div&gt;</summary>
		<author><name>Nkrivenko</name></author>
	</entry>
</feed>