Navigator
支付红利
- 支付已知红利:在期权的有效期的某些时刻的资产支付红利率
- 支付连续红利:在期权有效期所有时刻标的资产都支付红利
在支付已知红利的情况下,设前节点股价为
S
u
j
d
i
−
j
(
j
=
0
,
1
,
…
,
i
)
Su^jd^{i-j}(j=0,1,\dots, i)
Sujdi−j(j=0,1,…,i),在除息日之后,相应节点的股票价格调整为
S
(
1
−
δ
)
u
j
d
i
−
j
,
j
=
0
,
1
,
…
,
i
S(1-\delta)u^jd^{i-j}, j=0,1,\dots, i
S(1−δ)ujdi−j,j=0,1,…,i
如果在期权有效期内多次支付已知红利,设
δ
i
\delta_i
δi为0时刻至
i
Δ
t
i\Delta t
iΔt时刻之间所有除息日的总红利支付率,则
i
Δ
t
i\Delta t
iΔt时刻节点的股票价格为
S
(
1
−
δ
i
)
u
j
d
i
−
j
S(1-\delta_i)u^jd^{i-j}
S(1−δi)ujdi−j
code
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
double call_option_usa_dvd(
const double &S, // 标的资产价格
const double &X, // 行权价格
const double &r, // 无风险利率
const double &sigma, // 波动性
const double &time, // 权利期
const int &nsteps, // 二叉树步数
const vector<double> &dtimes, // 红利发生时间
const vector<double> &dyields // 红利率
){
int ndvds = dtimes.size();
if(!ndvds) return 0.00;
double delta_t = time/nsteps;
double R = exp(r*delta_t);
double Rinv = 1.0/R;
double u = exp(sigma*sqrt(delta_t));
double uu = u*u;
double d = 1.0/u;
double pUp = (R-d)/(u-d);
double pDown = 1.0-pUp;
vector<int> dvd_steps(ndvds);
for(int i=0; i<ndvds; ++i){
dvd_steps[i]=(int)(dtimes[i]/time*nsteps);
}
vector<double> prices(nsteps+1);
vector<double> call_prices(nsteps+1);
prices[0]=S*pow(d, nsteps);
for(int j=0; j<ndvds; ++j){
prices[0] *= (1.0-dyields[j]);
}
for(int k=1; k<=nsteps; ++k){
prices[k]=uu*prices[k-1];
}
for(int m=0; m<=nsteps; ++m) call_prices[m]=max(0.0, prices[m]-X);
for(int step=nsteps-1; step>=0; --step){
for(int i=0; i<ndvds; ++i){
if(step==dvd_steps[i]){
cout<<"红利率发生步数:"<<step<<endl;
for(int j=0; j<=(step+1); ++j){
prices[j]*=(1.0/(1.0-dyields[i]));
}
}
}
for(int n=0; n<=step; ++n){
call_prices[n]=(pDown*call_prices[n]+pUp*call_prices[n+1])*Rinv;
prices[n] = d*prices[n+1];
call_prices[n] = max(call_prices[n], prices[n]-X);
}
}
return call_prices[0];
}
int main(){
double S=100.0;
double X=100.0;
double r=0.1;
double sigma = 0.25;
double time = 1.0;
double nsteps = 100;
vector<double> dtimes; dtimes.push_back(0.25); dtimes.push_back(0.75);
vector<double> dyields; dyields.push_back(0.025); dyields.push_back(0.025);
cout<<"期权价格:"<<call_option_usa_dvd(S, X, r, sigma, time, nsteps, dtimes, dyields)<<endl;
return 0;
}
支付已知红利额条件下的美式期权定价
假设股票价格由不确定部分
S
∗
S^*
S∗和在权利期间所有未来红利额的现值组成,如果在期权有效期内只有一次红利发生,除息日为
τ
\tau
τ,且
k
Δ
t
≤
τ
≤
(
k
+
1
)
Δ
t
k\Delta t\leq \tau\leq (k+1)\Delta t
kΔt≤τ≤(k+1)Δt,在
x
x
x时刻,不确定部分价值为
S
∗
(
x
)
=
{
S
(
x
)
x
>
τ
S
(
x
)
−
D
e
−
r
(
τ
−
Δ
t
)
x
≤
τ
S^*(x)= \begin{cases} S(x) & x>\tau\\ S(x)-De^{-r(\tau-\Delta t)} & x\leq \tau \end{cases}
S∗(x)={S(x)S(x)−De−r(τ−Δt)x>τx≤τ
其中
D
D
D是红利额,
S
∗
S^*
S∗的标准差为
σ
∗
\sigma^*
σ∗,且
σ
∗
>
σ
\sigma^*>\sigma
σ∗>σ。在每个Node
上将未来红利额的现值加回到股票价格上,可以将
S
∗
S^*
S∗还原为
S
S
S的二叉树。
有限差分法
有限差分法主要包括内含有限差分法和外推有限差分法。基本思想是将衍生证券满足的偏微分方程转化为一系列近似差分方程,再使用迭代法求解这些差分方程,最后得到衍生证券的价格
∂
f
∂
t
+
r
∂
f
∂
S
S
+
1
2
∂
2
f
∂
S
2
σ
2
S
2
=
r
f
(1)
\frac{\partial f}{\partial t}+r\frac{\partial f}{\partial S}S+\frac{1}{2}\frac{\partial^2f}{\partial S^2}\sigma^2S^2=rf\tag{1}
∂t∂f+r∂S∂fS+21∂S2∂2fσ2S2=rf(1)
离散化时间节点得到序列
0
,
Δ
t
,
2
Δ
t
,
…
,
T
0, \Delta t, 2\Delta t, \dots, T
0,Δt,2Δt,…,T
离散化价格节点得到序列
0
,
Δ
S
,
2
Δ
S
,
…
,
S
max
0, \Delta S, 2\Delta S, \dots, S_{\max}
0,ΔS,2ΔS,…,Smax
构成一个
(
M
+
1
)
×
(
N
+
1
)
(M+1)\times (N+1)
(M+1)×(N+1)坐标点的方格,其中任意点
(
i
,
j
)
(i, j)
(i,j)对应的时间为
i
Δ
t
i\Delta t
iΔt,股票价格为
j
Δ
S
j\Delta S
jΔS. 令
f
i
j
f_{ij}
fij表示期权的价格,可以使用离散算子逼近
∂
f
∂
t
,
∂
f
∂
S
,
∂
2
f
∂
S
2
\frac{\partial f}{\partial t},\frac{\partial f}{\partial S}, \frac{\partial^2 f}{\partial S^2}
∂t∂f,∂S∂f,∂S2∂2f,将偏微分方程转化为离散方程。
内含有限差分法
在
i
Δ
t
i\Delta t
iΔt时刻的三个不同的期权价格
f
i
,
j
−
1
,
f
i
j
f_{i, j-1}, f_{ij}
fi,j−1,fij和
f
i
,
j
+
1
f_{i, j+1}
fi,j+1对应
(
i
+
1
)
Δ
t
(i+1)\Delta t
(i+1)Δt时刻的一个期权价格
f
i
+
1
,
j
f_{i+1, j}
fi+1,j,得到内含有限差分法表达式
a
j
f
i
,
j
−
1
+
b
j
f
i
j
+
c
j
f
i
,
j
+
1
=
f
i
+
1
,
j
a_jf_{i,j-1}+b_jf_{ij}+c_jf_{i, j+1}=f_{i+1, j}
ajfi,j−1+bjfij+cjfi,j+1=fi+1,j
其中
{
a
j
=
1
2
r
j
Δ
t
−
1
2
σ
2
j
2
Δ
t
b
j
=
1
+
σ
2
j
2
Δ
t
+
r
Δ
t
c
j
=
−
1
2
r
j
Δ
t
−
1
2
σ
2
j
2
Δ
t
\left\{ \begin{aligned} &a_j=\frac{1}{2}rj\Delta t-\frac{1}{2}\sigma^2j^2\Delta t\\ &b_j=1+\sigma^2j^2\Delta t+r\Delta t\\ &c_j=-\frac{1}{2}rj\Delta t-\frac{1}{2}\sigma^2j^2\Delta t \end{aligned} \right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧aj=21rjΔt−21σ2j2Δtbj=1+σ2j2Δt+rΔtcj=−21rjΔt−21σ2j2Δt
外推有限差分法
在
i
Δ
t
i\Delta t
iΔt时刻的一个期权价格
f
i
j
f_{ij}
fij对应着
(
i
+
1
)
Δ
t
(i+1)\Delta t
(i+1)Δt时刻的三个不同期权价格
f
i
+
1
,
j
+
1
,
f
i
+
1
,
j
,
f
i
+
1
,
j
−
1
f_{i+1, j+1}, f_{i+1, j}, f_{i+1, j-1}
fi+1,j+1,fi+1,j,fi+1,j−1,得到外推有限差分法表达式
a
j
f
i
,
j
−
1
+
b
j
f
i
j
+
c
j
f
i
,
j
+
1
=
f
i
+
1
,
j
a_jf_{i, j-1}+b_j f_{ij}+c_j f_{i, j+1}=f_{i+1, j}
ajfi,j−1+bjfij+cjfi,j+1=fi+1,j
其中
{
a
j
=
1
1
+
r
Δ
t
(
−
1
2
r
j
Δ
t
+
1
2
σ
2
j
2
Δ
t
)
b
j
=
1
1
+
r
Δ
t
(
1
−
σ
2
j
2
Δ
t
)
c
j
=
1
1
+
r
Δ
t
(
1
2
r
j
Δ
t
+
1
2
σ
2
j
2
Δ
t
)
\left\{ \begin{aligned} &a_j=\frac{1}{1+r\Delta t}(-\frac{1}{2}rj\Delta t+\frac{1}{2}\sigma^2j^2\Delta t)\\ &b_j=\frac{1}{1+r\Delta t}(1-\sigma^2 j^2\Delta t)\\ &c_j=\frac{1}{1+r\Delta t}(\frac{1}{2}rj\Delta t+\frac{1}{2}\sigma^2j^2\Delta t) \end{aligned} \right.
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧aj=1+rΔt1(−21rjΔt+21σ2j2Δt)bj=1+rΔt1(1−σ2j2Δt)cj=1+rΔt1(21rjΔt+21σ2j2Δt)
利率衍生证券
利率上限:为了保证浮动利率贷款的利率不超过某一利率水平,其保证贷款者在任何给定时刻所支付的贷款利率是市场当前利率与上限利率中的最小者。
利率下限:为了保证浮动利率不低于某一利率水平而设置的下限。
利率双限:为了使利率水平维持在某一区间而设置。
利率上限定价
利率上限可以看做基于浮动利率的看涨期权组合,设利率上限为
R
x
R_x
Rx,本金为
L
L
L,利率上限有效期开始在
τ
,
2
τ
,
…
,
n
τ
\tau, 2\tau, \dots, n\tau
τ,2τ,…,nτ时刻支付利息,则利率上限出售方在
k
+
1
k+1
k+1时刻需要支付的金额为
τ
L
max
{
R
k
−
R
x
,
0
}
\tau L\max\{R_k-R_x, 0\}
τLmax{Rk−Rx,0}
其中
R
k
R_k
Rk是
k
τ
k\tau
kτ时刻将被利率上限盯住的利率值,设
F
k
F_k
Fk是
k
τ
k\tau
kτ至
(
k
+
1
)
τ
(k+1)\tau
(k+1)τ时刻之间的远期利率,在
(
k
+
1
)
τ
(k+1)\tau
(k+1)τ时刻的支付等于在
k
τ
k\tau
kτ时刻的支付
τ
L
1
+
τ
F
k
max
{
R
k
−
R
x
,
0
}
\frac{\tau L}{1+\tau F_k}\max\{R_k-R_x, 0\}
1+τFkτLmax{Rk−Rx,0}
可以将利率上限看做是一个基于
τ
\tau
τ期间的欧式看涨期权,该期权的标的资产是远期利率
F
k
F_k
Fk,在到期日
τ
\tau
τ取得回报,期权的本金为
τ
L
/
(
1
+
τ
F
k
)
\tau L/(1+\tau F_k)
τL/(1+τFk),假设远期利率
F
k
F_k
Fk的标准差为
σ
F
\sigma_F
σF,则根据B-S期权定价公式,看涨期权的价格为
c
=
τ
L
1
+
τ
F
k
e
−
r
k
τ
[
F
k
N
(
d
1
)
−
R
x
N
(
d
2
)
]
c = \frac{\tau L}{1+\tau F_k}e^{-rk\tau}[F_kN(d_1)-R_x N(d_2)]
c=1+τFkτLe−rkτ[FkN(d1)−RxN(d2)]
其中
N
(
x
)
N(x)
N(x)是正态累积分布函数,且
{
d
1
=
ln
(
F
k
/
R
x
)
+
σ
F
2
k
τ
/
2
σ
F
k
τ
d
2
=
d
1
−
σ
F
k
τ
\begin{cases} d_1=\frac{\ln(F_k/R_x)+\sigma_F^2k\tau/2}{\sigma_F\sqrt{k\tau}}\\ d_2=d_1-\sigma_F\sqrt{k\tau} \end{cases}
{d1=σFkτ
ln(Fk/Rx)+σF2kτ/2d2=d1−σFkτ