Модель CRR

Программирование CRR-модели для расчета теоретической цены опционов.

Ключевые слова: модель CRR, опционы, колл, пут

Выделите

  • Сложность:★★★☆☆
  • Использование данных о транзакциях для ценообразования опционов.
  • Совет: Основной темой этой статьи является то, как запрограммировать модель CRR с помощью Python. Поэтому подробное введение в модель CRR в эту статью не приводится. Перед чтением рекомендуется ознакомиться с опциями и моделью CRR.

Предисловие

В нашей предыдущей статье — 【Квант】Модель Блэка-Шоулза и греки, мы рассказываем, как запрограммировать модель Блэка-Шоулза. Однако Блэк Шоулз имеет свои недостатки и не может рассчитать теоретическую цену для американских опционов. Поэтому через три года после появления Black Scholes Джон Кокс, Стивен Росс и Марк Рубинштейн изобрели относительно простую и более общую модель ценообразования опционов — модель CRR.

Модель CRR использует биномиальную теорему для дискретизации будущего, предполагая, что для каждого момента времени существует только две возможности — движение вверх или вниз — и что величина движений фиксирована. Таким образом, будущая цена базового актива может быть построена в виде модели бинарного дерева с течением времени. Затем вычислите внутреннюю стоимость опциона под каждым узлом и возьмите текущую стоимость каждого узла, чтобы получить теоретическую стоимость опциона, работая в обратном направлении.

Среда программирования и требуемый модуль

В качестве редактора используется Windows 11 и Jupyter Notebook# Load required package
import math
import tejapi
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
plt.style.use(‘ggplot’)

# log in TEJ API
api_key = ‘YOUR_KEY’
tejapi.ApiConfig.api_key = api_key
tejapi.ApiConfig.ignoretz = True

База данных

База данных по торговле акциями: Нескорректированная ежедневная цена акций, код базы данных (TWN/APRCD).
База данных деривативов: ежедневная информация о сделках опционов, код базы данных (TWN/AOPTION).

Импорт данных

С использованием нескорректированных цен закрытия взвешенного индекса Тайваня (Y9999) с 1 января 2021 года по 19 апреля 2023 года. И загрузка тайваньского взвешенного индекса колл, пут-опцион (TXO202304C15500, TXO202304P15500), которые являются европейскими опционами, с датой начала торгов 1 января и датой экспирации 19 апреля, и ценой исполнения 15500.# set time zone
gte, lte = ‘2021-03-16’, ‘2023-04-20’

# Get stock price
stocks = tejapi.get(‘TWN/APRCD’,
paginate = True,
coid = ‘Y9999’,
mdate = {‘gte’:gte, ‘lte’:lte},
opts = {
‘columns’:[ ‘mdate’,’close_d’]
}
)

# Get options price
puts = tejapi.get( # puts price
‘TWN/AOPTION’,
paginate = True,
coid = ‘TXO202304P15500’,
mdate = {‘gte’:gte, ‘lte’:lte},
opts = {
‘columns’:[‘mdate’, ‘coid’,’settle’, ‘kk’, ‘theoremp’, ‘acls’, ‘ex_price’, ‘td1y’, ‘avolt’, ‘rtime’]
}
)
calls = tejapi.get( # calls price
‘TWN/AOPTION’,
paginate = True,
coid = ‘TXO202304C15500’,
mdate = {‘gte’:gte, ‘lte’:lte},
opts = {
‘columns’:[‘mdate’, ‘coid’,’settle’, ‘kk’, ‘theoremp’, ‘acls’, ‘ex_price’, ‘td1y’, ‘avolt’, ‘rtime’]
}
)

# set index
stocks = stocks.set_index(‘mdate’)
puts = puts.set_index(‘mdate’)
calls = calls.set_index(‘mdate’)

Обработка данных

Рассчитывая дневную доходность и перемещая волатильность, установите в качестве окна 252 дня.# Calculate stock return and moving volatility
stocks[‘daily return’] = np.log(stocks[‘close_d’]) — np.log(stocks[‘close_d’].shift(1))
stocks[‘moving volatility’] = stocks[‘daily return’].rolling(252).std()

Модель CRR

Как упоминалось ранее, модель CRR является более интуитивно понятной и гибкой моделью ценообразования опционов, чем Black Scholes. Несмотря на то, что она не имеет решения в закрытой форме, как модель Блэка-Шоулза, и может быть более трудоемкой для расчета из-за своей двоичной древовидной структуры, модель CRR имеет преимущества перед моделью Блэка-Шоулза в ценообразовании вариантов с изменяющимися во времени характеристиками, таких как американские опционы и экзотические опционы.

Основная формула модели CRR заключается в вычислении текущей стоимости каждого узла в двоичном дереве. Мы можем использовать следующую формулу для расчета величины и вероятности движения цены акций в следующем периоде, обозначенных как u, d и p, на диаграмме ниже. Затем мы можем рассчитать рост и падение цен на акции в следующем периоде и сформировать древовидную структуру по прошествии времени. Черные линии и математические формулы на диаграмме представляют собой изменения цен на акции, в то время как красные линии и математические формулы представляют стоимость колл-опциона. Мы видим, что сначала мы рассчитываем будущие изменения цен на акции (например, uS0, dS0), затем вычитаем страйк-цену из цены акции, чтобы получить внутреннюю стоимость колл-опциона (например, Ct,1, Ct,2), и, наконец, шаг за шагом, мы можем вычислить текущую стоимость колл-опциона и получить теоретическую цену опциона сегодня.

Структура европейского дерева вызовов

Для пут-опционов нам просто нужно изменить метод расчета внутренней стоимости, вычитая цену акции из цены исполнения (например, Pt,0, Pt,1). В остальном процесс расчета такой же, как и для колл-опционов в модели CRR.

Европейская структура дерева

По сравнению с Black Scholes, модель CRR может стоить опционов в американском стиле. Так называемые американские опционы позволяют держателю опциона исполнить опцион до истечения срока действия, в то время как обычные опционы называются европейскими. Для держателя, до тех пор, пока текущая внутренняя стоимость больше, чем текущая стоимость, полученная путем обратной индукции, существует стимул для исполнения опциона. Таким образом, цена опциона в каждом узле будет представлять собой максимальное значение между текущей стоимостью, полученной методом обратной индукции, и внутренней стоимостью, как показано в выделенной части диаграммы.

Американская древовидная структура вызова
Американская структура дерева

Разобравшись, как рассчитать цены опционов с помощью модели CRR, перейдем к части программирования.class crr_model:

# init fuction
def __init__(self, s, x, r, t, sigma, N, sigma_daily = True):

t /= 252
dt = t/N
if sigma_daily:
sigma *= np.sqrt(252)
u = np.exp(sigma * math.sqrt(dt))
d = 1/u
p = (np.exp(r*dt)-d) / (u-d)

self.s = s
self.x = x
self.r = r
self.t = t
self.N = N
self.dt = dt
self.u = u
self.d = d
self.p = p
self.sigma = sigma

# european call price
def eu_call_price(self):

lattice = np.zeros((self.N+1, self.N+1))
for j in range(self.N+1):
lattice[self.N, j] = max(0, self.s*(self.u**j)*(self.d**(self.N-j)) — self.x)
for i in range(self.N-1, -1, -1):
for j in range(i+1):
lattice[i, j] = np.exp(-self.r*self.dt)*(self.p*lattice[i+1,j+1] + (1-self.p) * lattice[i+1, j])

return lattice[0,0], lattice

# european put price
def eu_put_price(self):

lattice = np.zeros((self.N+1, self.N+1))
for j in range(self.N+1):
lattice[self.N, j] = max(0, self.x — self.s*(self.u**j)*(self.d**(self.N-j)))
for i in range(self.N-1, -1, -1):
for j in range(i+1):
lattice[i, j] = np.exp(-self.r*self.dt)*(self.p*lattice[i+1,j+1] + (1-self.p) * lattice[i+1, j])

return lattice[0,0], lattice

# american call price
def am_call_price(self):

lattice = np.zeros((self.N+1, self.N+1))
for j in range(self.N+1):
lattice[self.N, j] = max(0, self.s*(self.u**j)*(self.d**(self.N-j)) — self.x)
for i in range(self.N-1, -1, -1):
for j in range(i+1):
lattice[i, j] = max(np.exp(-self.r*self.dt)*(self.p*lattice[i+1,j+1] + (1-self.p) * lattice[i+1, j]),
self.s*(self.u**j)*(self.d**(i-j)) — self.x )

return lattice[0,0], lattice

# american put price
def am_put_price(self):

lattice = np.zeros((self.N+1, self.N+1))
for j in range(self.N+1):
lattice[self.N, j] = max(0, self.x — self.s*(self.u**j)*(self.d**(self.N-j)))
for i in range(self.N-1, -1, -1):
for j in range(i+1):
lattice[i, j] = max(
np.exp(-self.r*self.dt)*(self.p*lattice[i+1,j+1] + (1-self.p) * lattice[i+1, j]),
self.x — self.s*(self.u**j)*(self.d**(i-j))
)

return lattice[0,0], lattice

Чтобы воспроизвести древовидную структуру, мы используем вложенный массив numpy для формирования матрицы (N+1) x (N+1), где верхний левый элемент является теоретической ценой опциона. Синяя линия в левом нижнем углу – это вышеупомянутая древовидная диаграмма.s = 100 # set stock price at time 0
x = 95 # set strike price
r = 0 # set risk-free rate = 0%
t = 252 # set time to maturity at 252 days
sigma = 0.3 # set annualized volatility at 0.3
N = 4 # set steps at 4

crr = crr_model(s, x, r, t, sigma, N, sigma_daily = False)
call, call_lat = crr.eu_call_price()
call_lat

Свойство сходимости

Внимательные читатели, возможно, заметили существование переменной N, которую можно рассматривать как количество делений периода экспирации. Например, если время до погашения составляет 252 дня, а N установлено на 251, это означает, что будущая цена акции рассчитывается один раз в день, а древовидная диаграмма будет иметь 252 слоя. То есть количество слоев (N+1) нашего дерева определяется N. Вопрос в том, каково оптимальное значение для N для достижения лучших результатов ценообразования? На самом деле конкретного значения N не существует, но мы можем наблюдать, что по мере увеличения числа N, то есть деления времени на более мелкие отрезки, рассчитанная цена опциона будет приближаться к постоянному значению. Поэтому, если мощность компьютера позволяет, более высокое значение N будет лучше.# plot the convergency pattern of crr model

calls_ = []
for n in range(1, 100):

s = 100
x = 100
r = 0.011
t = 52
sigma = 0.3

crr = crr_model(s, x, r, t, sigma, n, sigma_daily = False)
call, call_lat = crr.eu_call_price()
calls_.append(call)

plt.plot(range(1, 100), calls_, color = ‘red’)
plt.xlabel(‘Numbers of N’)
plt.ylabel(‘Theoretical call price’)
plt.title(‘Options price convergency’)
plt.savefig(‘Options price convergency’)
plt.show()

Конвергенция цен опционов

Практический пример

Наконец, сравним теоретические цены, полученные с помощью модели CRR, с ценой Блэк-Шоулза, рассчитанной TEJ, и фактической рыночной ценой.
Мы используем пут-опцион TAIEX с ценой исполнения 15500, с 1 января 2023 года по 19 апреля 2023 года. Безрисковая ставка устанавливается на уровне доходности тайваньских 5-летних облигаций (0,011), а Sigma использует стандартное отклонение доходности TAIEX за 252-дневное окно. N установлено в 1000. Полученные результаты показаны ниже, и видно, что цена CRR ближе к фактической рыночной цене, чем цена Блэка Шоулза, рассчитанная TEJ.s = stocks.loc[‘2023-01-31’][‘close_d’] # get the stock price at the first dat of options trading
x = 15500 # strike price
r = 0.011 # use 5-year Taiwan government bond ytm
t = 51 # time to maturity
sigma = stocks.loc[‘2023-01-31’][‘moving volatility’] # get the return volatility at the first day od options trading
N = 100 # divided time 2 maturity into 10 parts

crr = crr_model(s, x, r, t, sigma, N, sigma_daily = True)
call, call_lat = crr.eu_call_price() # european call price
put, put_lat = crr.eu_put_price() # european put price
call_a, call_lat_a = crr.am_call_price() # american call price
put_a, put_lat_a = crr.am_put_price() # american put price

print(‘CRR theoretical price: ‘, put)
print(‘TEJ Black Scholes price: ‘, puts.loc[‘2023-01-31’][‘theoremp’])
print(‘Real price: ‘, puts.loc[‘2023-01-31’][‘settle’])

Заключение

Модель CRR, как новичок, предлагает большую гибкость, чем модель Блэка-Шоулза. В последовавшей за этим волне производных продуктов многие уникальные опционы могут быть оценены с помощью модели CRR или ее расширенных моделей. Его простой математический метод расчета и теоретическая база делают его хорошим выбором для многих начинающих инвесторов в опционы. В этой статье мы завершили программирование модели CRR для ценообразования европейских и американских опционов. В будущем мы предоставим больше знаний, связанных с опционами или производными продуктами. Пожалуйста, продолжайте следить за нами, и читатели и инвесторы также могут приобрести TEJ E Shop для создания своих программ ценообразования опционов. Обратите внимание, что упомянутые выше формулы ценообразования и опционные продукты предназначены только для демонстрационных целей и не представляют собой каких-либо инвестиционных или целевых рекомендаций.

Исходный код

https://medium.com/media/33ee17eab32146ac5da639ff679653d0

Расширенное чтение

Ссылки по теме

Источник