-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathreadme.Rmd
186 lines (111 loc) · 8.33 KB
/
readme.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
---
title: "PositiveDelta"
output: github_document
---
```{r setup, echo=FALSE, warning=FALSE, message=FALSE}
#knitr::opts_chunk$set(echo = FALSE)
require(dplyr)
require(plotly)
require(knitr)
options(width = 100)
source_funs = lapply(as.list(dir(path='funs')), function(x) source(file = paste0('funs\\', x) ) )
rm(source_funs)
```
PositiveDelta - это модель данных и набор функций для анализа портфелей биржевых опционов. Механизм позволяет стоить профили портфелей, сравнивать несколько портфелей, расчитывать сценарии для разных дат и изменения волатильности.
Пользователь может загрузить портфели и рыночные данные из любого доступного источника (база данных, сайт биржи, торговый терминал и т.д.). Для анализа данные должны иметь определённую структуру.
Структура данных (исходных и расчётных) определена в объектах:
* `OptMarket` - рыночные котировки;
* `OptPort` - портфель опционов;
* `OptProfile` - профиль портфеля.
# Исходные данные
## Котировки OptMarket
В объект класса `OptMarket` загружаются биржевые котировки опционов, базисного актива, текущая дата, стоимость денег. Без рыночных цен портфель переоценивается только по его внутренней стоимости.
Структура абъекта `OptMarket`:
* `board` - доска опционов, минимально необходимые поля - ticker, price;
* `ul` - тикер базисного актива;
* `ul_price` - цена базисного актива;
* `now` - текущая дата.
```{r make_mrkt, warning=FALSE, message=FALSE}
# Указываем тикер базисного актива
ul = 'SiZ9'
# Загружаем биржевые котировки (доску опционов)
brd = GetBoard_fortsdb(ul)
# Создаём объект класса OptMarket
mrkt = OptMarket(ul = ul,
ul_price = brd$ul_price,
board = as.tbl(brd$board),
now = as.Date('2019-11-12'))
mrkt
```
## Портфель OptPort
Портфель может состоять из опционов и базисного актива. Конструктор создаёт портфель на основе сделок (`trades`) по заданному базовому активу (underlying - `ul`). Сделки суммируются в общую позицию (`position`).
```{r load_trades, warning=FALSE, message=FALSE, echo=TRUE}
# Загружаем сделки из базы данных (в базу сделки импортированы из терминала QUIK)
trades = GetTrades_fortsdb()
# Забираем параметры опционов из доски опционов
trades = TickerToParams_fortsboard(trades, mrkt$board)
trades
```
На основании сделок создаём объект `OptPort`:
* `ul` - тикер базисного актива (обязательно)
* `trades` - таблица сделок с обязательными полями `ticker`, `xtype`, `strike`, `expdate`, `tradeprice`, `q` ;
* `sum_trades` - сальдировать сделки (только уникальные контракты в позиции) или добавить в позицию как есть;
* `name` - имя портфеля (опционально, нужно для идентификации портфеля в случае сравнения нескольких)
```{r make_port, warning=FALSE, message=FALSE, comment=''}
port = OptPort(ul = ul,
trades = trades,
sum_trades = T,
name = 'Spread')
port
```
Ключевое поле после создания объекта - `position`. Это, собственно, и есть портфель - текущая позиция в опционах и базисном активе.
# Анализ портфеля
## Оценка портфеля
Функция `PortPricing` применяет рыночные котировки на портфель, т.е. переоценивает его по текущим ценам. Если известны цены опционов, функция расчитывает ожидаемую волатильность опционов. Если переоценка по волатильности - рассчитываются цены.
`price_at` - тип цены для переоценки портфеля. Это префикс названия колонок цены или волатильности в `OptMarket$board`.
```{r price_port, warning=FALSE, message=FALSE}
port = PortPricing(port, mrkt, price_at = 'theor')
port$position
```
## Прибыль и "греки"
Функция `PortValuation` расчитывает параменты портфеля по текущим ценам.
Результаты сохраняются в поле `total_value` объекта `OptPort`.
```{r value_port, warning=FALSE, message=FALSE}
port = PortValuation(port)
port$total_value
```
## Профиль портфеля - OptProfile
Профиль портфеля опционов - основной инструмент анализа.
В классическом варинате, он отражает зависимость прибыли и "греков" портфеля от цены базисного актива.
Объект `OptProfile` содержит профиль портфеля на интервале цен базисного актива. Интервал (`ul_range`) - процентное отклонение от максимального и минимального страйков портфеля.
Функция `PlotProfile` строит график профиля на базе `ggplot2`.
```{r calc_profile, warning=FALSE , message=FALSE, fig.align='center' }
myprofile = OptProfile(optport = port,
params = c('pl', 'delta', 'theta', 'vega'),
ul_range = 0.05)
PlotProfile(myprofile)
```
# Анализ сценариев
Механизм позволяет вносить изменения в портфель, сравнивать несколько портфелей с одним базисным активом, а также использовать сценарии What-if для разных сроков до погашения или изменения волательности.
## Манипуляции с портфелем
Новые сделки можно добавлять в портфель функцией AddTrades:
* `port` - портфель (объект `OptPort`), в которые добавить сделку;
* `trades` - dataframe со сделками;
* `sum_trades` - расчитывать чистую позицию из сделок; если `FALSE` - новая сделка появится в позиции отдельной строкой.
```{r add_trade, warning=FALSE, message=FALSE}
newtrade = data.frame(ul='SiZ9', ticker='Si63500BX9', xtype='p', strike=63500,
expdate=as.Date('2019-12-19'), tradeprice=500, q=-1 )
port2 = AddTrades(port = port,
trades = newtrade,
sum_trades = T)
port2$name = 'Changed'
```
Профиль нового портфеля можно сравнить со старым.
Функция `JoinProfiles` объединяет данные профилей для построения общего графика.
Первый профиль в списке - приоритетный.
```{r compare_profiles, warning=FALSE, message=FALSE, fig.align='center' }
port2 = port2 %>% PortPricing(., mrkt, price_at = 'theor') %>% PortValuation(.)
myprofile2 = OptProfile(optport = port2, params = c('pl', 'delta','theta', 'vega'), ul_range = 0.05)
profiles = JoinProfiles(list(myprofile, myprofile2))
PlotProfile(profiles)
```