Аппроксимация рядов Тейлора в области финансов

Источник: Автор

ЧАСТЬ I

  • Знакомство
  • Математическое обоснование рядов Тейлора
  • Традиционный подход с использованием Python
    -Линейное приближение
    — Квадратичная аппроксимация

ЧАСТЬ II

  • Применение рядов Тейлора для аппроксимации
  • Применение в финансовом анализе
  • Практические примеры с Python
  • Ограничения и рекомендации
  • Заключение и часто задаваемые вопросы

Часть I

Знакомство

Аппроксимации имеют решающее значение при работе со сложными математическими моделями, которые часто включают сложные уравнения с несколькими переменными и взаимозависимостями. Эти аппроксимации упрощают сложность, заменяя сложные функции управляемыми, что облегчает вычислительную нагрузку. Определяя доминирующие факторы, делая обоснованные упрощения и используя различные методы аппроксимации, математики и ученые могут извлекать ценные сведения и решать реальные проблемы, несмотря на сложность моделей. В этом блоге мы исследуем математическую основу ряда Тейлора и его практическое применение в финансовом моделировании, а также приводим примеры кода на Python. В ней также обсуждаются ограничения и соображения финансовых аналитиков по эффективному использованию этого подхода.

Математические основы

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

У нас будет небольшое дифференцирование (исчисление) во время квадратичного приближения. Вот краткий обзор дифференциального исчисления — Введение в исчисление

Линейное приближение

Вот кривая для функции y = ex. В точках 0, 0,25 и 1 выделены 3 точки. Легко вычислить значения при x = 0 и x = 1, которые равны 1 и 2,71 соответственно.# plotting exp(x)
def exponential(x):
return np.exp(x)

x_point = 0
y_point = exponential(x_point)
x_tangent = np.linspace(x_point — 1, x_point + 1, 100)
m = np.exp(x_point) # The derivative of e^x is e^x itself
b = y_point — m * x_point
# Calculate the corresponding y values for the tangent line
y_tangent = m * x_tangent + b

highlight_x = [0,0.25, 1]
highlight_y = [np.exp(0), np.exp(0.25), np.exp(1)]
# Create a plot
plt.figure(figsize=(6, 4))
plt.plot(x_tangent, exponential(x_tangent), label=f»Curve of $e^x$»,
color=»blue»)
plt.plot(x_tangent, y_tangent, label=f»Tangent at x = {x_point}»,
color=»black»)
plt.scatter(highlight_x, highlight_y, color=»red», label=»Points (0, 1)»)
# plt.legend()
plt.grid(True)
plt.show()
print(f»Tangent line equation at x = {x_point}: y = {m:.2f}x + {b:.2f}»)

OUTPUT:
Tangent line equation at x = 0: y = 1.00x + 1.00

Источник: Автор | Рис 1: График ex | Рисунок 1: Касательная в заданной точке

Итак, можем ли мы взять значение x = 0 и найти значение x = 0.25? Давайте попробуем линейную аппроксимацию, выполнив следующие шаги.

  1. Нарисуйте касательную линию при x = 0, а прямая линия будет представлена как
    y = mx + c, где m — наклон, а c — точка пересечения.
  2. Вычислите коэффициенты прямой, т.е. m и c
  3. Используйте коэффициенты для вычисления значения при x = 0,25
  4. Сравните оценочное значение с фактическим значением

Таким образом, у нас есть значения как для наклона (m = 1), так и для пересечения (c = 1) из линейного уравнения. Мы можем подставить значения на x= 0.25 и оценить значение.# Actual value
y = np.exp(0.25)
y = 1.284025

# Linear approximate value
y = mx + c
y = 1*0.25 + 1
y = 1.250

Как видим, линейная аппроксимация достаточно близка (1,250), но не равна фактическому значению (1,284).

Основные выводы из упражнения

  1. На рисунке 2 видно, что касательная немного отклоняется от точки при x = 0,25, что означает, что в приближенном значении будет некоторая погрешность.
  2. По мере удаления значения x от точки x = 0 погрешность аппроксимированного значения увеличивается.
  3. Линейная аппроксимация работает нормально до тех пор, пока значение x находится в непосредственной близости от точки x = 0. Например: Если мы приблизительно относимся к x = 0.1, мы получаем фактическое значение как 1.105171 и приблизительное значение как 1.10000

Квадратичная аппроксимация

Из линейной аппроксимации мы поняли, что если бы касательная была немного ближе к точке x = 0,25, мы могли бы уменьшить ошибку. Давайте попробуем приблизить эту линию, используя квадратное уравнение вместо линейного.
# Define the function e^x
def exponential(x):
return np.exp(x)

def quadratic(x):
return (0.5*(x**2) + x + 1)

# Define the point at which you want to draw the tangent
x_point = 0
y_point = exponential(x_point)
y_point_quad = exponential(x_point)

m = np.exp(x_point) # The derivative of e^x is e^x itself
b = y_point — m * x_point

# Define the x values for the tangent line
x_tangent = np.linspace(x_point — 1, x_point + 1, 100)

# Calculate the corresponding y values for the tangent line
y_tangent = m * x_tangent + b

highlight_x = [0,0.25, 1]
highlight_y = [np.exp(0), np.exp(0.25), np.exp(1)]

# Create a plot
plt.figure(figsize=(6, 4))
plt.plot(x_tangent, y_tangent, label=f»Linear Approximation at x = {x_point}», color=»black»)
plt.plot(x_tangent, exponential(x_tangent), label=f»Curve of $e^x$», color=»blue»)
plt.plot(x_tangent, quadratic(x_tangent), label=»Quadratic Approximation», color=»green»)
plt.scatter(highlight_x, highlight_y, color=»red», label=»Points (0, 1)»)

# Mark the point of tangency
plt.scatter(x_point, y_point, color=»green», label=»Point of Tangency»)

# Set plot labels and title
plt.xlabel(«x»)
plt.ylabel(«y»)
plt.title(«Line to $e^x$ at a Specific Point»)
plt.legend()
plt.grid(True)
plt.show()

Мы будем следовать тем же шагам, что и в линейном приближении, с той лишь разницей, что у нас будет больше коэффициентов.

  1. Нарисуйте квадратичную (кривую) линию при x = 0, а квадратное уравнение будет представлено y = ax² + bx + c
  2. Вычислите коэффициенты a, b и c

# The quadratic equation
y = ax² + bx + c

# Lets differenciate the equation at x = 0 — first order
yₗ = 2ax + b

# Lets differenciate the equation at x = 0 — second order
yₗₗ = 2a

# We have 3 equations and 3 coefficients — a, b and c
# If we solve these equations we get the values of a, b and c at x = 0
a = 0.5
b = 1
c = 1

3. Используйте коэффициенты для вычисления значения при x = 0,25

4. Сравните оценочное значение с фактическим значением# Actual value
y = np.exp(0.25)
y = 1.284025

# Qudratic approximate value
y = ax² + bx + c
y = 0.5*(0.25)**2 + 1*0.25 + 1
y = 1.281250

Источник: Автор | Рис 3: Квадратичное приближение

В квадратичном приближении, как мы видим на рисунке 3, зеленая линия находится гораздо ближе при x = 0,25 и почти повторяет ex, синюю линию. Мы видим, что квадратичное приближение гораздо ближе (1,28125) по сравнению с фактическим значением (1,28402).

Основные выводы из упражнения

  1. Как видно из рисунка 3, квадратичная линия гораздо ближе при x = 0,25, что означает, что ошибка уменьшается, и мы получаем лучшее приближение.
  2. По мере того, как значение x удаляется от точки x = 0, мы все равно сможем сделать лучшее приближение, чем линейное приближение, например: если мы попробуем аппроксимацию при x= 0.5.
    Фактическое значение = 1.648721
    Линейное приближение = 1.50000
    Квадратичная аппроксимация = 1.625000

Вот график, который обобщает все подходы аппроксимации.

Источник: Автор | Рисунок 4: Линейное и квадратичное приближение

Давайте попробуем другую функцию для квадратичной аппроксимации y = e^(2x + 3x²) при x=0.f(x) = e^(2x + 3x²) —> eq1
f(0) = 1

# Lets differenciate the equation at x = 0 — first order
f'(x) = e^(2x + 3x²). (2 + 6x) —> eq2
f'(0) = 2

# Lets differenciate the equation at x = 0 — second order
f»(x) = (2 + 6x) * e^(2x + 3x²) * (2 + 6x) + 6 * e^(2x + 3x²) —> eq3
f»(0) = 10

———————————————————————

#Lets differentiate the quadratic equation
f(x) = ax² + bx + c —> eq4

#first order —> eq5
f'(x) = 2ax + b at x = 0

#second order—> eq6
f»(x) = 2a at x = 0

———————————————————————
Equating eq 6 and eq 3 at x = 0
2a = 10
a = 5

Equating eq 5 and eq 2, substituting the value of a at x = 0
2ax + b = 2
b = 2

Equating eq 4 and eq 1, substituting the value of a and b at x = 0
ax² + bx + c = 1
c = 1

Final quadratic equation will be
y = 5x² + 2x + 1

Давайте протестируем вывод на аппроксимацию с помощью следующих шагов

  • Определите фактическую функцию, которая равна e^(2x + 3x²)
  • Определите функцию квадратичной аппроксимации, которая возвращает (5*(x**2) + 2*x + 1). Важно отметить, что коэффициенты a, b и c подставляются.
  • Обратите внимание, что по мере удаления значения x от точки аппроксимации x = 0 ошибки увеличиваются, как и ожидалось.

# Define the function e^x
def exponential(x):
return np.exp(2*x+3*x**2)

def quadratic(x):
return (5*(x**2) + 2*x + 1)

pd.DataFrame([[i, round(np.exp(2*i+3*i**2),2),round(quadratic(i),2)]
for i in x], columns= [‘X’, ‘Actual’,’Approximate’])

X Actual Approximate
-0.30 0.72 0.85
-0.25 0.73 0.81
-0.20 0.76 0.80
-0.10 0.84 0.85
0.00 1.00 1.00
0.10 1.26 1.25
0.20 1.68 1.60
0.25 1.99 1.81
0.30 2.39 2.05

Основные выводы из упражнения

  • Аппроксимации используются для оценки результатов, а не для нахождения точных. Они хорошо работают вблизи точки аппроксимации, которая в нашем случае равна 0 (нулю), как показано в обоих примерах.
  • Линейные оценки, как правило, предпочтительнее, если только не требуется квадратичная аппроксимация, так как управление ошибками становится все более сложным по мере усложнения функций.

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

Часть II

Что такое ряд Тейлора?

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

Уравнение 1

Это также можно записать как

Уравнение 2

где f ⁽ⁿ⁾ обозначает n-ю производную функции в точке a

В первой части мы взяли функцию y = ex и выполнили линейные и квадратичные аппроксимации, чтобы оценить значение в любой заданной точке. Мы сделали это в более традиционном подходе с уравнениями и небольшим количеством исчисления в случае квадратичного подхода. Но разве не было бы неплохо иметь упрощенный подход, который позволил бы нам выполнять эти приближения быстро и легко? Что ж, серия Тейлора делает именно это.

Функцию y = ex можно представить с помощью рядов Тейлора, как показано ниже для x=0. Это уравнение является модифицированной версией уравнения 1 при x = 0.

Уравнение 3

Лучший способ понять это — реализовать ряд Тейлора с помощью Python.def taylor_approximation(x, n_terms):
approx = 0
for n in range(n_terms):
term = x**n / np.math.factorial(n)
approx += term
return round(approx,5)# Define the range of x values for the plot
x = np.linspace(-1, 1, 100)
x = np.round(x,5)p1 = 0.25253
n_terms = 5
y_taylor = [taylor_approximation(val, n_terms) for val in x if val==p1][0]
y_exact = np.exp(p1)
df= pd.DataFrame([[y_exact, y_taylor, y_exact — y_taylor]],
columns = [«Actual», «Taylor Approx», «Error»])
OUTPUT:
At x = 0
Actual Taylor Approx Error
1.0000 1.0000 0.0000At x = 025253
Actual Taylor Approx Error
1.28728 1.28727 0.00001

В результате, приближение рядов Тейлора оказалось очень успешным с пренебрежимо малой погрешностью.

Основные выводы/наблюдения

  • Уравнение, являющееся частью Красного ящика, является тем же самым, что и линейное приближение, которое мы сделали в ЧАСТИ I. Мы решили уравнение
    Y = mx +c и вычислил значения m и c, которые оказались равны 1 и значение такое же, как и в ряду Тейлора.
Уравнение 4
  • Уравнение, являющееся частью Зеленого ящика, аналогично квадратичному приближению, которое мы сделали в части I. Если вы заметили, это то же самое, что и уравнение y = ax² + bx + c, и мы вычислили значения a = 1/2, b = 1 и c = 1. Это то же самое, что и в серии Тейлора ниже.
Уравнение 5
  • По мере того, как мы продолжаем расширять ряд с более высокими порядками, ошибка продолжает уменьшаться при более высоких десятичных знаках, но это может быть вычислительно затратным, поэтому безопасно остановиться на втором порядке, поскольку мы оцениваем значение, а не пытаемся точно соответствовать фактическому значению.

Если вы хотите быстро освежить в памяти математический анализ, пожалуйста, прочтите блог — Введение в исчисление

Применение ряда Тейлора в финансовом анализе

Допустим, у нас есть облигация с нулевым купоном и номинальной стоимостью $100, которая постоянно растет по ставке 5% со сроком погашения 30 лет. Эти виды облигаций выплачиваются только по истечении срока погашения, и нет никаких периодических возвратов или платежей. Это дается по приведенной ниже формуле.

Уравнение 6

где
PV = Приведенная стоимость
FV = Номинальная стоимость
i = процентная ставка
y = год погашения
t = интересующий период времени

Постановка задачи

  1. Рассчитать номинальную стоимость облигации на 12-й год
  2. Рассчитайте номинальную стоимость облигации на 12,5-м году, используя аппроксимацию рядов Тейлора.

Давайте начнем с перевода формулы из уравнения 6 в функцию Python.def current_value(face_value, maturity_year, interest_rate, t):
PV = face_value * np.exp(-interest_rate * (maturity_year-t))
return f’The value at {t}th year = {round(PV,4)}’

current_value(100,30,0.05, 12)

OUTPUT:
The value at 12th year = 40.657

Давайте теперь возьмем значение на 12-м году и попробуем аппроксимировать значение на 12,5-м году, используя приближение Тейлора.def taylor_approximation(face_value, interest_rate, maturity_year, t, num_terms):
# Initialize the approximation
approximation = 0.0

# Calculate the Taylor series expansion
for n in range(num_terms):
term = face_value*(-interest_rate * (maturity_year — t)) ** n / np.math.factorial(n)
approximation += term
return approximation

Приведенная выше функция является представлением уравнения 1 и представляет собой ряд Тейлора. Меняется только интересующий нас год, т.е. 12,5, для которого мы приближаемся.t = 12.5
num_terms = 6
result = taylor_approximation(face_value, interest_rate, maturity_year, t, num_terms)
print(«The value at the specified year = «, round(result,4))

OUTPUT:
The approximated value at the specified year = 41.6309

Воспользуемся формулой из уравнения 6 и вычислим фактическое значение.current_value(100,30,0.05, 12.5)

OUTPUT:
The value at 12.5th year = 41.6862

Основные выводы/наблюдения

  • Фактическое значение на 12-м году составляет 41,6862, а приблизительное значение с использованием ряда Тейлора составляет 41,6309, что более чем удовлетворительно.

Ограничения и рекомендации

Ниже приведены некоторые ограничения и указания, которые следует учитывать при работе с рядами Тейлора.

1. Ошибка аппроксимации
Точность аппроксимации зависит от поведения функции, особенно для сильно нелинейных функций, которые могут привести к ошибкам, которые могут повлиять на финансовые решения при использовании рядов Тейлора для финансовых расчетов.

2. Ограниченный срок действия
Ряд Тейлора наиболее эффективен при применении к ограниченному диапазону значений, так как он может привести к значительным неточностям при использовании слишком далеко от точки аппроксимации, особенно в финансовых моделях, имеющих дело с колеблющимися переменными.

3. Чувствительность к переменным
Небольшие изменения в переменных, таких как процентные ставки, могут оказать значительное влияние на результаты в финансах, причем ряд Тейлора чувствителен к этим изменениям. Анализ чувствительности имеет решающее значение для оценки влияния ошибок аппроксимации на финансовые решения.

4. Термины высшего порядка
Финансовые аналитики должны сбалансировать точность аппроксимаций рядов Тейлора со сложностью членов более высокого порядка, особенно при выполнении ручных вычислений, чтобы обеспечить наилучшее возможное использование этих членов.

5. Допущения и упрощения
Ряд Тейлора, финансовая модель, часто включает в себя допущения и упрощения, которые могут упростить расчеты, но не могут полностью охватить сложности реальных финансовых систем.

Заключение

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

Источник